From 4626ac56f8ac675da90b109459357807864326dd Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 14 Jan 2022 13:12:56 -0600 Subject: [PATCH 001/278] fixing issues when wallet is not connected --- src/App.tsx | 3 ++- src/components/Graph.tsx | 32 ++++++++++++++++---------------- src/utils/constants.tsx | 4 ++-- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 346ec00..8332591 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -526,10 +526,11 @@ const App = () => { } else { setLoading(true); const chainId = process.env.REACT_APP_NETWORK_ID || "4"; - const provider = getDefaultProvider(parseInt(chainId), NETWORKS.rinkeby.name); + const provider = getDefaultProvider(parseInt(chainId), NETWORKS.mainnet.name); const randomSigner = ethers.Wallet.createRandom().connect(provider); const ethcallProvider = new Provider(randomSigner.provider); setContracts(randomSigner, ethcallProvider, parseInt(chainId)); + setCurrentNetwork(parseInt(chainId), ""); setLoading(false); } } diff --git a/src/components/Graph.tsx b/src/components/Graph.tsx index 00af3fb..f058733 100644 --- a/src/components/Graph.tsx +++ b/src/components/Graph.tsx @@ -12,7 +12,7 @@ import { ReactComponent as StakeIcon } from "../assets/images/graph/stake.svg"; import { ReactComponent as H24Icon } from "../assets/images/graph/24h.svg"; import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; import { ReactComponent as WETHIcon } from "../assets/images/graph/weth.svg"; -import { ReactComponent as POLYGONIcon } from "../assets/images/graph/polygon3.svg"; +// import { ReactComponent as POLYGONIcon } from "../assets/images/graph/polygon3.svg"; import { ReactComponent as DAIIcon } from "../assets/images/graph/DAI.svg"; import { ReactComponent as AAVEIcon } from "../assets/images/graph/aave.svg"; import { ReactComponent as LINKIcon } from "../assets/images/graph/chainlink.svg"; @@ -31,7 +31,7 @@ const Graph = () => { const [ctxPrice, setCtxPrice] = useState("0.0"); const [ETHStake, setETHStake] = useState("0"); const [DAIStake, setDAIStake] = useState("0"); - const [MATICStake, setMATICStake] = useState("0"); + // const [MATICStake, setMATICStake] = useState("0"); const [aaveStake, setAaveStake] = useState("0"); const [linkStake, setLinkStake] = useState("0"); const [TotalStake, setTotalStake] = useState("0"); @@ -76,13 +76,13 @@ const Graph = () => { return valid; }; - const getMaticUSD = async () => { + /* const getMaticUSD = async () => { const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); // @ts-ignore const [maticOraclePrice] = await signer.ethcallProvider?.all([maticOraclePriceCall]); const maticUSD = ethers.utils.formatEther(maticOraclePrice.mul(10000000000)); return maticUSD; - }; + }; */ useEffect(() => { const load = async () => { @@ -143,7 +143,7 @@ const Graph = () => { let currentWETHStake = BigNumber.from(0); let currentAAVEStake = BigNumber.from(0); let currentLINKStake = BigNumber.from(0); - let currentMATICStake = BigNumber.from(0); + // const currentMATICStake = BigNumber.from(0); await data.states.forEach((s: any) => { const networkId = currentNetwork.chainId; @@ -181,9 +181,9 @@ const Graph = () => { currentLINKStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); break; // @ts-ignore - case contracts.MATICVaultHandler.address.toLowerCase(): + /* case contracts.MATICVaultHandler.address.toLowerCase(): currentMATICStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - break; + break; */ default: break; } @@ -197,14 +197,14 @@ const Graph = () => { setAaveStake(formatAAVE); const formatLINK = ethers.utils.formatEther(currentLINKStake); setLinkStake(formatLINK); - const formatMATIC = ethers.utils.formatEther(currentMATICStake); - setMATICStake(formatMATIC); + /* const formatMATIC = ethers.utils.formatEther(currentMATICStake); + setMATICStake(formatMATIC); */ const ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); const daiUSD = ethers.utils.formatEther(daiOraclePrice.mul(10000000000)); let aaveUSD = "0"; let linkUSD = "0"; - let maticUSD = "0"; + // let maticUSD = "0"; if ( currentNetwork.chainId === NETWORKS.mainnet.chainId || currentNetwork.chainId === NETWORKS.rinkeby.chainId @@ -212,16 +212,16 @@ const Graph = () => { aaveUSD = ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)); linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); } - if (currentNetwork.chainId === NETWORKS.polygon.chainId) { + /* if (currentNetwork.chainId === NETWORKS.polygon.chainId) { maticUSD = await getMaticUSD(); - } + } */ const totalUSD = toUSD(ethUSD, formatETH) + toUSD(daiUSD, formatDAI) + toUSD(aaveUSD, formatAAVE) + - toUSD(linkUSD, formatLINK) + - toUSD(maticUSD, formatMATIC); + toUSD(linkUSD, formatLINK); + // toUSD(maticUSD, formatMATIC); setTotalStake(totalUSD.toString()); setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); if (signer) { @@ -354,7 +354,7 @@ const Graph = () => { )} )} - {currentNetwork.chainId === NETWORKS.polygon.chainId && ( + {/* {currentNetwork.chainId === NETWORKS.polygon.chainId && (

Total Staked in MATIC

@@ -368,7 +368,7 @@ const Graph = () => { MATIC
- )} + )} */} ); diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 69f7661..c481002 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -55,8 +55,8 @@ export const GRAPHQL_ENDPOINT = { }; export const FEATURES = { - KEEPERS_API: false, - NEW_VAULTS: false, + KEEPERS_API: true, + NEW_VAULTS: true, OPTIMISM: false, POLYGON: false, }; From 550be843546359be631e13b79c2123f9640969ae Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 18 Jan 2022 13:36:21 -0600 Subject: [PATCH 002/278] crrypt keeper form search image fixed --- package.json | 3 +- src/components/Governance/KeeperForm.tsx | 112 +++++++++++++++++++---- src/styles/app.scss | 41 +++++++++ src/styles/delegators.scss | 19 ++++ src/styles/modal.scss | 12 ++- yarn.lock | 18 ++++ 6 files changed, 184 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index be610f1..708c3ad 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,8 @@ "typescript": "4.0.5", "walletlink": "^2.4.2", "web-vitals": "^0.2.4", - "web3modal": "^1.9.5" + "web3modal": "^1.9.5", + "compressorjs": "1.1.1" }, "devDependencies": { "@babel/core": "7.12.3", diff --git a/src/components/Governance/KeeperForm.tsx b/src/components/Governance/KeeperForm.tsx index 6569d7e..04fdd90 100644 --- a/src/components/Governance/KeeperForm.tsx +++ b/src/components/Governance/KeeperForm.tsx @@ -1,9 +1,13 @@ import React, { useEffect, useState } from "react"; import { Button, Form, Image } from "react-bootstrap"; +import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; +import Tooltip from "react-bootstrap/esm/Tooltip"; import Col from "react-bootstrap/esm/Col"; import Row from "react-bootstrap/esm/Row"; import { ethers } from "ethers"; import Modal from "react-bootstrap/esm/Modal"; +import Compressor from "compressorjs"; +import { ReactComponent as PlusIcon } from "../../assets/images/plus.svg"; import { ProfileImage } from "./common"; import "../../styles/modal.scss"; import { API_ENDPOINT } from "../../utils/constants"; @@ -26,6 +30,8 @@ type props = { refresh: () => void; }; +const MAX_IMAGE_SIZE = 100000; + const KeeperForm = ({ isNew, show, @@ -54,6 +60,7 @@ const KeeperForm = ({ const [image, setImage] = useState(null); const [imageUrl, setImageUrl] = useState(""); const [imageError, setImageError] = useState(""); + const [searchIconClass, setSearchIconClass] = useState("add-file-icon"); const cleanErrors = () => { setNameError(""); @@ -63,6 +70,7 @@ const KeeperForm = ({ setTwitterError(""); setDiscordError(""); setImageError(""); + setSearchIconClass("add-file-icon"); }; useEffect(() => { @@ -205,19 +213,33 @@ const KeeperForm = ({ return true; }; - const isImageValid = (value: File | null): boolean => { + const isImageFile = (value: File | null): boolean => { if (value === null) { if (isNew) { - setImageError("Image cannot be empty"); + setImageError("Image field cannot be empty."); + setSearchIconClass("add-file-icon error"); + if (image !== null) { + setImageUrl(""); + } } return !isNew; } if (value.type !== "image/png" && value.type !== "image/jpg" && value.type !== "image/jpeg") { - setImageError("Invalid file type"); + setImageError("Invalid file type, valid types are: png, jpg and jpeg."); + setSearchIconClass("add-file-icon error"); + setImageUrl(""); return false; } - if (value.size > 100000) { - setImageError("Image max size is 100 KB"); + return true; + }; + + const isImageSizeValid = (value: File): boolean => { + if (value.size > MAX_IMAGE_SIZE) { + const sizeKB = Math.round(value.size / 100); + setImageError( + `Image size should be less than 100 KB. Compressed image size is ${sizeKB} KB.` + ); + setSearchIconClass("add-file-icon error"); setImageUrl(""); return false; } @@ -225,6 +247,14 @@ const KeeperForm = ({ return true; }; + /* const isImageValid = (): boolean => { + if (isImageFile(image)) { + // @ts-ignore + return isImageSizeValid(image); + } + return false; + }; */ + const onChangeDelegatee = (event: React.ChangeEvent) => { setDelegatee(event.target.value); isValidKeeper(event.target.value); @@ -255,16 +285,45 @@ const KeeperForm = ({ isWhyValid(event.target.value); }; + const handleImageCompress = (img: File, q: number): void => { + /* eslint-disable no-new */ + new Compressor(img, { + quality: q, + maxWidth: 512, + maxHeight: 512, + minWidth: 180, + minHeight: 180, + width: 200, + // @ts-ignore + success: (result) => { + // Compressed image + const compressedImg = new File([result], img.name); + if (isImageSizeValid(compressedImg)) { + setImage(compressedImg); + setImageUrl(URL.createObjectURL(compressedImg)); + setSearchIconClass("add-file-icon"); + } + }, + }); + }; + const onChangeImage = (event: React.ChangeEvent) => { if (event.target.files !== null) { if (typeof event.target.files[0] !== "undefined") { - setImage(event.target.files[0]); - if (isImageValid(event.target.files[0])) { - setImageUrl(URL.createObjectURL(event.target.files[0])); + if (isImageFile(event.target.files[0])) { + const img = event.target.files[0]; + if (img.size > MAX_IMAGE_SIZE) { + setSearchIconClass("add-file-icon loading"); + handleImageCompress(img, 0.7); + } else { + setImageError(""); + setImage(img); + setImageUrl(URL.createObjectURL(img)); + } } } } else { - isImageValid(null); + isImageFile(null); } }; @@ -275,7 +334,7 @@ const KeeperForm = ({ isWhyValid(why) && isTwitterValid(twitter) && isDiscordValid(discord) && - isImageValid(image); + imageUrl !== ""; const saveKeeper = async () => { const formData = new FormData(); @@ -394,11 +453,33 @@ const KeeperForm = ({ {imageUrl !== "" ? ( ) : ( - + + {imageError} + + } + > + <> + + { + e.preventDefault(); + }} + className={searchIconClass} + > + + + + )} - {imageError} diff --git a/src/styles/app.scss b/src/styles/app.scss index 1901a35..94bc8fa 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -263,11 +263,52 @@ html, text-align: left; padding: 0.8rem; } +.farm-tooltip.error > .tooltip-inner { + border: 0.3px solid $orange; + color: #f4c9b1; +} form { .field-error { color: $orange; } + .add-file-icon { + svg { + background:rgba(142, 126, 155, 0.3); + color: rgba(209, 194, 239, 0.65); + border-radius: 50%; + width: 70px; + height: 70px; + } + } + .add-file-icon.loading { + svg { + border: 3px solid #f3f3f3; + border-radius: 50%; + border-top: 3px solid $green; + color: transparent; + width: 120px; + height: 120px; + -webkit-animation: spin 2s linear infinite; /* Safari */ + animation: spin 2s linear infinite; + } + } + .add-file-icon.error { + svg { + border: 3px solid $orange; + } + } +} + +/* Safari */ +@-webkit-keyframes spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } } #WEB3_CONNECT_MODAL_ID { diff --git a/src/styles/delegators.scss b/src/styles/delegators.scss index 9c52dd1..1fc61ab 100644 --- a/src/styles/delegators.scss +++ b/src/styles/delegators.scss @@ -88,6 +88,9 @@ .btn:focus { border: none; } + .btn:hover { + background-color: transparent; + } } } &-text { @@ -366,3 +369,19 @@ } } } + +.cryptkeeper-form { + .avatar { + border: 0.8px solid $green; + } + .add-file-icon { + svg { + background:rgba(0, 0, 0, 0.175); + border: 3px solid rgba(209, 194, 239, 0.65); + color: rgba(209, 194, 239, 0.65); + border-radius: 50%; + width: 120px; + height: 120px; + } + } +} diff --git a/src/styles/modal.scss b/src/styles/modal.scss index fda39d9..a1d4591 100644 --- a/src/styles/modal.scss +++ b/src/styles/modal.scss @@ -75,9 +75,11 @@ } .avatar { - height: 92%; - width: 80%; position: absolute; + height: 92%; + width: 65%; + margin-left: 20px; + cursor: pointer; } .image-group { @@ -91,7 +93,7 @@ } a { position: absolute; - margin-left: 20px; + margin-left: 35px; } } @@ -120,8 +122,10 @@ } input[type="file"] { background-color: $dark; - height: 90%; + height: 100%; width: 90%; + margin-left: 20px; + cursor: pointer; } .custom-file-label { border-color: $green; diff --git a/yarn.lock b/yarn.lock index 1f72161..4b73e2a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4307,6 +4307,11 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +blueimp-canvas-to-blob@^3.29.0: + version "3.29.0" + resolved "https://registry.yarnpkg.com/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.29.0.tgz#d965f06cb1a67fdae207a2be56683f55ef531466" + integrity sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg== + bn.js@4.11.6: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" @@ -5101,6 +5106,14 @@ compression@^1.7.4: safe-buffer "5.1.2" vary "~1.1.2" +compressorjs@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/compressorjs/-/compressorjs-1.1.1.tgz#54c147cf37fb38828b08c48646d0258d52faf050" + integrity sha512-SysRuUPfmUNoq+RviE0iMFVUmoX2q/x+7PkEPUmk6NGkd85hDrmvujx0Qtp8UCGA6KMe5kuodsylPQcNaLf60w== + dependencies: + blueimp-canvas-to-blob "^3.29.0" + is-blob "^2.1.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -8634,6 +8647,11 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-blob@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-blob/-/is-blob-2.1.0.tgz#e36cd82c90653f1e1b930f11baf9c64216a05385" + integrity sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw== + is-boolean-object@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" From 0c86717438e63b29b90a143d3dcf6525a6651740 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 18 Jan 2022 16:23:44 -0600 Subject: [PATCH 003/278] adding add icoon --- src/assets/images/plus.svg | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/assets/images/plus.svg diff --git a/src/assets/images/plus.svg b/src/assets/images/plus.svg new file mode 100644 index 0000000..fe2d74f --- /dev/null +++ b/src/assets/images/plus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 157bfcc2ad1da935b7527376089b061dc708e387 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 18 Jan 2022 19:47:54 -0600 Subject: [PATCH 004/278] improving welcome page loading --- src/App.tsx | 8 ++-- src/components/Welcome/Welcome.tsx | 72 ++++++++++++++++-------------- src/components/Welcome/index.tsx | 8 +++- 3 files changed, 50 insertions(+), 38 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 8332591..db554d7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -519,14 +519,16 @@ const App = () => { if (savedAlert) setShow(false); async function loadProvider() { if (web3Modal.cachedProvider && !signer.signer) { - // const networkProvider = if (!isLoading) { await web3Modal.connect(); } } else { setLoading(true); const chainId = process.env.REACT_APP_NETWORK_ID || "4"; - const provider = getDefaultProvider(parseInt(chainId), NETWORKS.mainnet.name); + const provider = getDefaultProvider( + parseInt(chainId), + chainId === "1" ? NETWORKS.mainnet.name : NETWORKS.rinkeby.name + ); const randomSigner = ethers.Wallet.createRandom().connect(provider); const ethcallProvider = new Provider(randomSigner.provider); setContracts(randomSigner, ethcallProvider, parseInt(chainId)); @@ -623,7 +625,7 @@ const App = () => { - + diff --git a/src/components/Welcome/Welcome.tsx b/src/components/Welcome/Welcome.tsx index f10f6b0..0d184c6 100644 --- a/src/components/Welcome/Welcome.tsx +++ b/src/components/Welcome/Welcome.tsx @@ -14,15 +14,20 @@ import SignerContext from "../../state/SignerContext"; import TokensContext from "../../state/TokensContext"; import OraclesContext from "../../state/OraclesContext"; import { Web3ModalContext } from "../../state/Web3ModalContext"; -import { makeShortAddress, getPriceInUSDFromPair, getENS } from "../../utils/utils"; +import { makeShortAddress, getPriceInUSDFromPair, getENS, isInLayer1 } from "../../utils/utils"; import "../../styles/welcome.scss"; import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; import { NETWORKS } from "../../utils/constants"; import Loading from "../Loading"; -const Welcome = () => { +type props = { + signerAddress: string; +}; + +const Welcome = ({ signerAddress }: props) => { const [address, setAddress] = useState(""); + const [currentAddress, setCurrentAddress] = useState(""); const [tcapBalance, setTcapBalance] = useState("0.0"); const [tcapUSDBalance, setTcapUSDBalance] = useState("0.0"); const [totalPrice, setTotalPrice] = useState("0.0"); @@ -50,43 +55,44 @@ const Welcome = () => { useEffect(() => { const loadAddress = async () => { if (signer.signer && tokens.tcapToken && oracles.tcapOracle && tokens.tcapTokenRead) { - const currentAddress = await signer.signer.getAddress(); - if (currentAddress !== address) { - const ens = await getENS(currentAddress); + if (signerAddress !== "" && signerAddress !== currentAddress) { + const ens = await getENS(signerAddress); if (ens) { setAddress(ens); } else { - setAddress(makeShortAddress(currentAddress)); + setAddress(makeShortAddress(signerAddress)); } - } - const currentTcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(currentAddress); - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - // @ts-ignore - const [currentTcapBalance, wethOraclePrice] = await signer.ethcallProvider?.all([ - currentTcapBalanceCall, - wethOraclePriceCall, - ]); - const tcapString = ethers.utils.formatEther(currentTcapBalance); - setTcapBalance(tcapString); - const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - if (currentNetwork.chainId === NETWORKS.mainnet.chainId) { - const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(currentAddress); - const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); + const currentTcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(signerAddress); + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); // @ts-ignore - const [currentCtxBalance, reservesCtxPool] = await signer.ethcallProvider?.all([ - currentCtxBalanceCall, - reservesCtxPoolCall, + const [currentTcapBalance, wethOraclePrice] = await signer.ethcallProvider?.all([ + currentTcapBalanceCall, + wethOraclePriceCall, ]); - const ctxString = ethers.utils.formatEther(currentCtxBalance); - setCtxBalance(ctxString); - const currentPriceCTX = await getPriceInUSDFromPair( - reservesCtxPool[0], - reservesCtxPool[1], - parseFloat(currentPriceETH) - ); - const ctxUSD = parseFloat(ctxString) * currentPriceCTX; - setCtxUSDBalance(ctxUSD.toString()); + const tcapString = ethers.utils.formatEther(currentTcapBalance); + setTcapBalance(tcapString); + const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + + if (isInLayer1(currentNetwork.chainId)) { + const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(signerAddress); + const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); + // @ts-ignore + const [currentCtxBalance, reservesCtxPool] = await signer.ethcallProvider?.all([ + currentCtxBalanceCall, + reservesCtxPoolCall, + ]); + const ctxString = ethers.utils.formatEther(currentCtxBalance); + setCtxBalance(ctxString); + const currentPriceCTX = await getPriceInUSDFromPair( + reservesCtxPool[0], + reservesCtxPool[1], + parseFloat(currentPriceETH) + ); + const ctxUSD = parseFloat(ctxString) * currentPriceCTX; + setCtxUSDBalance(ctxUSD.toString()); + } + setCurrentAddress(signerAddress); } } if (data) { @@ -106,7 +112,7 @@ const Welcome = () => { loadAddress(); // eslint-disable-next-line - }, [tcapUSDBalance, data, isLoading, address]); + }, [signerAddress, tcapUSDBalance, data]); if (isLoading) { return ; diff --git a/src/components/Welcome/index.tsx b/src/components/Welcome/index.tsx index acb13aa..7a5c4a4 100644 --- a/src/components/Welcome/index.tsx +++ b/src/components/Welcome/index.tsx @@ -10,7 +10,11 @@ const clientOracle = (graphqlEndpoint: string) => cache: new InMemoryCache(), }); -const Wrapper = () => { +type props = { + signerAddress: string; +}; + +const Wrapper = ({ signerAddress }: props) => { const currentNetwork = useContext(NetworkContext); const [apolloClient, setApolloClient] = useState( clientOracle( @@ -40,7 +44,7 @@ const Wrapper = () => { return ( - + ); }; From 83efb021e9a92307eb0998510167f8a6cbac72c9 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 19 Jan 2022 09:45:07 -0600 Subject: [PATCH 005/278] fixed bug displaying token balance on vaults --- src/components/Vault/Details.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index 74c8a30..ff58d5c 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -244,7 +244,7 @@ const Details = ({ address }: props) => { let balance; const provider = getDefaultProvider( currentNetwork.chainId || NETWORKS.rinkeby.chainId, - NETWORKS.rinkeby.name + currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.rinkeby.name ); switch (vaultType) { case "ETH": { From f8a4e3a630c9fb72d20064ffd9d5f2657947f5a5 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 20 Jan 2022 13:22:49 -0600 Subject: [PATCH 006/278] welome and vault page structure done --- package.json | 3 + src/App.tsx | 109 +++++++++++++++-------------- src/components/Vault/Details.tsx | 81 ++++++++++----------- src/components/Vault/Vault.tsx | 15 ++-- src/components/Welcome/Welcome.tsx | 44 ++++++------ yarn.lock | 46 +++++++++++- 6 files changed, 169 insertions(+), 129 deletions(-) diff --git a/package.json b/package.json index be610f1..500cf3d 100644 --- a/package.json +++ b/package.json @@ -23,10 +23,13 @@ "ethers-multicall": "^0.2.1", "fortmatic": "^2.2.1", "graphql": "^15.4.0", + "i18next": "^21.6.6", + "i18next-http-backend": "^1.3.1", "node-sass": "^4.14.1", "react": "^17.0.1", "react-bootstrap": "^1.4.0", "react-dom": "^17.0.1", + "react-i18next": "^11.15.3", "react-icons": "^4.3.1", "react-number-format": "^4.4.1", "react-router-dom": "^5.2.0", diff --git a/src/App.tsx b/src/App.tsx index db554d7..176c6fb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,10 +1,11 @@ /* eslint-disable prefer-destructuring */ -import React, { useState, useContext, useEffect } from "react"; +import React, { Suspense, useState, useContext, useEffect } from "react"; import { Switch, Route, useRouteMatch, useLocation } from "react-router-dom"; import { ethers } from "ethers"; import { Provider, Contract, setMulticallAddress } from "ethers-multicall"; import { ToastContainer } from "react-toastify"; import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; +import "./i18n"; import "react-toastify/dist/ReactToastify.css"; import "./styles/toast.scss"; import { useSwipeable } from "react-swipeable"; @@ -594,58 +595,62 @@ const App = () => { setShowSidebar={setShowSidebar} isMobile={isMobile} /> - - {show && ( - { - setShow(false); - localStorage.setItem("alert", "false"); - }} - dismissible - > - 💀 This project is in beta. Use at your own risk. - - )} - {vaultWarning && location.pathname === "/vault" && ( - { - setVaultWarning(false); - localStorage.setItem("alert", "false"); - }} - dismissible - > - - ⚠️ Make sure to always have a ratio above the minimum ratio to avoid - getting liquidated. - - - )} - -
- - - - - - - - + } + > + + {show && ( + { + setShow(false); + localStorage.setItem("alert", "false"); + }} + dismissible + > + 💀 This project is in beta. Use at your own risk. + + )} + {vaultWarning && location.pathname === "/vault" && ( + { + setVaultWarning(false); + localStorage.setItem("alert", "false"); + }} + dismissible + > + + ⚠️ Make sure to always have a ratio above the minimum ratio to avoid + getting liquidated. + + + )} + +
+ + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index ff58d5c..ed0c9c0 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -44,11 +44,12 @@ import { FEATURES, NETWORKS } from "../../utils/constants"; type props = { address: string; + t: any; }; // TODO: Vault doesn't show if approve is 0 even if there is data in the vault -const Details = ({ address }: props) => { +const Details = ({ address, t }: props) => { const currentNetwork = useContext(NetworkContext); const oracles = useContext(OraclesContext); const tokens = useContext(TokensContext); @@ -107,10 +108,8 @@ const Details = ({ address }: props) => { } // Actions - const [title, setTitle] = useState("Create Vault"); - const [text, setText] = useState( - "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens." - ); + const [title, setTitle] = useState(t("vault.create")); + const [text, setText] = useState(t("vault.create-text")); const [isApproved, setIsApproved] = useState(false); const [isLoading, setIsLoading] = useState(true); @@ -405,10 +404,8 @@ const Details = ({ address }: props) => { const usdTCAP = toUSD(currentTCAPPriceFormat, parsedDebt); setVaultDebtUSD(usdTCAP.toString()); } else { - setText( - "Vault not approved. Please approve your collateral to start minting TCAP tokens." - ); - setTitle("Approve Vault"); + setText(t("vault.approve-text")); + setTitle(t("vault.approve")); setIsApproved(false); } } else { @@ -425,10 +422,8 @@ const Details = ({ address }: props) => { currentPrice = ethers.utils.formatEther(currentPriceVal.mul(10000000000)); setSelectedVaultId("0"); - setText( - "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens." - ); - setTitle("Create Vault"); + setText(t("vault.create-text")); + setTitle(t("vault.create")); setIsApproved(false); } @@ -500,16 +495,16 @@ const Details = ({ address }: props) => { } if (r === 0) { - setVaultStatus("N/A"); + setVaultStatus(t("vault.status.na")); } else if (r >= parseFloat(minRatio) + 50) { - setVaultStatus("safe"); + setVaultStatus(t("vault.status.safe")); } else if (r >= parseFloat(minRatio) + 30) { - setVaultStatus("warning"); + setVaultStatus(t("vault.status.warning")); } else if (r >= parseFloat(minRatio)) { - setVaultStatus("danger"); + setVaultStatus(t("vault.status.danger")); } else { setVaultRatio("0"); - setVaultStatus("error"); + setVaultStatus(t("vault.status.error")); } }; @@ -635,15 +630,15 @@ const Details = ({ address }: props) => { } catch (error) { console.error(error); if (error.code === 4001) { - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } else { - errorNotification("Insufficient funds to stake"); + errorNotification(t("vault.errors.no-funds")); } } setAddCollateralTxt(""); setAddCollateralUSD("0"); } else { - errorNotification("Field can't be empty"); + errorNotification(t("errors.empty")); } }; @@ -691,15 +686,15 @@ const Details = ({ address }: props) => { } catch (error) { console.error(error); if (error.code === 4001) { - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } else { - errorNotification("Not enough collateral on vault"); + errorNotification(t("vault.errors.tran-rejected")); } } setRemoveCollateralTxt(""); setRemoveCollateralUSD("0"); } else { - errorNotification("Field can't be empty"); + errorNotification(t("errors.empty")); } }; @@ -734,15 +729,15 @@ const Details = ({ address }: props) => { } catch (error) { console.error(error); if (error.code === 4001) { - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } else { - errorNotification("Not enough collateral on vault"); + errorNotification(t("vault.errors.no-collateral")); } } setMintTxt(""); setMintUSD("0"); } else { - errorNotification("Field can't be empty"); + errorNotification(t("errors.empty")); } }; @@ -781,16 +776,16 @@ const Details = ({ address }: props) => { } catch (error) { console.error(error); if (error.code === 4001) { - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } else { - errorNotification("Burn value too high"); + errorNotification(t("vault.errors.burn-too-high")); } } setBurnTxt(""); setBurnUSD("0"); setBurnFee("0"); } else { - errorNotification("Field can't be empty"); + errorNotification(t("errors.empty")); } }; @@ -881,14 +876,14 @@ const Details = ({ address }: props) => { if (isLoading) { return (
- +
); } return ( <> -

Select your Collateral

+

{t("vault.subtitle1")}

{(() => { switch (selectedVault) { @@ -958,7 +953,7 @@ const Details = ({ address }: props) => { } })()}
-

{selectedVault} Balance

+

{t("vault.balance-title", { vault: selectedVault })}

{(() => { @@ -1001,14 +996,12 @@ const Details = ({ address }: props) => {
-

Vault Ratio

{" "} +

{t("vault.ratio-title")}

{" "} - Ratio must be {`>`} {minRatio}% or you will be liquidated - + {t("vault.ratio-warning", { minRatio })} } > @@ -1034,7 +1027,7 @@ const Details = ({ address }: props) => {
-

Staked Collateral

+

{t("vault.collateral.title")}

{(() => { @@ -1075,7 +1068,7 @@ const Details = ({ address }: props) => {
- Add Collateral + {t("vault.collateral.add")} MAX @@ -1107,7 +1100,7 @@ const Details = ({ address }: props) => { - Remove Collateral + {t("vault.collateral.remove")} MAX SAFE @@ -1144,7 +1137,7 @@ const Details = ({ address }: props) => {
-

Vault Debt

+

{t("vault.debt.title")}

@@ -1172,7 +1165,7 @@ const Details = ({ address }: props) => {
- Mint TCAP + {t("vault.debt.mint")}
MAX SAFE @@ -1204,7 +1197,7 @@ const Details = ({ address }: props) => { - Burn TCAP + {t("vault.debt.burn")} MAX @@ -1235,7 +1228,7 @@ const Details = ({ address }: props) => { /> - Burn Fee:{" "} + {t("vault.debt.fee")}:{" "} { + const { t } = useTranslation(); const web3Modal = useContext(Web3ModalContext); const signer = useContext(SignerContext); @@ -36,25 +38,22 @@ const Vault = () => { return (
-

The Vault

+

{t("vault.title1")}

{!signer.signer ? (
-
Connect Wallet
-

- No wallet connected. Please Connect your wallet to Create a Vault and approve your - collateral to start minting TCAP tokens. -

+
{t("connect")}
+

{t("vault.no-connected")}

) : ( -
+
)}
diff --git a/src/components/Welcome/Welcome.tsx b/src/components/Welcome/Welcome.tsx index 0d184c6..5614b98 100644 --- a/src/components/Welcome/Welcome.tsx +++ b/src/components/Welcome/Welcome.tsx @@ -5,6 +5,7 @@ import Col from "react-bootstrap/esm/Col"; import Row from "react-bootstrap/esm/Row"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; +import { useTranslation } from "react-i18next"; import { ethers, BigNumber } from "ethers"; import NumberFormat from "react-number-format"; import { useHistory } from "react-router-dom"; @@ -26,6 +27,7 @@ type props = { }; const Welcome = ({ signerAddress }: props) => { + const { t } = useTranslation(); const [address, setAddress] = useState(""); const [currentAddress, setCurrentAddress] = useState(""); const [tcapBalance, setTcapBalance] = useState("0.0"); @@ -134,15 +136,11 @@ const Welcome = ({ signerAddress }: props) => { />

- Total Cryptocurrency Market Capitalization + {t("welcome.tcap")} - Total Crypto Market Capitalization is updated on-chain on every 1% movement - - } + overlay={{t("welcome.tcap-info")}} >

-

TCAP Balance

+

{t("welcome.tcap-balance")}

{(currentNetwork.chainId === NETWORKS.mainnet.chainId || currentNetwork.chainId === NETWORKS.rinkeby.chainId) && ( @@ -229,7 +227,7 @@ const Welcome = ({ signerAddress }: props) => {

-

CTX Balance

+

{t("welcome.ctx-balance")}

)} @@ -237,8 +235,8 @@ const Welcome = ({ signerAddress }: props) => { ) : (
-

Connect Your Account

-

Mint TCAP,or check your balance connecting your account

+

{t("welcome.title3")}

+

{t("welcome.subtitle3")}

@@ -250,7 +248,7 @@ const Welcome = ({ signerAddress }: props) => { web3Modal.toggleModal(); }} > - Connect Wallet + {t("connect")} @@ -259,8 +257,8 @@ const Welcome = ({ signerAddress }: props) => { -

Use TCAP

-

Trade TCAP using SushiSwap or create new supply using a vault

+

{t("welcome.title2")}

+

{t("welcome.subtitle2")}

{address !== "" ? ( ) : ( )} @@ -302,11 +300,11 @@ const Welcome = ({ signerAddress }: props) => { history.push("/pools"); }} > - Pool + {t("pool")} ) : ( )} {address !== "" ? ( @@ -317,11 +315,11 @@ const Welcome = ({ signerAddress }: props) => { history.push("/farm"); }} > - Farm + {t("farm")} ) : ( )} diff --git a/yarn.lock b/yarn.lock index 1f72161..9d3aa03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1123,7 +1123,7 @@ core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.16.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== @@ -5296,6 +5296,13 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-fetch@3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== + dependencies: + node-fetch "2.6.1" + cross-fetch@^2.1.0, cross-fetch@^2.1.1: version "2.2.5" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.5.tgz#afaf5729f3b6c78d89c9296115c9f142541a5705" @@ -8219,7 +8226,7 @@ html-entities@^1.2.1, html-entities@^1.3.1: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== -html-escaper@^2.0.0: +html-escaper@^2.0.0, html-escaper@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== @@ -8237,6 +8244,13 @@ html-minifier-terser@^5.0.1: relateurl "^0.2.7" terser "^4.6.3" +html-parse-stringify@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== + dependencies: + void-elements "3.1.0" + html-webpack-plugin@4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" @@ -8358,6 +8372,20 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +i18next-http-backend@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/i18next-http-backend/-/i18next-http-backend-1.3.1.tgz#c1175aaead22b62a70bdb556b794fef1ba558b3a" + integrity sha512-o79n4GBBRpl20hByC+ne/S1UaSZ4iGAn59Hu2TEZGjN0WLB72L7WrM39Cshziyrssp6MQfdI8wjToU2Q6kpSvA== + dependencies: + cross-fetch "3.1.4" + +i18next@^21.6.6: + version "21.6.6" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-21.6.6.tgz#65db9a32e4746d145b3ab3f12c59fc02ad7b5101" + integrity sha512-K1Pw8K+nHVco56PO6UrqNq4K/ZVbb2eqBQwPqmzYDm4tGQYXBjdz8jrnvuNvV5STaE8oGpWKQMxHOvh2zhVE7Q== + dependencies: + "@babel/runtime" "^7.12.0" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -12615,6 +12643,15 @@ react-error-overlay@^6.0.9: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.10.tgz#0fe26db4fa85d9dbb8624729580e90e7159a59a6" integrity sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA== +react-i18next@^11.15.3: + version "11.15.3" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.15.3.tgz#7608fb3cacc02ac75a62fc2d68b579f140b198dd" + integrity sha512-RSUEM4So3Tu2JHV0JsZ5Yje+4nz66YViMfPZoywxOy0xyn3L7tE2CHvJ7Y9LUsrTU7vGmZ5bwb8PpjnkatdIxg== + dependencies: + "@babel/runtime" "^7.14.5" + html-escaper "^2.0.2" + html-parse-stringify "^3.0.1" + react-icons@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.3.1.tgz#2fa92aebbbc71f43d2db2ed1aed07361124e91ca" @@ -15241,6 +15278,11 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" From d316e92a671832bccd49ae2b6ff2b600ca892671 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 20 Jan 2022 13:23:38 -0600 Subject: [PATCH 007/278] adding locales files --- public/locales/en/translation.json | 63 ++++++++++++++++++++++++++++++ public/locales/es/translation.json | 63 ++++++++++++++++++++++++++++++ src/i18n.js | 23 +++++++++++ 3 files changed, 149 insertions(+) create mode 100644 public/locales/en/translation.json create mode 100644 public/locales/es/translation.json create mode 100644 src/i18n.js diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json new file mode 100644 index 0000000..abfc562 --- /dev/null +++ b/public/locales/en/translation.json @@ -0,0 +1,63 @@ +{ + "connect": "Connect Wallet", + "trade": "Trade", + "Mint": "Mint", + "Pool": "Pool", + "Farm": "Farm", + "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "wait": "Please wait...", + "welcome": { + "tcap": "Total Cryptocurrency Market Capitalization", + "tcap-token": "Total Cryptocurrency Market Capitalization Token", + "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", + "title1": "My Total Balance", + "subtitle1": "Connected Account", + "title2": "Use TCAP", + "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "title3": "Connect Your Account", + "subtitle3": "Mint TCAP, or check your balance connecting your account", + "tcap-balance": "TCAP Balance", + "ctx-balance": "CTX Balance" + }, + "vault": { + "warning": "", + "loading": "Loading Vault", + "title1": "The Vault", + "subtitle1": "Select your Collateral", + "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", + "approve": "Approve Vault", + "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", + "create": "Create Vault", + "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", + "balance-title": "{{vault}} Balance", + "ratio-title": "Vault Ratio", + "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "collateral": { + "title": "Staked Collateral", + "add": "Add Collateral", + "remove": "Remove Collateral" + }, + "debt": { + "title": "Vault Debt", + "mint": "Mint TCAP", + "burn": "Burn TCAP", + "fee": "Burn Fee" + }, + "status": { + "na": "N/A", + "safe": "safe", + "warning": "warning", + "danger": "danger", + "error": "error" + }, + "errors": { + "no-funds": "Insufficient funds to stake", + "no-collateral": "Not enough collateral on vault", + "burn-too-high": "Burn value too high" + } + }, + "errors": { + "tran-rejected": "Transaction rejected", + "empty": "Field can't be empty" + } +} \ No newline at end of file diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json new file mode 100644 index 0000000..aeeec1e --- /dev/null +++ b/public/locales/es/translation.json @@ -0,0 +1,63 @@ +{ + "connect": "Conectar Billetera", + "trade": "Cambiar", + "Mint": "Mint", + "Pool": "Pool", + "Farm": "Farm", + "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "wait": "Please wait...", + "welcome": { + "tcap": "Capitalización total del mercado de criptomonedas", + "tcap-token": "Token de capitalización total del mercado de criptomonedas", + "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", + "title1": "Mi Balance Total", + "subtitle1": "Cuenta conectada", + "title2": "Usar TCAP", + "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "title3": "Conecta tu cuenta", + "subtitle3": "Mint TCAP, or check your balance connecting your account", + "tcap-balance": "Balance de TCAP", + "ctx-balance": "Balance de CTX" + }, + "vault": { + "warning": "", + "loading": "Cargando Baúl", + "title1": "El Baúl", + "subtitle1": "Seleccione su colateral", + "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", + "approve": "Aprobar Baúl", + "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", + "create": "Crear Baúl", + "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", + "balance-title": "{{vault}} Balance", + "ratio-title": "Vault Ratio", + "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "collateral": { + "title": "Staked Collateral", + "add": "Add Collateral", + "remove": "Remove Collateral" + }, + "debt": { + "title": "Vault Debt", + "mint": "Mint TCAP", + "burn": "Burn TCAP", + "fee": "Burn Fee" + }, + "status": { + "na": "N/A", + "safe": "safe", + "warning": "warning", + "danger": "danger", + "error": "error" + }, + "errors": { + "no-funds": "Insufficient funds to stake", + "no-collateral": "Not enough collateral on vault", + "burn-too-high": "Burn value too high" + } + }, + "errors": { + "tran-rejected": "Transaction rejected", + "empty": "Campo no puede estar vacío" + } +} \ No newline at end of file diff --git a/src/i18n.js b/src/i18n.js new file mode 100644 index 0000000..704aa40 --- /dev/null +++ b/src/i18n.js @@ -0,0 +1,23 @@ +import i18n from "i18next"; +import Backend from "i18next-http-backend"; +import { initReactI18next } from "react-i18next"; + +i18n + // load translation using http -> see /public/locales + // learn more: https://github.com/i18next/i18next-http-backend + .use(Backend) + // pass the i18n instance to react-i18next. + .use(initReactI18next) + // init i18next + // for all options read: https://www.i18next.com/overview/configuration-options + .init({ + fallbackLng: "es", + lng: "es", + debug: true, + + interpolation: { + escapeValue: false, // not needed for react as it escapes by default + }, + }); + +export default i18n; From 11f539ca847061acf6c758c5afb46b034bdd9649 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 20 Jan 2022 20:54:09 -0600 Subject: [PATCH 008/278] finished locale structure --- public/locales/en/translation.json | 115 ++++++++++++++++-- public/locales/es/translation.json | 138 ++++++++++++++++++---- src/components/Farm.tsx | 61 +++++----- src/components/Governance/Delegate.tsx | 31 ++--- src/components/Governance/Delegators.tsx | 9 +- src/components/Governance/KeeperForm.tsx | 60 +++++----- src/components/Governance/ProfileCard.tsx | 20 ++-- src/components/Governance/StakerStats.tsx | 19 +-- src/components/Governance/Withdraw.tsx | 25 ++-- src/components/Graph.tsx | 20 ++-- src/components/Pool.tsx | 18 +-- src/components/Vault/Details.tsx | 2 +- src/components/modals/ChangeNetwork.tsx | 4 +- src/components/modals/Stake.tsx | 24 ++-- src/i18n.js | 4 +- src/utils/constants.tsx | 6 +- src/utils/utils.tsx | 1 - 17 files changed, 388 insertions(+), 169 deletions(-) diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index abfc562..9e37653 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -1,11 +1,38 @@ { + "balance": "Balance", + "balance2": "Current Balance", + "choose-network": "Choose Network", + "claim": "Claim", + "click-copy": "Click to Copy", "connect": "Connect Wallet", - "trade": "Trade", - "Mint": "Mint", - "Pool": "Pool", - "Farm": "Farm", + "contract": "Contract", + "create": "Create", + "description": "Description", + "exit": "Exit", + "farm": "Farm", + "history": "History", + "inactive": "Inative", + "infinite-approve": "Infinite Approve", + "max": "MAX", + "max-safe": "MAX SAFE", + "mint": "Mint", + "last": "Last", + "loading": "Loading", + "pool": "Pool", + "stake": "Stake", + "stake2": "Amount to Stake", + "staked": "Staked", + "token": "Token", + "tokens": "Tokens", + "trade": "Trade", + "tran-sent": "⏰ Transaction Sent!", + "tran-confirmed": "✔️ Transaction Confirmed!", + "tran-wait": "Plz wait for the transaction confirmation.", + "tran-wait2": "All set, please wait for another confirmation", + "update": "Update", "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", - "wait": "Please wait...", + "votes": "Votes", + "wait": "Please wait...", "welcome": { "tcap": "Total Cryptocurrency Market Capitalization", "tcap-token": "Total Cryptocurrency Market Capitalization Token", @@ -51,13 +78,87 @@ "error": "error" }, "errors": { - "no-funds": "Insufficient funds to stake", "no-collateral": "Not enough collateral on vault", "burn-too-high": "Burn value too high" } }, + "pools": { + "pools": "Pools", + "enabled": "Enabled Pools", + "available": "Available Pools", + "liquidity": "Liquidity" + }, + "farming": { + "farming": "Farming", + "minting": "Minting Rewards", + "current-mint": "Current mint", + "current-reward": "Current Reward", + "liquidity": "Liquidity Rewards", + "unlocked": "Unlocked Reward", + "locked": "Locked Reward", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", + "unlocked-info": "Available to claim immediately.", + "locked-info": "Rewards are unlocked 6 months after the start of the pool." + }, + "governance": { + "amount-stake": "Amount to Stake", + "amount-remove": "Amount to Remove", + "new": "New Crypt Keeper", + "respresented": "Represented", + "stake-reward": "Stake Reward", + "staked-reward": "Staked Reward", + "why-me": "Why me?", + "expertise": "Expertise", + "delegate-to": "Delegate to Keeper", + "delegating": "Delegating", + "stake-delegate": "Stake & Delegate", + "stake-info": "Stake and Delegate CTX to this Crypt Keeper. Each time you Stake and Delegate, you must wait a minimum of 7 days before you can withdraw.", + "stake-info2": "Approve delegating CTX tokens. You only have to do this once.", + "withdraw": "Withdraw", + "withdrawing": "Withdrawing", + "withdraw-info": "Remove delegated votes from this Crypt Keeper. CTX must be staked and delegated for a minimum of 7 days before you are eligible to withdraw.", + "withdraw-info2": "* Eligible to withdraw on {{date}}", + "form": { + "create": "Create Crypt Keeper", + "keeper": "Keeper eth name or address", + "name": "Name" + }, + "success": { + "title": "Crypt. Keepers", + "message": "Crypt Keeper updated" + }, + "errors": { + "creating-keeper": "Error creating keeper.", + "exists": "Crypt Keeper for the address already exists.", + "invalid-amount": "Invalid amount to withdraw", + "invalid-ens-address": "Please enter a valid eth name or address", + "invalid-twitter": "It is not a valid twitter username", + "invalid-discord": "It is not a valid discord id", + "need-to-wait": "Need to wait the minimum staking period", + "too-long": "Field is too long ({{max}} characters max)" + } + }, + "graph": { + "staked-usd": "Total Staked in USD", + "staked-eth": "Total Staked in ETH", + "staked-dai": "Total Staked in DAI", + "staked-aave": "Total Staked in AAVE", + "staked-link": "Total Staked in LINK", + "staked-matic": "Total Staked in MATIC", + "total-supply": "Total Supply", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price" + }, "errors": { + "empty": "Field can't be empty", + "invalid-address": "Please enter a valid address", + "invalid-ens": "Please enter a valid ENS name", + "invalid-file-type": "Invalid file type.", + "invalid-image-size": "Image max size is {{size}} KB", + "no-ctx": "Not enough CTX balance.", + "no-funds": "Insufficient funds to stake", + "not-approve": "Token not Approved", "tran-rejected": "Transaction rejected", - "empty": "Field can't be empty" + "unexpected": "Unexpected error" } } \ No newline at end of file diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index aeeec1e..c36efa7 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -1,33 +1,55 @@ { - "connect": "Conectar Billetera", - "trade": "Cambiar", - "Mint": "Mint", - "Pool": "Pool", - "Farm": "Farm", + "balance": "Balance", + "balance2": "Current Balance", + "choose-network": "Choose Network", + "claim": "Claim", + "click-copy": "Click to Copy", + "connect": "Connect Wallet", + "contract": "Contract", + "create": "Create", + "description": "Description", + "exit": "Exit", + "farm": "Farm", + "history": "History", + "inactive": "Inative", + "infinite-approve": "Infinite Approve", + "max": "MAX", + "mint": "Mint", + "last": "Last", + "loading": "Loading", + "pool": "Pool", + "stake": "Stake", + "stake2": "Amount to Stake", + "staked": "Staked", + "token": "Token", + "tokens": "Tokens", + "trade": "Trade", + "update": "Update", "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", - "wait": "Please wait...", + "votes": "Votes", + "wait": "Please wait...", "welcome": { - "tcap": "Capitalización total del mercado de criptomonedas", - "tcap-token": "Token de capitalización total del mercado de criptomonedas", + "tcap": "Total Cryptocurrency Market Capitalization", + "tcap-token": "Total Cryptocurrency Market Capitalization Token", "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", - "title1": "Mi Balance Total", - "subtitle1": "Cuenta conectada", - "title2": "Usar TCAP", + "title1": "My Total Balance", + "subtitle1": "Connected Account", + "title2": "Use TCAP", "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", - "title3": "Conecta tu cuenta", + "title3": "Connect Your Account", "subtitle3": "Mint TCAP, or check your balance connecting your account", - "tcap-balance": "Balance de TCAP", - "ctx-balance": "Balance de CTX" + "tcap-balance": "TCAP Balance", + "ctx-balance": "CTX Balance" }, "vault": { "warning": "", - "loading": "Cargando Baúl", - "title1": "El Baúl", - "subtitle1": "Seleccione su colateral", + "loading": "Loading Vault", + "title1": "The Vault", + "subtitle1": "Select your Collateral", "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", - "approve": "Aprobar Baúl", + "approve": "Approve Vault", "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", - "create": "Crear Baúl", + "create": "Create Vault", "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", @@ -51,13 +73,87 @@ "error": "error" }, "errors": { - "no-funds": "Insufficient funds to stake", "no-collateral": "Not enough collateral on vault", "burn-too-high": "Burn value too high" } }, + "pools": { + "pools": "Pools", + "enabled": "Enabled Pools", + "available": "Available Pools", + "liquidity": "Liquidity" + }, + "farming": { + "farming": "Farming", + "minting": "Minting Rewards", + "current-mint": "Current mint", + "current-reward": "Current Reward", + "liquidity": "Liquidity Rewards", + "unlocked": "Unlocked Reward", + "locked": "Locked Reward", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", + "unlocked-info": "Available to claim immediately.", + "locked-info": "Rewards are unlocked 6 months after the start of the pool." + }, + "governance": { + "amount-stake": "Amount to Stake", + "amount-remove": "Amount to Remove", + "new": "New Crypt Keeper", + "respresented": "Represented", + "stake-reward": "Stake Reward", + "staked-reward": "Staked Reward", + "why-me": "Why me?", + "expertise": "Expertise", + "delegate-to": "Delegate to Keeper", + "delegating": "Delegating", + "stake-delegate": "Stake & Delegate", + "stake-info": "Stake and Delegate CTX to this Crypt Keeper. Each time you Stake and Delegate, you must wait a minimum of 7 days before you can withdraw.", + "stake-info2": "Approve delegating CTX tokens. You only have to do this once.", + "withdraw": "Withdraw", + "withdrawing": "Withdrawing", + "withdraw-info": "Remove delegated votes from this Crypt Keeper. CTX must be staked and delegated for a minimum of 7 days before you are eligible to withdraw.", + "withdraw-info2": "* Eligible to withdraw on {{date}}", + "form": { + "create": "Create Crypt Keeper", + "keeper": "Keeper eth name or address", + "name": "Name" + }, + "success": { + "title": "Crypt. Keepers", + "message": "Crypt Keeper updated" + }, + "errors": { + "creating-keeper": "Error creating keeper.", + "exists": "Crypt Keeper for the address already exists.", + "invalid-amount": "Invalid amount to withdraw", + "invalid-ens-address": "Please enter a valid eth name or address", + "invalid-twitter": "It is not a valid twitter username", + "invalid-discord": "It is not a valid discord id", + "need-to-wait": "Need to wait the minimum staking period", + "too-long": "Field is too long ({{max}} characters max)" + } + }, + "graph": { + "staked-usd": "Total Staked in USD", + "staked-eth": "Total Staked in ETH", + "staked-dai": "Total Staked in DAI", + "staked-aave": "Total Staked in AAVE", + "staked-link": "Total Staked in LINK", + "staked-matic": "Total Staked in MATIC", + "total-supply": "Total Supply", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price" + }, "errors": { + "empty": "Field can't be empty", + "invalid-address": "Please enter a valid address", + "invalid-ens": "Please enter a valid ENS name", + "invalid-file-type": "Invalid file type.", + "invalid-image-size": "Image max size is {{size}} KB", + "no-ctx": "Not enough CTX balance.", + "no-funds": "Insufficient funds to stake", + "not-approve": "Token not Approved", "tran-rejected": "Transaction rejected", - "empty": "Campo no puede estar vacío" + "unexpected": "Unexpected error" } } \ No newline at end of file diff --git a/src/components/Farm.tsx b/src/components/Farm.tsx index 7c55182..e8939ba 100644 --- a/src/components/Farm.tsx +++ b/src/components/Farm.tsx @@ -8,13 +8,13 @@ import Tooltip from "react-bootstrap/esm/Tooltip"; import { ethers } from "ethers"; import NumberFormat from "react-number-format"; import { useQuery, gql } from "@apollo/client"; +import { useTranslation } from "react-i18next"; import SignerContext from "../state/SignerContext"; import TokensContext from "../state/TokensContext"; import VaultsContext from "../state/VaultsContext"; import OraclesContext from "../state/OraclesContext"; import GovernanceContext from "../state/GovernanceContext"; import RewardsContext from "../state/RewardsContext"; - import "../styles/farm.scss"; import { ReactComponent as CtxIcon } from "../assets/images/ctx-coin.svg"; import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; @@ -32,6 +32,7 @@ import { Stake } from "./modals/Stake"; const ctxClaimVestShowDate = new Date(1634511235 * 1000); const Farm = () => { + const { t } = useTranslation(); const [address, setAddress] = useState(""); const [isLoading, setIsLoading] = useState(true); const [ethRewards, setEthRewards] = useState("0"); @@ -376,7 +377,7 @@ const Farm = () => { }, [data, updateData]); if (isLoading) { - return ; + return ; } const showCtxClaimVest = (): boolean => { @@ -416,9 +417,9 @@ const Farm = () => { notifyUser(tx, refresh); } catch (error) { if (error.code === 4001) { - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } else { - errorNotification("Insufficient funds to stake"); + errorNotification(t("errors.no-funds")); } } }; @@ -495,20 +496,20 @@ const Farm = () => { return (
-

Farming

{" "} +

{t("farming.farming")}

{" "} -

Minting Rewards

+

{t("farming.minting")}

- + + + + + + + + ); +}; diff --git a/src/components/Vault/Vault.tsx b/src/components/Vault/Vault.tsx index 62291da..537b2f5 100644 --- a/src/components/Vault/Vault.tsx +++ b/src/components/Vault/Vault.tsx @@ -7,7 +7,7 @@ import "../../styles/vault.scss"; import Loading from "../Loading"; import Details from "./Details"; -const Vault = () => { +export const Vault = () => { const web3Modal = useContext(Web3ModalContext); const signer = useContext(SignerContext); @@ -60,5 +60,3 @@ const Vault = () => { ); }; - -export default Vault; diff --git a/src/components/Vault/index.tsx b/src/components/Vault/index.tsx new file mode 100644 index 0000000..07bc84b --- /dev/null +++ b/src/components/Vault/index.tsx @@ -0,0 +1,3 @@ +export * from "./Vault"; + +export * from "./Monitoring"; diff --git a/src/components/Welcome/index.tsx b/src/components/Welcome/index.tsx index ec80948..2eef978 100644 --- a/src/components/Welcome/index.tsx +++ b/src/components/Welcome/index.tsx @@ -14,7 +14,7 @@ type props = { signerAddress: string; }; -const Wrapper = ({ signerAddress }: props) => { +const WelcomeWrapper = ({ signerAddress }: props) => { const currentNetwork = useContext(NetworkContext); const [apolloClient, setApolloClient] = useState( clientOracle( @@ -49,4 +49,4 @@ const Wrapper = ({ signerAddress }: props) => { ); }; -export default Wrapper; +export default WelcomeWrapper; diff --git a/src/styles/app.scss b/src/styles/app.scss index 1901a35..04390e3 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -270,6 +270,47 @@ form { } } +.table { + color: $white; + thead { + th { + vertical-align: middle; + } + .btn { + width: 37px; + min-width: 35px; + height: 35px; + border-radius: 0.25rem; + background-color: $dark; + margin-top: 5px; + margin-left: 7px; + } + } + tbody { + tr:hover { + color: $white; + } + td { + vertical-align: middle; + a { + font-weight: bold; + color: $purple; + } + a.uniswap { + color: #ff007a; + } + a.btn { + padding-top: 0.4rem; + height: 2.5rem; + color: white; + width: 5rem; + margin-left: auto; + margin-right: auto; + } + } + } +} + #WEB3_CONNECT_MODAL_ID { .web3modal-provider-container { transition: background-color 0s ease-in-out 0s; diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 6e49716..8e23d29 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -221,23 +221,13 @@ } .table { - color: $white; - tr:hover { - color: $white; - } - td { - vertical-align: middle; - - a { - font-weight: bold; - color: $purple; - } - a.uniswap { color: #ff007a; } - + a.btn { + padding-top: 0.4rem; + } .end-date { font-size: 0.8rem; color: $light; @@ -247,15 +237,6 @@ } } - a.btn { - padding-top: 0.4rem; - height: 2.5rem; - color: white; - width: 5rem; - margin-left: auto; - margin-right: auto; - } - .btn { width: 80%; height: 2.5rem; @@ -283,6 +264,11 @@ } thead { + .rewards { + display: flex; + flex-direction: row; + align-items: center; + } .btn { width: 37px; min-width: 35px; @@ -292,11 +278,6 @@ margin-top: 5px; margin-left: 7px; } - .rewards { - display: flex; - flex-direction: row; - align-items: center; - } @media (max-width: 1500px) { .title { flex: 1; diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss new file mode 100644 index 0000000..a230347 --- /dev/null +++ b/src/styles/vault-monitoring.scss @@ -0,0 +1,243 @@ +@import "./colors"; +@import "./fonts"; + +.vault-monitoring { + padding: 1rem 3rem; + + + .card { + padding: 1.5rem 2.8125rem; + + .filters { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding: 0px; + + div[class*="col-"] { + padding: 0px; + } + .dd-container { + display: flex; + align-items: center; + margin-left: 1rem; + } + .titles { + color: $white; + margin-bottom: 0px; + } + .dropdown { + padding-left: 0.5rem; + .dropdown-toggle { + display: flex; + height: 2.1rem; + width: 150px; + background-color: #281e31; + border: 1px solid #dfd1ea; + + div { + display: flex; + align-items: center; + flex: 1; + } + span { + font-size: 0.8rem; + } + svg { + height: 20px; + margin-right: 5px; + } + } + .dropdown-toggle::after { + position: absolute; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.4em solid; + border-right: 0.4em solid transparent; + border-bottom: 0; + border-left: 0.4em solid transparent; + margin-top: 7px; + margin-left: 65%; + } + .dropdown-menu { + width: 85%; + margin-top: 3px !important; + margin-right: 1rem; + background-color: #211828; + + .dropdown-item { + color: $white; + } + .dropdown-item.active { + background-color: rgba(121, 64, 242, 0.4); + } + .dropdown-item:hover { + background-color: rgba(121, 64, 242, 0.3); + } + } + } + .btn-group { + border: 1px solid #dfd1ea; + border-radius: 5px; + margin-bottom: 0rem !important; + + .btn-secondary { + margin-bottom: 0rem; + font-size: 0.8rem; + background-color: #281e31; + } + .btn-secondary.active { + background-color: $neon-highlight; + } + } + input[type="radio"] { + display: none; + } + } + + .vaults { + margin-top: 1.8rem !important; + margin-bottom: 0.2rem; + + .number { + flex: 1; + text-align: right; + font-size: 0.8rem; + } + thead { + th { + text-align: center; + } + .status { + text-align: left; + } + .collateral, .collateral-usd, .debt-usd, .ratio { + text-align: right; + } + .collateral { + padding-right: 60px; + } + .debt { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end; + .tcap { + width: 30px; + margin-right: 10px; + } + } + } + tbody { + div { + display: flex; + } + td { + border-top: 0.5px solid #a440f2; + } + .collateral{ + display: flex; + flex-direction: row; + align-items: center; + span { + flex: 2; + } + svg { + flex: 1; + height: 25px; + } + } + .ratio { + width: 100%; + justify-content: flex-end; + + span { + font-family: "Erbos Draco 1st Open NBP"; + font-weight: 100; + font-size: 0.9rem; + } + } + .status { + font-family: "Nineteen Ninety Seven"; + font-size: 15px; + -webkit-animation: fire 2s infinite alternate; + animation: fire 2s infinite alternate; + color: #fff !important; + } + .empty { + text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; + } + .ready { + text-shadow: 0 0 4px #167226,0 0 10px #61c4b3,0 0 20px #167226,0 -10px 40px #167226; + } + .active { + text-shadow: 0 0 4px #e440f2,0 0 10px #e98ff1,0 0 20px #e440f2,0 -10px 40px #b626c4; + } + .liquidation { + text-shadow: 0 0 4px #c33,0 0 10px rgb(236, 97, 97),0 0 20px #c33,0 -10px 40px #c33; + } + .liquidated { + text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; + } + } + } + + .pag-container{ + display: flex; + justify-content: center; + padding-top: 2rem; + border-top: 2px solid $highlight; + .page-link { + color: $off-white; + background-color: $darker; + border: 1px solid $highlight; + } + .page-link:hover { + background-color: $primary; + } + .page-item.active { + .page-link { + background-color: $neon-highlight; + } + } + } + } + .card.totals { + .container { + display: flex; + flex-direction: row; + } + div[class*="col-"] { + padding: 0px; + } + .total-box { + display: flex; + flex-direction: column-reverse; + + .debt { + display: flex; + flex-direction: row; + } + } + h6 { + color: $light; + margin-top: 5px; + } + .number { + color: $white; + text-shadow: 0 0 4px #f195f9,0 0 10px #fff,0 0 20px #e440f2,0 -10px 40px #b626c4; + } + .tcap-icon { + width: 25px; + margin-left: 7px; + } + } + .card-header { + padding: 0rem; + border: 0px; + } + .card-body { + padding: 1.25rem 0rem; + } +} \ No newline at end of file From 603093ee875d51d903800fc71309dad52a762a78 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 24 Feb 2022 09:29:25 -0600 Subject: [PATCH 035/278] adding svg --- src/assets/images/down-arrow.svg | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/assets/images/down-arrow.svg diff --git a/src/assets/images/down-arrow.svg b/src/assets/images/down-arrow.svg new file mode 100644 index 0000000..d706495 --- /dev/null +++ b/src/assets/images/down-arrow.svg @@ -0,0 +1,3 @@ + + From 2f8596372af9a9771b314574182f221d3f5779bb Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 24 Feb 2022 20:13:40 -0600 Subject: [PATCH 036/278] adding graph queries --- src/components/Graph.tsx | 39 +--- .../{Monitoring.tsx => Monitoring/index.tsx} | 187 ++++++++++-------- src/components/Vault/Monitoring/vaults.tsx | 95 +++++++++ src/components/Vault/index.tsx | 2 +- src/utils/utils.tsx | 24 +++ 5 files changed, 232 insertions(+), 115 deletions(-) rename src/components/Vault/{Monitoring.tsx => Monitoring/index.tsx} (56%) create mode 100644 src/components/Vault/Monitoring/vaults.tsx diff --git a/src/components/Graph.tsx b/src/components/Graph.tsx index a69d1ea..b78a62a 100644 --- a/src/components/Graph.tsx +++ b/src/components/Graph.tsx @@ -27,6 +27,7 @@ import { isPolygon, isUndefined, toUSD, + validOracles, } from "../utils/utils"; import { NETWORKS } from "../utils/constants"; import Loading from "./Loading"; @@ -64,34 +65,6 @@ const Graph = () => { fetchPolicy: "no-cache", }); - const validOracles = (): boolean => { - let valid = - !isUndefined(oracles.wethOracleRead) && - !isUndefined(oracles.daiOracleRead) && - !isUndefined(oracles.tcapOracleRead) && - !isUndefined(tokens.tcapTokenRead); - - if (isInLayer1(currentNetwork.chainId)) { - valid = - valid && - !isUndefined(oracles.aaveOracle) && - !isUndefined(oracles.linkOracle) && - !isUndefined(tokens.ctxPoolTokenRead); - } - if (isOptimism(currentNetwork.chainId)) { - valid = - valid && - !isUndefined(oracles.linkOracleRead) && - !isUndefined(oracles.snxOracleRead) && - !isUndefined(oracles.uniOracleRead); - } - - if (currentNetwork.chainId === NETWORKS.polygon.chainId) { - valid = valid && !isUndefined(oracles.maticOracle) && !isUndefined(oracles.maticOracleRead); - } - return valid; - }; - const getMaticUSD = async () => { const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); // @ts-ignore @@ -102,7 +75,15 @@ const Graph = () => { useEffect(() => { const load = async () => { - if (oracles && tokens && data && signer && validOracles()) { + if ( + oracles && + tokens && + data && + signer && + !isUndefined(tokens.tcapTokenRead) && + !isUndefined(tokens.ctxPoolTokenRead) && + validOracles(currentNetwork.chainId || 1, oracles) + ) { const currentTotalPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); diff --git a/src/components/Vault/Monitoring.tsx b/src/components/Vault/Monitoring/index.tsx similarity index 56% rename from src/components/Vault/Monitoring.tsx rename to src/components/Vault/Monitoring/index.tsx index 7525169..48a786c 100644 --- a/src/components/Vault/Monitoring.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -1,44 +1,121 @@ -import React, { useState } from "react"; +import React, { useContext, useEffect, useState } from "react"; import ButtonGroup from "react-bootstrap/esm/ButtonGroup"; import Card from "react-bootstrap/esm/Card"; import Col from "react-bootstrap/Col"; import Dropdown from "react-bootstrap/Dropdown"; import Pagination from "react-bootstrap/Pagination"; -import Table from "react-bootstrap/Table"; import ToggleButton from "react-bootstrap/esm/ToggleButton"; -import "../../styles/vault-monitoring.scss"; -import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; -import { ReactComponent as WETHIcon } from "../../assets/images/graph/weth.svg"; -import { ReactComponent as DAIIcon } from "../../assets/images/graph/DAI.svg"; -import { ReactComponent as AAVEIcon } from "../../assets/images/graph/aave.svg"; -import { ReactComponent as LINKIcon } from "../../assets/images/graph/chainlink.svg"; -import { vaults } from "./data"; - -type iconProps = { - name: string; -}; +import "../../../styles/vault-monitoring.scss"; +import { useQuery, gql, NetworkStatus } from "@apollo/client"; +import NetworkContext from "../../../state/NetworkContext"; +import OraclesContext from "../../../state/OraclesContext"; +import SignerContext from "../../../state/SignerContext"; +import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; +import { ReactComponent as DAIIcon } from "../../../assets/images/graph/DAI.svg"; +import { Vaults } from "./vaults"; +import { vaultsType } from "../data"; +import { isInLayer1, isOptimism, isPolygon, validOracles } from "../../../utils/utils"; export const Monitoring = () => { + const currentNetwork = useContext(NetworkContext); + const oracles = useContext(OraclesContext); + const signer = useContext(SignerContext); + const [vaults, setVaults] = useState>([]); const [radioValue, setRadioValue] = useState("1"); const radios = [ { name: "All Vaults", value: "1" }, { name: "My Vaults", value: "2" }, ]; + const vaultsQuery = gql` + query allVaults { + vaults(first: 100) { + id + vaultId + owner + collateral + debt + currentRatio + tokenSymbol + } + } + `; - const CollateralIcon = ({ name }: iconProps) => { - console.log("AA"); - switch (name) { - case "eth": - return ; - case "dai": - return ; - case "aave": - return ; - default: - return ; + const loadPrices = async () => { + if (signer && oracles && validOracles(currentNetwork.chainId || 1, oracles)) { + const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); + + const ethcalls = [tcapPriceCall, daiOraclePriceCall]; + if (isInLayer1(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + ethcalls.push(aaveOraclePriceCall); + ethcalls.push(linkOraclePriceCall); + } + if (isOptimism(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); + const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + ethcalls.push(linkOraclePriceCall); + ethcalls.push(snxOraclePriceCall); + ethcalls.push(uniOraclePriceCall); + } + let tcapOraclePrice; + let daiOraclePrice; + let wethOraclePrice; + let aaveOraclePrice; + let linkOraclePrice; + let snxOraclePrice; + let uniOraclePrice; + + if (isInLayer1(currentNetwork.chainId)) { + // @ts-ignore + [ + tcapOraclePrice, + daiOraclePrice, + wethOraclePrice, + aaveOraclePrice, + linkOraclePrice, + ] = await signer.ethcallProvider?.all(ethcalls); + } else if (isOptimism(currentNetwork.chainId)) { + // @ts-ignore + [ + tcapOraclePrice, + daiOraclePrice, + wethOraclePrice, + linkOraclePrice, + snxOraclePrice, + uniOraclePrice, + ] = await signer.ethcallProvider?.all(ethcalls); + } } }; + useEffect(() => { + loadPrices(); + }, []); + + /* const loadVaults = (vaultsData: any) => { + vautltsData.map((v, index) => { + + }); + } */ + + const { data, error, refetch, networkStatus } = useQuery(vaultsQuery, { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + onError: () => { + console.log(error); + }, + onCompleted: () => { + // loadVaults(data); + }, + }); + const VaultPagination = () => { console.log("AA"); return ( @@ -62,8 +139,6 @@ export const Monitoring = () => { ); }; - const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); - return (
@@ -149,65 +224,7 @@ export const Monitoring = () => {
-
- DescriptionCurrent Mint{t("description")}{t("farming.current-mint")}
-
Current Reward
+
{t("farming.current-reward")}
{ trigger={["hover", "click"]} overlay={ - Early adopters rewards are issued over 14 days for a total of - 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day - over 14 days (91,000 Ethereum blocks), the per block reward would be - 5.4945 CTX split across the debtors at that point in time. 100% of - the reward is immediately available. + {t("farming.current-info")} } > @@ -564,23 +561,23 @@ const Farm = () => { CTX
- Inactive + {t("inactive")} {address === "" ? ( <> ) : ( <> )} @@ -626,23 +623,23 @@ const Farm = () => { CTX - Inactive + {t("inactive")} {address === "" ? ( <> ) : ( <> )} @@ -664,17 +661,17 @@ const Farm = () => { {phase > 1 && ( -

Liquidity Rewards

+

{t("farming.liquidity")}

- - + + +
-
Expertise
+
{t("governance.expertise")}

{info?.expertise}

@@ -299,7 +301,7 @@ const ProfileCard = ({ {isTokenOwner() && ( )} diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 6b77641..db172d6 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -14,9 +14,10 @@ type props = { updateData: boolean; withdrawTimes: number[]; updateTimes: boolean; + t: any; }; -const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes }: props) => { +const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: props) => { const signer = useContext(SignerContext); const governance = useContext(GovernanceContext); const [totalStaked, setTotalStaked] = useState("0.0"); @@ -69,9 +70,9 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes }: props) notifyUser(tx, refresh); } catch (error) { if (error.code === 4001) { - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } else { - errorNotification("Insufficient funds to stake"); + errorNotification(t("errors.no-funds")); } } } @@ -91,13 +92,15 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes }: props) return (
-

Stake Reward

+

{t("governance.stake-reward")}

- DescriptionBalanceStake{t("description")}{t("balance")}{t("stake")}
-
Unlocked Reward
+
{t("farming.unlocked")}
{ trigger={["hover", "click"]} overlay={ - Available to claim immediately. + {t("farming.unlocked-info")} } > @@ -693,7 +690,7 @@ const Farm = () => {
-
Locked Reward
+
{t("farming.locked")}
{ trigger={["hover", "click"]} overlay={ - Rewards are unlocked 6 months after the start of the pool. + {t("farming.locked-info")} } > diff --git a/src/components/Governance/Delegate.tsx b/src/components/Governance/Delegate.tsx index 393b730..b12e7cd 100644 --- a/src/components/Governance/Delegate.tsx +++ b/src/components/Governance/Delegate.tsx @@ -14,6 +14,7 @@ type props = { addTodayWithdrawTime: () => void; onHide: () => void; refresh: () => void; + t: any; }; const Delegate = ({ @@ -23,6 +24,7 @@ const Delegate = ({ addTodayWithdrawTime, onHide, refresh, + t, }: props) => { const tokens = useContext(TokensContext); const signer = useContext(SignerContext); @@ -82,13 +84,13 @@ const Delegate = ({ onHide(); addTodayWithdrawTime(); } catch (error) { - errorNotification("Not enough CTX balance."); + errorNotification(t("errors.not-ctx")); } } else { - errorNotification("Not enough CTX balance"); + errorNotification(t("errors.not-ctx")); } } else { - errorNotification("Field can't be empty"); + errorNotification(t("errors.empty")); } setCanDelegate(true); } @@ -104,9 +106,9 @@ const Delegate = ({ setIsApproved(true); } catch (error) { if (error.code === 4001) { - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } else { - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } } } @@ -124,7 +126,9 @@ const Delegate = ({ }} > - Stake & Delegate + + {t("governance.stake-delegate")} +
@@ -132,14 +136,11 @@ const Delegate = ({ {isApproved ? ( <> -

- Stake and Delegate CTX to this Crypt Keeper. Each time you Stake and Delegate, you - must wait a minimum of 7 days before you can withdraw. -

- Amount to Stake +

{t("governance.stake-info")}

+ {t("governance.amount-stake")} - MAX + {t("max")} ) : ( -

Approve delegating CTX tokens. You only have to do this once.

+

{t("governance.stake-info2")}

)}
@@ -164,11 +165,11 @@ const Delegate = ({ onClick={stake} disabled={!canDelegate} > - {canDelegate ? "Delegate to Keeper" : "Delegating"} + {canDelegate ? t("governance.delegate-to") : t("governance.delegating")} ) : ( )} diff --git a/src/components/Governance/Delegators.tsx b/src/components/Governance/Delegators.tsx index 1cca8d2..8cf95db 100644 --- a/src/components/Governance/Delegators.tsx +++ b/src/components/Governance/Delegators.tsx @@ -2,6 +2,7 @@ import React, { useContext, useState, useEffect } from "react"; import { Button } from "react-bootstrap"; import Row from "react-bootstrap/esm/Row"; import { useQuery, gql } from "@apollo/client"; +import { useTranslation } from "react-i18next"; import ProfileCard from "./ProfileCard"; import KeeperForm from "./KeeperForm"; import Delegate from "./Delegate"; @@ -25,6 +26,7 @@ type delegatorType = { }; const Delegators = ({ currentSignerAddress }: props) => { + const { t } = useTranslation(); const [delegators, setDelegators] = useState([]); const [keepersInfo, setKeepersInfo] = useState([]); const [keeperIndex, setKeeperIndex] = useState(-1); @@ -160,7 +162,7 @@ const Delegators = ({ currentSignerAddress }: props) => { {FEATURES.KEEPERS_API && (
)} @@ -170,6 +172,7 @@ const Delegators = ({ currentSignerAddress }: props) => { updateData={updateData} withdrawTimes={withdrawTimes} updateTimes={updateTimes} + t={t} /> @@ -188,6 +191,7 @@ const Delegators = ({ currentSignerAddress }: props) => { openWithdraw={openWithdraw} addWithdrawTime={addWithdrawTime} isSigner={delegator.delegatee.toLowerCase() !== currentSignerAddress.toLowerCase()} + t={t} /> ); } @@ -203,6 +207,7 @@ const Delegators = ({ currentSignerAddress }: props) => { keeperInfo={keeperIndex !== -1 ? keepersInfo[keeperIndex] : null} onHide={() => hideKeeperForm()} refresh={() => refresh()} + t={t} /> { setShowDelegate(false); }} refresh={() => refresh()} + t={t} /> { setShowWithdraw(false); }} refresh={() => refresh()} + t={t} />
); diff --git a/src/components/Governance/KeeperForm.tsx b/src/components/Governance/KeeperForm.tsx index 6569d7e..3e24de1 100644 --- a/src/components/Governance/KeeperForm.tsx +++ b/src/components/Governance/KeeperForm.tsx @@ -24,6 +24,7 @@ type props = { keeperInfo: any | null; onHide: () => void; refresh: () => void; + t: any; }; const KeeperForm = ({ @@ -35,6 +36,7 @@ const KeeperForm = ({ keeperInfo, onHide, refresh, + t, }: props) => { const [saving, setSaving] = useState(false); const [delegatee, setDelegatee] = useState(""); @@ -110,11 +112,11 @@ const KeeperForm = ({ if (re2.test(value.trim())) { add = await getAddressFromENS(value); if (add === null) { - setDelegateeError("Please enter a valid ENS name"); + setDelegateeError(t("errors.invalid-ens")); return false; } if (keeperExists(add)) { - setDelegateeError("Crypt keeper already exists for this address."); + setDelegateeError(t("governance.errors.exists")); return false; } @@ -126,11 +128,11 @@ const KeeperForm = ({ add = await isValidAddress(value.trim()); if (add === null) { - setDelegateeError("Please enter a valid address"); + setDelegateeError(t("errors.invalid-address")); return false; } if (keeperExists(add)) { - setDelegateeError("Crypt keeper already exists for this address."); + setDelegateeError(t("governance.errors.exists")); return false; } setIsEthName(false); @@ -138,17 +140,17 @@ const KeeperForm = ({ setDelegateeError(""); return true; } - setDelegateeError("Please enter a valid eth name or address"); + setDelegateeError(t("governance.errors.invalid-ens-address")); return false; }; const isNameValid = (value: string): boolean => { if (value.trim().length === 0) { - setNameError("Name cannot be empty"); + setNameError(t("errors.empty")); return false; } if (value.trim().length > 25) { - setNameError("Name is too long (25 characters max)"); + setNameError(t("governance.errors.too-long", { max: "25" })); return false; } setNameError(""); @@ -159,7 +161,7 @@ const KeeperForm = ({ const re = /^[a-zA-Z0-9_]{1,15}$/; if (value.trim().length > 0) { if (!re.test(value.trim())) { - setTwitterError("It is not a valid twitter username)"); + setTwitterError(t("governance.errors.invalid-twitter")); return false; } } @@ -171,7 +173,7 @@ const KeeperForm = ({ const re = /^.{3,32}#[0-9]{4}$/; if (value.trim().length > 0) { if (!re.test(value.trim())) { - setDiscordError("It is not a valid twitter username)"); + setDiscordError(t("governance.errors.invalid-discord")); return false; } } @@ -181,11 +183,11 @@ const KeeperForm = ({ const isExpertiseValid = (value: string): boolean => { if (value.trim().length === 0) { - setExpertiseError("Expertise cannot be empty"); + setExpertiseError(t("errors.empty")); return false; } if (value.trim().length > 120) { - setExpertiseError("Expertise is too loong (120 characters max)"); + setExpertiseError(t("governance.errors.too-long", { max: "25" })); return false; } setExpertiseError(""); @@ -194,11 +196,11 @@ const KeeperForm = ({ const isWhyValid = (value: string): boolean => { if (value.trim().length === 0) { - setWhyError("Why field cannot be empty"); + setWhyError(t("errors.empty")); return false; } if (value.trim().length > 2500) { - setWhyError("Why field is too loong (2500 characters max)"); + setWhyError(t("governance.errors.too-long", { max: "2500" })); return false; } setWhyError(""); @@ -208,16 +210,16 @@ const KeeperForm = ({ const isImageValid = (value: File | null): boolean => { if (value === null) { if (isNew) { - setImageError("Image cannot be empty"); + setImageError(t("errors.empty")); } return !isNew; } if (value.type !== "image/png" && value.type !== "image/jpg" && value.type !== "image/jpeg") { - setImageError("Invalid file type"); + setImageError(t("errors.invalid-file-type")); return false; } if (value.size > 100000) { - setImageError("Image max size is 100 KB"); + setImageError(t("errors.invalid-image-size", { size: Math.round(value.size / 1000) })); setImageUrl(""); return false; } @@ -300,7 +302,7 @@ const KeeperForm = ({ }) .catch((error) => { console.error("Error creating"); - errorNotification("Error creating keeper."); + errorNotification(t("governance.errors.creating-keeper")); console.error(error); }); }; @@ -321,10 +323,10 @@ const KeeperForm = ({ refresh(); onHide(); } catch (error) { - errorNotification("Delegator for the address already exists."); + errorNotification(t("governance.errors.empty")); } } else { - errorNotification("Field can't be empty"); + errorNotification(t("errors.empty")); } } setSaving(false); @@ -352,8 +354,8 @@ const KeeperForm = ({ if (responseJson.status === "success") { refresh(); sendNotification( - "Crypt. Keepers", - "Crypt Keeper updated", + t("governance.success.title"), + t("governance.success.message"), 3000, onHide(), 1000, @@ -364,8 +366,8 @@ const KeeperForm = ({ } }) .catch((error) => { - errorNotification("Unexpected error saving to DB"); - console.error("Unexpected error"); + errorNotification("Unexpected error"); + console.error(t("errors.unexpected")); console.error(error); }); } @@ -384,7 +386,7 @@ const KeeperForm = ({ }} > - Create Crypt Keeper + {t("governance.form.create")}
@@ -417,7 +419,7 @@ const KeeperForm = ({ type="text" required className={delegateeError === "" ? "neon-green" : "neon-orange"} - placeholder="Delegatee eth name or address" + placeholder={t("governance.form.keeper")} value={delegatee} onChange={onChangeDelegatee} disabled={!isNew} @@ -437,7 +439,7 @@ const KeeperForm = ({ type="text" required className={nameError === "" ? "neon-green" : "neon-orange"} - placeholder="Name" + placeholder={t("governance.form.name")} value={name} onChange={onChangeName} /> @@ -453,7 +455,7 @@ const KeeperForm = ({ type="text" required className={expertiseError === "" ? "neon-green" : "neon-orange"} - placeholder="Expertise" + placeholder={t("governance.expertise")} value={expertise} onChange={onChangeExpertise} /> @@ -469,7 +471,7 @@ const KeeperForm = ({ as="textarea" rows={7} className={whyError === "" ? "neon-green" : "neon-orange"} - placeholder="Why?" + placeholder={t("governance.form.why")} value={why} onChange={onChangeWhy} /> @@ -512,7 +514,7 @@ const KeeperForm = ({ onClick={isNew ? createKeeper : updateKeeper} disabled={saving} > - {isNew ? "Create" : "Update"} + {isNew ? t("create") : t("update")} diff --git a/src/components/Governance/ProfileCard.tsx b/src/components/Governance/ProfileCard.tsx index 0a25d0c..dd1ce28 100644 --- a/src/components/Governance/ProfileCard.tsx +++ b/src/components/Governance/ProfileCard.tsx @@ -34,6 +34,7 @@ type props = { openWithdraw: (currentDelegator: string, ownerStake: string, withdrawTime: number) => void; addWithdrawTime: (waitingTime: number) => void; isSigner: boolean; + t: any; }; const ProfileCard = ({ @@ -44,6 +45,7 @@ const ProfileCard = ({ openWithdraw, addWithdrawTime, isSigner, + t, }: props) => { const [shortAddress, setShortAddress] = useState(""); const [actionText, setActionText] = useState(""); @@ -197,19 +199,19 @@ const ProfileCard = ({ - {round2(parseFloat(tokenOwnerStake.stake))} Staked + {round2(parseFloat(tokenOwnerStake.stake))} {t("staked")} )} tally logo @@ -218,7 +220,7 @@ const ProfileCard = ({ target="_blank" rel="noreferrer" > - History + {t("history")} @@ -228,7 +230,7 @@ const ProfileCard = ({ target="_blank" rel="noreferrer" > - Contract + {t("contract")} @@ -238,7 +240,7 @@ const ProfileCard = ({ Click to Copy} + overlay={{t("click-copy")}} > discord logo @@ -265,7 +267,7 @@ const ProfileCard = ({
-
Why me?
+
{t("governance.why-me")}
- - - + + + @@ -138,7 +141,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes }: props) claimRewards(); }} > - Claim + {t("claim")} diff --git a/src/components/Governance/Withdraw.tsx b/src/components/Governance/Withdraw.tsx index aa8f1e2..87c7fa0 100644 --- a/src/components/Governance/Withdraw.tsx +++ b/src/components/Governance/Withdraw.tsx @@ -13,6 +13,7 @@ type props = { currentWithdrawTime: number; onHide: () => void; refresh: () => void; + t: any; }; const Withdraw = ({ @@ -23,6 +24,7 @@ const Withdraw = ({ currentWithdrawTime, onHide, refresh, + t, }: props) => { const [withdrawText, setWithdrawText] = useState(""); const [canWithdraw, setCanWithdraw] = useState(true); @@ -51,13 +53,13 @@ const Withdraw = ({ setWithdrawText(""); onHide(); } catch (error) { - errorNotification("Need to wait the minimum staking period"); + errorNotification(t("governance.errors.need-to-wait")); } } else { - errorNotification("Invalid amount to withdraw"); + errorNotification(t("governance.errors.invalid-amount")); } } else { - errorNotification("Field can't be empty"); + errorNotification(t("empty")); } setCanWithdraw(true); } @@ -80,20 +82,17 @@ const Withdraw = ({ }} > - Withdraw + {t("governance.withdraw")}
-

- Remove delegated votes from this Crypt Keeper. CTX must be staked and delegated for a - minimum of 7 days before you are eligible to withdraw. -

- Amount to remove +

{t("governance.withdraw-info")}

+ {t("governance.amount-remove")} - MAX + {t("max")} {currentWithdrawTime !== 0 && ( - * Eligible to withdraw on {withdrawDate()} + + {t("governance.withdraw-info2", { date: withdrawDate() })} + )}
@@ -116,7 +117,7 @@ const Withdraw = ({ onClick={withdraw} disabled={!canWithdraw} > - {canWithdraw ? "Withdraw" : "Withdrawing"} + {canWithdraw ? t("governance.withdraw") : t("governance.withdrawing")} diff --git a/src/components/Graph.tsx b/src/components/Graph.tsx index 00af3fb..4c6e5bc 100644 --- a/src/components/Graph.tsx +++ b/src/components/Graph.tsx @@ -2,6 +2,7 @@ import React, { useContext, useEffect, useState } from "react"; import "../styles/graph.scss"; import Card from "react-bootstrap/esm/Card"; import { BigNumber, ethers } from "ethers"; +import { useTranslation } from "react-i18next"; import NumberFormat from "react-number-format"; import { useQuery, gql } from "@apollo/client"; import NetworkContext from "../state/NetworkContext"; @@ -23,6 +24,7 @@ import { FEATURES, NETWORKS } from "../utils/constants"; import Loading from "./Loading"; const Graph = () => { + const { t } = useTranslation(); const currentNetwork = useContext(NetworkContext); const tokens = useContext(TokensContext); const signer = useContext(SignerContext); @@ -254,7 +256,7 @@ const Graph = () => {
-

Total Staked in USD

+

{t("graph.staked-usd")}

{ -

Total Supply

+

{t("graph.total-supply")}

{ -

TCAP Price

+

{t("graph.tcap-price")}

{ -

Total Staked in ETH

+

{t("graph.staked-eth")}

{" "} ETH @@ -301,7 +303,7 @@ const Graph = () => { -

Total Staked in DAI

+

{t("graph.staked-dai")}

{" "} DAI @@ -311,7 +313,7 @@ const Graph = () => { <> -

CTX Price

+

{t("graph.ctx-price")}

{ <> -

Total Staked in AAVE

+

{t("graph.staked-aave")}

{ -

Total Staked in LINK

+

{t("graph.staked-link")}

{ {currentNetwork.chainId === NETWORKS.polygon.chainId && ( -

Total Staked in MATIC

+

{t("graph.staked-matic")}

{ + const { t } = useTranslation(); const [isLoading, setIsLoading] = useState(true); const [ethLiquidity, setEthLiquidity] = useState("0"); const [ethLiquidityUNI, setEthLiquidityUNI] = useState("0"); @@ -140,23 +142,23 @@ const Farm = () => { }, [tokens]); if (isLoading) { - return ; + return ; } return (
-

Pools

{" "} +

{t("pools.pools")}

{" "} <> -

Enabled Pools

+

{t("pools.enabled")}

StakedLast StakedStaked Reward{t("staked")} + {t("last")} {t("staked")} + {t("governance.staked-reward")} APY
- + + @@ -197,7 +199,7 @@ const Farm = () => { target="_blank" href={`${lpURL}/#/add/${tokens.tcapToken?.address}/ETH`} > - Pool + {t("pool")} @@ -237,7 +239,7 @@ const Farm = () => { target="_blank" href={`${lpURL}/#/add/ETH/${tokens.ctxToken?.address}`} > - Pool + {t("pool")} @@ -275,7 +277,7 @@ const Farm = () => { target="_blank" href={`${lpUniURL}/#/add/${tokens.tcapToken?.address}/ETH`} > - Pool + {t("pool")} diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index ed0c9c0..ce7081d 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -632,7 +632,7 @@ const Details = ({ address, t }: props) => { if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); } else { - errorNotification(t("vault.errors.no-funds")); + errorNotification(t("errors.no-funds")); } } setAddCollateralTxt(""); diff --git a/src/components/modals/ChangeNetwork.tsx b/src/components/modals/ChangeNetwork.tsx index 039a4f9..4dbc440 100644 --- a/src/components/modals/ChangeNetwork.tsx +++ b/src/components/modals/ChangeNetwork.tsx @@ -1,6 +1,7 @@ import React from "react"; import Modal from "react-bootstrap/esm/Modal"; import Button from "react-bootstrap/esm/Button"; +import { useTranslation } from "react-i18next"; import { FEATURES, NETWORKS } from "../../utils/constants"; import { useNetworks } from "../../hooks/useNetworks"; import { ReactComponent as ETHIconSmall } from "../../assets/images/vault/eth.svg"; @@ -14,6 +15,7 @@ type props = { }; export const ChangeNetwork = ({ show, onHide, changeNetwork }: props) => { + const { t } = useTranslation(); const networks = useNetworks(); return ( @@ -27,7 +29,7 @@ export const ChangeNetwork = ({ show, onHide, changeNetwork }: props) => { centered > - Choose Network + {t("choose-network")}
diff --git a/src/components/modals/Stake.tsx b/src/components/modals/Stake.tsx index 7b84b14..41f7a6c 100644 --- a/src/components/modals/Stake.tsx +++ b/src/components/modals/Stake.tsx @@ -3,6 +3,7 @@ import Modal from "react-bootstrap/esm/Modal"; import Button from "react-bootstrap/esm/Button"; import Form from "react-bootstrap/esm/Form"; import { ethers, BigNumber } from "ethers"; +import { useTranslation } from "react-i18next"; import SignerContext from "../../state/SignerContext"; import "../../styles/modal.scss"; @@ -19,6 +20,7 @@ type props = { }; export const Stake = ({ show, poolTitle, poolToken, pool, balance, onHide, refresh }: props) => { + const { t } = useTranslation(); const [stakeText, setStakeText] = useState(""); const [isApproved, setIsApproved] = useState(false); const signer = useContext(SignerContext); @@ -57,13 +59,13 @@ export const Stake = ({ show, poolTitle, poolToken, pool, balance, onHide, refre onHide(); } catch (error) { if (error.code === 4001) { - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } else { - errorNotification("Token not Approved"); + errorNotification(t("errors.not-approve")); } } } else { - errorNotification("Field can't be empty"); + errorNotification(t("errors.empty")); } } }; @@ -78,7 +80,7 @@ export const Stake = ({ show, poolTitle, poolToken, pool, balance, onHide, refre setIsApproved(true); } catch (error) { if (error.code === 4001) { - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } else { console.log(error); } @@ -103,17 +105,19 @@ export const Stake = ({ show, poolTitle, poolToken, pool, balance, onHide, refre }} > - Stake {poolTitle} + + {t("stake")} {poolTitle} +

- Current Balance: {balance} + {t("balance2")}: {balance}

{isApproved ? ( <> - Amount to Stake + {t("stake2")} MAX @@ -137,17 +141,17 @@ export const Stake = ({ show, poolTitle, poolToken, pool, balance, onHide, refre {isApproved ? ( <> ) : ( <> )}{" "} - Tokens + {t("tokens")} ); diff --git a/src/i18n.js b/src/i18n.js index 704aa40..42811a5 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -11,8 +11,8 @@ i18n // init i18next // for all options read: https://www.i18next.com/overview/configuration-options .init({ - fallbackLng: "es", - lng: "es", + fallbackLng: "en", + lng: "en", debug: true, interpolation: { diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index dded6b0..d18b920 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -61,8 +61,8 @@ export const GRAPHQL_ENDPOINT = { }; export const FEATURES = { - KEEPERS_API: false, - NEW_VAULTS: false, + KEEPERS_API: true, + NEW_VAULTS: true, OPTIMISM: false, - POLYGON: false, + POLYGON: true, }; diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index d286b44..70e3ff7 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -278,7 +278,6 @@ export const getDefaultProvider = (chainId: number | undefined, name: string | u ? process.env.REACT_APP_ALCHEMY_KEY : process.env.REACT_APP_ALCHEMY_KEY_RINKEBY; provider = ethers.getDefaultProvider(name, { - infura: process.env.REACT_APP_INFURA_ID, alchemy: alchemyKey, }); } From 715df10a92eb6946a6e6b6a7792a2611620f0b2f Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 21 Jan 2022 10:24:12 -0600 Subject: [PATCH 009/278] adding more locales --- public/locales/de/keepers.json | 50 ++++++++ public/locales/de/translation.json | 164 ++++++++++++++++++++++++++ public/locales/en/keepers.json | 50 ++++++++ public/locales/es/keepers.json | 50 ++++++++ public/locales/fr/keepers.json | 50 ++++++++ public/locales/fr/translation.json | 164 ++++++++++++++++++++++++++ public/locales/hi_IN/keepers.json | 50 ++++++++ public/locales/hi_IN/translation.json | 164 ++++++++++++++++++++++++++ public/locales/it/keepers.json | 50 ++++++++ public/locales/it/translation.json | 164 ++++++++++++++++++++++++++ public/locales/pt/keepers.json | 50 ++++++++ public/locales/pt/translation.json | 164 ++++++++++++++++++++++++++ public/locales/tr/keepers.json | 50 ++++++++ public/locales/tr/translation.json | 164 ++++++++++++++++++++++++++ public/locales/zh/translation.json | 164 ++++++++++++++++++++++++++ 15 files changed, 1548 insertions(+) create mode 100644 public/locales/de/keepers.json create mode 100644 public/locales/de/translation.json create mode 100644 public/locales/en/keepers.json create mode 100644 public/locales/es/keepers.json create mode 100644 public/locales/fr/keepers.json create mode 100644 public/locales/fr/translation.json create mode 100644 public/locales/hi_IN/keepers.json create mode 100644 public/locales/hi_IN/translation.json create mode 100644 public/locales/it/keepers.json create mode 100644 public/locales/it/translation.json create mode 100644 public/locales/pt/keepers.json create mode 100644 public/locales/pt/translation.json create mode 100644 public/locales/tr/keepers.json create mode 100644 public/locales/tr/translation.json create mode 100644 public/locales/zh/translation.json diff --git a/public/locales/de/keepers.json b/public/locales/de/keepers.json new file mode 100644 index 0000000..ac50236 --- /dev/null +++ b/public/locales/de/keepers.json @@ -0,0 +1,50 @@ +{ + "brajon.eth": { + "expertise": ["Development"], + "why": "I’ve been a Cryptex supporter since Nov 2020 and see the vision Joe and the team are trying to accomplish. My goal is to help this project reach its potential of creating institutional grade investment products that allow anyone to get exposure to currently nontradeable markets." + }, + "David R Jennings": { + "expertise": ["Investor"], + "why": "Here to invest with ctx long term" + }, + "DesertDwelr": { + "expertise": ["Development", "Operations"], + "why": "Like many of you in this community, my CTX/TCAP holdings are modest but my enthusiasm is not. I'd be honored to be the voice of other modest holders and help guide the future of this exciting organization. My approach will be to learn and listen.Learn about each proposal and be able to share the considerations of each option.Listen to your input and vote accordingly, even if that means going against the majority vote.\n\nA brief bio: I'm a software solution manager at a Fortune 50 company, leading my team throughout all stages of the product lifecycle. I'm a father of 3 boys, which is even more humbling.I am fascinated by crypto and the power of decentralization.I try to learn more every day.\n\nThanks for considering me! Regardless of who you select as your delegate, congratulations on staking and being part of this great community!" + }, + "dnkta.eth": { + "expertise": ["Operations"], + "why": "Take decisions in best faith for the protocol." + }, + "Huntsman": { + "expertise": ["Economics/Retail Investing"], + "why": "Huntsman is a relative newcomer to cryptocurrency investing, and while he only discovered Cryptex when it was listed on Gemini, his Cryptex journey has seen him allocate over 10% of his investment portfolio into collateralizing vaults, minting TCAP, and providing liquidity on Sushiswap. He is very excited about the potential of this DAO and its community, as well as its flagship TCAP. He is humbly asking for your delegation for those who want to place their stake with a retail everyman who can't wait for the Moon but wants to invest decades into this project to see it to its maximum potential." + }, + "indigo.eth": { + "expertise": ["Development", "Operations"], + "why": "I'm a security expert who specializes in smart contract and operational security auditing.\n\nI will vote for incentivized liquidity and staking, expansion to new projects/networks, and supporting operations that will drive adoption of TCAP." + }, + "Joshua Britt": { + "expertise": ["Development", "Operations"], + "why": "Here to make Ctx better for the future" + }, + "Leo": { + "expertise": ["Operations"], + "why": "I am a long-term crypto investor and builder. I am a big supporter of the cryptex project from the very beginning. I have promoted the project to a large Chinese crypto community with a few thousand people. I have initiated the debank.com integration and get it supported recently.\n\nI would like to represent the Chinese crypto investors in the project and continue supporting and promoting the cryptex project." + }, + "MediumArchibald": { + "expertise": ["Investigative journalist", "Freelance political/legal researcher"], + "why": "My profession is trust- and referral-based. I either present verifiable information, or I don’t get future clients." + }, + "Mr. Brightside": { + "expertise": ["Operations"], + "why": "Passionate about project, mission and vision. Multi-disciplinary background leading my own project and developments including a separate ERC-20 token." + }, + "scottie33": { + "expertise": ["Operations"], + "why": "I am super responsive, trustworthy, and support Cryptex 100%." + }, + "TheyCallMeJim": { + "expertise": ["Development", "Operations"], + "why": "Experienced crypto trader and audit analysis" + } +} \ No newline at end of file diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json new file mode 100644 index 0000000..9e37653 --- /dev/null +++ b/public/locales/de/translation.json @@ -0,0 +1,164 @@ +{ + "balance": "Balance", + "balance2": "Current Balance", + "choose-network": "Choose Network", + "claim": "Claim", + "click-copy": "Click to Copy", + "connect": "Connect Wallet", + "contract": "Contract", + "create": "Create", + "description": "Description", + "exit": "Exit", + "farm": "Farm", + "history": "History", + "inactive": "Inative", + "infinite-approve": "Infinite Approve", + "max": "MAX", + "max-safe": "MAX SAFE", + "mint": "Mint", + "last": "Last", + "loading": "Loading", + "pool": "Pool", + "stake": "Stake", + "stake2": "Amount to Stake", + "staked": "Staked", + "token": "Token", + "tokens": "Tokens", + "trade": "Trade", + "tran-sent": "⏰ Transaction Sent!", + "tran-confirmed": "✔️ Transaction Confirmed!", + "tran-wait": "Plz wait for the transaction confirmation.", + "tran-wait2": "All set, please wait for another confirmation", + "update": "Update", + "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "votes": "Votes", + "wait": "Please wait...", + "welcome": { + "tcap": "Total Cryptocurrency Market Capitalization", + "tcap-token": "Total Cryptocurrency Market Capitalization Token", + "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", + "title1": "My Total Balance", + "subtitle1": "Connected Account", + "title2": "Use TCAP", + "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "title3": "Connect Your Account", + "subtitle3": "Mint TCAP, or check your balance connecting your account", + "tcap-balance": "TCAP Balance", + "ctx-balance": "CTX Balance" + }, + "vault": { + "warning": "", + "loading": "Loading Vault", + "title1": "The Vault", + "subtitle1": "Select your Collateral", + "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", + "approve": "Approve Vault", + "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", + "create": "Create Vault", + "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", + "balance-title": "{{vault}} Balance", + "ratio-title": "Vault Ratio", + "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "collateral": { + "title": "Staked Collateral", + "add": "Add Collateral", + "remove": "Remove Collateral" + }, + "debt": { + "title": "Vault Debt", + "mint": "Mint TCAP", + "burn": "Burn TCAP", + "fee": "Burn Fee" + }, + "status": { + "na": "N/A", + "safe": "safe", + "warning": "warning", + "danger": "danger", + "error": "error" + }, + "errors": { + "no-collateral": "Not enough collateral on vault", + "burn-too-high": "Burn value too high" + } + }, + "pools": { + "pools": "Pools", + "enabled": "Enabled Pools", + "available": "Available Pools", + "liquidity": "Liquidity" + }, + "farming": { + "farming": "Farming", + "minting": "Minting Rewards", + "current-mint": "Current mint", + "current-reward": "Current Reward", + "liquidity": "Liquidity Rewards", + "unlocked": "Unlocked Reward", + "locked": "Locked Reward", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", + "unlocked-info": "Available to claim immediately.", + "locked-info": "Rewards are unlocked 6 months after the start of the pool." + }, + "governance": { + "amount-stake": "Amount to Stake", + "amount-remove": "Amount to Remove", + "new": "New Crypt Keeper", + "respresented": "Represented", + "stake-reward": "Stake Reward", + "staked-reward": "Staked Reward", + "why-me": "Why me?", + "expertise": "Expertise", + "delegate-to": "Delegate to Keeper", + "delegating": "Delegating", + "stake-delegate": "Stake & Delegate", + "stake-info": "Stake and Delegate CTX to this Crypt Keeper. Each time you Stake and Delegate, you must wait a minimum of 7 days before you can withdraw.", + "stake-info2": "Approve delegating CTX tokens. You only have to do this once.", + "withdraw": "Withdraw", + "withdrawing": "Withdrawing", + "withdraw-info": "Remove delegated votes from this Crypt Keeper. CTX must be staked and delegated for a minimum of 7 days before you are eligible to withdraw.", + "withdraw-info2": "* Eligible to withdraw on {{date}}", + "form": { + "create": "Create Crypt Keeper", + "keeper": "Keeper eth name or address", + "name": "Name" + }, + "success": { + "title": "Crypt. Keepers", + "message": "Crypt Keeper updated" + }, + "errors": { + "creating-keeper": "Error creating keeper.", + "exists": "Crypt Keeper for the address already exists.", + "invalid-amount": "Invalid amount to withdraw", + "invalid-ens-address": "Please enter a valid eth name or address", + "invalid-twitter": "It is not a valid twitter username", + "invalid-discord": "It is not a valid discord id", + "need-to-wait": "Need to wait the minimum staking period", + "too-long": "Field is too long ({{max}} characters max)" + } + }, + "graph": { + "staked-usd": "Total Staked in USD", + "staked-eth": "Total Staked in ETH", + "staked-dai": "Total Staked in DAI", + "staked-aave": "Total Staked in AAVE", + "staked-link": "Total Staked in LINK", + "staked-matic": "Total Staked in MATIC", + "total-supply": "Total Supply", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price" + }, + "errors": { + "empty": "Field can't be empty", + "invalid-address": "Please enter a valid address", + "invalid-ens": "Please enter a valid ENS name", + "invalid-file-type": "Invalid file type.", + "invalid-image-size": "Image max size is {{size}} KB", + "no-ctx": "Not enough CTX balance.", + "no-funds": "Insufficient funds to stake", + "not-approve": "Token not Approved", + "tran-rejected": "Transaction rejected", + "unexpected": "Unexpected error" + } +} \ No newline at end of file diff --git a/public/locales/en/keepers.json b/public/locales/en/keepers.json new file mode 100644 index 0000000..ac50236 --- /dev/null +++ b/public/locales/en/keepers.json @@ -0,0 +1,50 @@ +{ + "brajon.eth": { + "expertise": ["Development"], + "why": "I’ve been a Cryptex supporter since Nov 2020 and see the vision Joe and the team are trying to accomplish. My goal is to help this project reach its potential of creating institutional grade investment products that allow anyone to get exposure to currently nontradeable markets." + }, + "David R Jennings": { + "expertise": ["Investor"], + "why": "Here to invest with ctx long term" + }, + "DesertDwelr": { + "expertise": ["Development", "Operations"], + "why": "Like many of you in this community, my CTX/TCAP holdings are modest but my enthusiasm is not. I'd be honored to be the voice of other modest holders and help guide the future of this exciting organization. My approach will be to learn and listen.Learn about each proposal and be able to share the considerations of each option.Listen to your input and vote accordingly, even if that means going against the majority vote.\n\nA brief bio: I'm a software solution manager at a Fortune 50 company, leading my team throughout all stages of the product lifecycle. I'm a father of 3 boys, which is even more humbling.I am fascinated by crypto and the power of decentralization.I try to learn more every day.\n\nThanks for considering me! Regardless of who you select as your delegate, congratulations on staking and being part of this great community!" + }, + "dnkta.eth": { + "expertise": ["Operations"], + "why": "Take decisions in best faith for the protocol." + }, + "Huntsman": { + "expertise": ["Economics/Retail Investing"], + "why": "Huntsman is a relative newcomer to cryptocurrency investing, and while he only discovered Cryptex when it was listed on Gemini, his Cryptex journey has seen him allocate over 10% of his investment portfolio into collateralizing vaults, minting TCAP, and providing liquidity on Sushiswap. He is very excited about the potential of this DAO and its community, as well as its flagship TCAP. He is humbly asking for your delegation for those who want to place their stake with a retail everyman who can't wait for the Moon but wants to invest decades into this project to see it to its maximum potential." + }, + "indigo.eth": { + "expertise": ["Development", "Operations"], + "why": "I'm a security expert who specializes in smart contract and operational security auditing.\n\nI will vote for incentivized liquidity and staking, expansion to new projects/networks, and supporting operations that will drive adoption of TCAP." + }, + "Joshua Britt": { + "expertise": ["Development", "Operations"], + "why": "Here to make Ctx better for the future" + }, + "Leo": { + "expertise": ["Operations"], + "why": "I am a long-term crypto investor and builder. I am a big supporter of the cryptex project from the very beginning. I have promoted the project to a large Chinese crypto community with a few thousand people. I have initiated the debank.com integration and get it supported recently.\n\nI would like to represent the Chinese crypto investors in the project and continue supporting and promoting the cryptex project." + }, + "MediumArchibald": { + "expertise": ["Investigative journalist", "Freelance political/legal researcher"], + "why": "My profession is trust- and referral-based. I either present verifiable information, or I don’t get future clients." + }, + "Mr. Brightside": { + "expertise": ["Operations"], + "why": "Passionate about project, mission and vision. Multi-disciplinary background leading my own project and developments including a separate ERC-20 token." + }, + "scottie33": { + "expertise": ["Operations"], + "why": "I am super responsive, trustworthy, and support Cryptex 100%." + }, + "TheyCallMeJim": { + "expertise": ["Development", "Operations"], + "why": "Experienced crypto trader and audit analysis" + } +} \ No newline at end of file diff --git a/public/locales/es/keepers.json b/public/locales/es/keepers.json new file mode 100644 index 0000000..ac50236 --- /dev/null +++ b/public/locales/es/keepers.json @@ -0,0 +1,50 @@ +{ + "brajon.eth": { + "expertise": ["Development"], + "why": "I’ve been a Cryptex supporter since Nov 2020 and see the vision Joe and the team are trying to accomplish. My goal is to help this project reach its potential of creating institutional grade investment products that allow anyone to get exposure to currently nontradeable markets." + }, + "David R Jennings": { + "expertise": ["Investor"], + "why": "Here to invest with ctx long term" + }, + "DesertDwelr": { + "expertise": ["Development", "Operations"], + "why": "Like many of you in this community, my CTX/TCAP holdings are modest but my enthusiasm is not. I'd be honored to be the voice of other modest holders and help guide the future of this exciting organization. My approach will be to learn and listen.Learn about each proposal and be able to share the considerations of each option.Listen to your input and vote accordingly, even if that means going against the majority vote.\n\nA brief bio: I'm a software solution manager at a Fortune 50 company, leading my team throughout all stages of the product lifecycle. I'm a father of 3 boys, which is even more humbling.I am fascinated by crypto and the power of decentralization.I try to learn more every day.\n\nThanks for considering me! Regardless of who you select as your delegate, congratulations on staking and being part of this great community!" + }, + "dnkta.eth": { + "expertise": ["Operations"], + "why": "Take decisions in best faith for the protocol." + }, + "Huntsman": { + "expertise": ["Economics/Retail Investing"], + "why": "Huntsman is a relative newcomer to cryptocurrency investing, and while he only discovered Cryptex when it was listed on Gemini, his Cryptex journey has seen him allocate over 10% of his investment portfolio into collateralizing vaults, minting TCAP, and providing liquidity on Sushiswap. He is very excited about the potential of this DAO and its community, as well as its flagship TCAP. He is humbly asking for your delegation for those who want to place their stake with a retail everyman who can't wait for the Moon but wants to invest decades into this project to see it to its maximum potential." + }, + "indigo.eth": { + "expertise": ["Development", "Operations"], + "why": "I'm a security expert who specializes in smart contract and operational security auditing.\n\nI will vote for incentivized liquidity and staking, expansion to new projects/networks, and supporting operations that will drive adoption of TCAP." + }, + "Joshua Britt": { + "expertise": ["Development", "Operations"], + "why": "Here to make Ctx better for the future" + }, + "Leo": { + "expertise": ["Operations"], + "why": "I am a long-term crypto investor and builder. I am a big supporter of the cryptex project from the very beginning. I have promoted the project to a large Chinese crypto community with a few thousand people. I have initiated the debank.com integration and get it supported recently.\n\nI would like to represent the Chinese crypto investors in the project and continue supporting and promoting the cryptex project." + }, + "MediumArchibald": { + "expertise": ["Investigative journalist", "Freelance political/legal researcher"], + "why": "My profession is trust- and referral-based. I either present verifiable information, or I don’t get future clients." + }, + "Mr. Brightside": { + "expertise": ["Operations"], + "why": "Passionate about project, mission and vision. Multi-disciplinary background leading my own project and developments including a separate ERC-20 token." + }, + "scottie33": { + "expertise": ["Operations"], + "why": "I am super responsive, trustworthy, and support Cryptex 100%." + }, + "TheyCallMeJim": { + "expertise": ["Development", "Operations"], + "why": "Experienced crypto trader and audit analysis" + } +} \ No newline at end of file diff --git a/public/locales/fr/keepers.json b/public/locales/fr/keepers.json new file mode 100644 index 0000000..ac50236 --- /dev/null +++ b/public/locales/fr/keepers.json @@ -0,0 +1,50 @@ +{ + "brajon.eth": { + "expertise": ["Development"], + "why": "I’ve been a Cryptex supporter since Nov 2020 and see the vision Joe and the team are trying to accomplish. My goal is to help this project reach its potential of creating institutional grade investment products that allow anyone to get exposure to currently nontradeable markets." + }, + "David R Jennings": { + "expertise": ["Investor"], + "why": "Here to invest with ctx long term" + }, + "DesertDwelr": { + "expertise": ["Development", "Operations"], + "why": "Like many of you in this community, my CTX/TCAP holdings are modest but my enthusiasm is not. I'd be honored to be the voice of other modest holders and help guide the future of this exciting organization. My approach will be to learn and listen.Learn about each proposal and be able to share the considerations of each option.Listen to your input and vote accordingly, even if that means going against the majority vote.\n\nA brief bio: I'm a software solution manager at a Fortune 50 company, leading my team throughout all stages of the product lifecycle. I'm a father of 3 boys, which is even more humbling.I am fascinated by crypto and the power of decentralization.I try to learn more every day.\n\nThanks for considering me! Regardless of who you select as your delegate, congratulations on staking and being part of this great community!" + }, + "dnkta.eth": { + "expertise": ["Operations"], + "why": "Take decisions in best faith for the protocol." + }, + "Huntsman": { + "expertise": ["Economics/Retail Investing"], + "why": "Huntsman is a relative newcomer to cryptocurrency investing, and while he only discovered Cryptex when it was listed on Gemini, his Cryptex journey has seen him allocate over 10% of his investment portfolio into collateralizing vaults, minting TCAP, and providing liquidity on Sushiswap. He is very excited about the potential of this DAO and its community, as well as its flagship TCAP. He is humbly asking for your delegation for those who want to place their stake with a retail everyman who can't wait for the Moon but wants to invest decades into this project to see it to its maximum potential." + }, + "indigo.eth": { + "expertise": ["Development", "Operations"], + "why": "I'm a security expert who specializes in smart contract and operational security auditing.\n\nI will vote for incentivized liquidity and staking, expansion to new projects/networks, and supporting operations that will drive adoption of TCAP." + }, + "Joshua Britt": { + "expertise": ["Development", "Operations"], + "why": "Here to make Ctx better for the future" + }, + "Leo": { + "expertise": ["Operations"], + "why": "I am a long-term crypto investor and builder. I am a big supporter of the cryptex project from the very beginning. I have promoted the project to a large Chinese crypto community with a few thousand people. I have initiated the debank.com integration and get it supported recently.\n\nI would like to represent the Chinese crypto investors in the project and continue supporting and promoting the cryptex project." + }, + "MediumArchibald": { + "expertise": ["Investigative journalist", "Freelance political/legal researcher"], + "why": "My profession is trust- and referral-based. I either present verifiable information, or I don’t get future clients." + }, + "Mr. Brightside": { + "expertise": ["Operations"], + "why": "Passionate about project, mission and vision. Multi-disciplinary background leading my own project and developments including a separate ERC-20 token." + }, + "scottie33": { + "expertise": ["Operations"], + "why": "I am super responsive, trustworthy, and support Cryptex 100%." + }, + "TheyCallMeJim": { + "expertise": ["Development", "Operations"], + "why": "Experienced crypto trader and audit analysis" + } +} \ No newline at end of file diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json new file mode 100644 index 0000000..9e37653 --- /dev/null +++ b/public/locales/fr/translation.json @@ -0,0 +1,164 @@ +{ + "balance": "Balance", + "balance2": "Current Balance", + "choose-network": "Choose Network", + "claim": "Claim", + "click-copy": "Click to Copy", + "connect": "Connect Wallet", + "contract": "Contract", + "create": "Create", + "description": "Description", + "exit": "Exit", + "farm": "Farm", + "history": "History", + "inactive": "Inative", + "infinite-approve": "Infinite Approve", + "max": "MAX", + "max-safe": "MAX SAFE", + "mint": "Mint", + "last": "Last", + "loading": "Loading", + "pool": "Pool", + "stake": "Stake", + "stake2": "Amount to Stake", + "staked": "Staked", + "token": "Token", + "tokens": "Tokens", + "trade": "Trade", + "tran-sent": "⏰ Transaction Sent!", + "tran-confirmed": "✔️ Transaction Confirmed!", + "tran-wait": "Plz wait for the transaction confirmation.", + "tran-wait2": "All set, please wait for another confirmation", + "update": "Update", + "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "votes": "Votes", + "wait": "Please wait...", + "welcome": { + "tcap": "Total Cryptocurrency Market Capitalization", + "tcap-token": "Total Cryptocurrency Market Capitalization Token", + "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", + "title1": "My Total Balance", + "subtitle1": "Connected Account", + "title2": "Use TCAP", + "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "title3": "Connect Your Account", + "subtitle3": "Mint TCAP, or check your balance connecting your account", + "tcap-balance": "TCAP Balance", + "ctx-balance": "CTX Balance" + }, + "vault": { + "warning": "", + "loading": "Loading Vault", + "title1": "The Vault", + "subtitle1": "Select your Collateral", + "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", + "approve": "Approve Vault", + "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", + "create": "Create Vault", + "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", + "balance-title": "{{vault}} Balance", + "ratio-title": "Vault Ratio", + "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "collateral": { + "title": "Staked Collateral", + "add": "Add Collateral", + "remove": "Remove Collateral" + }, + "debt": { + "title": "Vault Debt", + "mint": "Mint TCAP", + "burn": "Burn TCAP", + "fee": "Burn Fee" + }, + "status": { + "na": "N/A", + "safe": "safe", + "warning": "warning", + "danger": "danger", + "error": "error" + }, + "errors": { + "no-collateral": "Not enough collateral on vault", + "burn-too-high": "Burn value too high" + } + }, + "pools": { + "pools": "Pools", + "enabled": "Enabled Pools", + "available": "Available Pools", + "liquidity": "Liquidity" + }, + "farming": { + "farming": "Farming", + "minting": "Minting Rewards", + "current-mint": "Current mint", + "current-reward": "Current Reward", + "liquidity": "Liquidity Rewards", + "unlocked": "Unlocked Reward", + "locked": "Locked Reward", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", + "unlocked-info": "Available to claim immediately.", + "locked-info": "Rewards are unlocked 6 months after the start of the pool." + }, + "governance": { + "amount-stake": "Amount to Stake", + "amount-remove": "Amount to Remove", + "new": "New Crypt Keeper", + "respresented": "Represented", + "stake-reward": "Stake Reward", + "staked-reward": "Staked Reward", + "why-me": "Why me?", + "expertise": "Expertise", + "delegate-to": "Delegate to Keeper", + "delegating": "Delegating", + "stake-delegate": "Stake & Delegate", + "stake-info": "Stake and Delegate CTX to this Crypt Keeper. Each time you Stake and Delegate, you must wait a minimum of 7 days before you can withdraw.", + "stake-info2": "Approve delegating CTX tokens. You only have to do this once.", + "withdraw": "Withdraw", + "withdrawing": "Withdrawing", + "withdraw-info": "Remove delegated votes from this Crypt Keeper. CTX must be staked and delegated for a minimum of 7 days before you are eligible to withdraw.", + "withdraw-info2": "* Eligible to withdraw on {{date}}", + "form": { + "create": "Create Crypt Keeper", + "keeper": "Keeper eth name or address", + "name": "Name" + }, + "success": { + "title": "Crypt. Keepers", + "message": "Crypt Keeper updated" + }, + "errors": { + "creating-keeper": "Error creating keeper.", + "exists": "Crypt Keeper for the address already exists.", + "invalid-amount": "Invalid amount to withdraw", + "invalid-ens-address": "Please enter a valid eth name or address", + "invalid-twitter": "It is not a valid twitter username", + "invalid-discord": "It is not a valid discord id", + "need-to-wait": "Need to wait the minimum staking period", + "too-long": "Field is too long ({{max}} characters max)" + } + }, + "graph": { + "staked-usd": "Total Staked in USD", + "staked-eth": "Total Staked in ETH", + "staked-dai": "Total Staked in DAI", + "staked-aave": "Total Staked in AAVE", + "staked-link": "Total Staked in LINK", + "staked-matic": "Total Staked in MATIC", + "total-supply": "Total Supply", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price" + }, + "errors": { + "empty": "Field can't be empty", + "invalid-address": "Please enter a valid address", + "invalid-ens": "Please enter a valid ENS name", + "invalid-file-type": "Invalid file type.", + "invalid-image-size": "Image max size is {{size}} KB", + "no-ctx": "Not enough CTX balance.", + "no-funds": "Insufficient funds to stake", + "not-approve": "Token not Approved", + "tran-rejected": "Transaction rejected", + "unexpected": "Unexpected error" + } +} \ No newline at end of file diff --git a/public/locales/hi_IN/keepers.json b/public/locales/hi_IN/keepers.json new file mode 100644 index 0000000..ac50236 --- /dev/null +++ b/public/locales/hi_IN/keepers.json @@ -0,0 +1,50 @@ +{ + "brajon.eth": { + "expertise": ["Development"], + "why": "I’ve been a Cryptex supporter since Nov 2020 and see the vision Joe and the team are trying to accomplish. My goal is to help this project reach its potential of creating institutional grade investment products that allow anyone to get exposure to currently nontradeable markets." + }, + "David R Jennings": { + "expertise": ["Investor"], + "why": "Here to invest with ctx long term" + }, + "DesertDwelr": { + "expertise": ["Development", "Operations"], + "why": "Like many of you in this community, my CTX/TCAP holdings are modest but my enthusiasm is not. I'd be honored to be the voice of other modest holders and help guide the future of this exciting organization. My approach will be to learn and listen.Learn about each proposal and be able to share the considerations of each option.Listen to your input and vote accordingly, even if that means going against the majority vote.\n\nA brief bio: I'm a software solution manager at a Fortune 50 company, leading my team throughout all stages of the product lifecycle. I'm a father of 3 boys, which is even more humbling.I am fascinated by crypto and the power of decentralization.I try to learn more every day.\n\nThanks for considering me! Regardless of who you select as your delegate, congratulations on staking and being part of this great community!" + }, + "dnkta.eth": { + "expertise": ["Operations"], + "why": "Take decisions in best faith for the protocol." + }, + "Huntsman": { + "expertise": ["Economics/Retail Investing"], + "why": "Huntsman is a relative newcomer to cryptocurrency investing, and while he only discovered Cryptex when it was listed on Gemini, his Cryptex journey has seen him allocate over 10% of his investment portfolio into collateralizing vaults, minting TCAP, and providing liquidity on Sushiswap. He is very excited about the potential of this DAO and its community, as well as its flagship TCAP. He is humbly asking for your delegation for those who want to place their stake with a retail everyman who can't wait for the Moon but wants to invest decades into this project to see it to its maximum potential." + }, + "indigo.eth": { + "expertise": ["Development", "Operations"], + "why": "I'm a security expert who specializes in smart contract and operational security auditing.\n\nI will vote for incentivized liquidity and staking, expansion to new projects/networks, and supporting operations that will drive adoption of TCAP." + }, + "Joshua Britt": { + "expertise": ["Development", "Operations"], + "why": "Here to make Ctx better for the future" + }, + "Leo": { + "expertise": ["Operations"], + "why": "I am a long-term crypto investor and builder. I am a big supporter of the cryptex project from the very beginning. I have promoted the project to a large Chinese crypto community with a few thousand people. I have initiated the debank.com integration and get it supported recently.\n\nI would like to represent the Chinese crypto investors in the project and continue supporting and promoting the cryptex project." + }, + "MediumArchibald": { + "expertise": ["Investigative journalist", "Freelance political/legal researcher"], + "why": "My profession is trust- and referral-based. I either present verifiable information, or I don’t get future clients." + }, + "Mr. Brightside": { + "expertise": ["Operations"], + "why": "Passionate about project, mission and vision. Multi-disciplinary background leading my own project and developments including a separate ERC-20 token." + }, + "scottie33": { + "expertise": ["Operations"], + "why": "I am super responsive, trustworthy, and support Cryptex 100%." + }, + "TheyCallMeJim": { + "expertise": ["Development", "Operations"], + "why": "Experienced crypto trader and audit analysis" + } +} \ No newline at end of file diff --git a/public/locales/hi_IN/translation.json b/public/locales/hi_IN/translation.json new file mode 100644 index 0000000..9e37653 --- /dev/null +++ b/public/locales/hi_IN/translation.json @@ -0,0 +1,164 @@ +{ + "balance": "Balance", + "balance2": "Current Balance", + "choose-network": "Choose Network", + "claim": "Claim", + "click-copy": "Click to Copy", + "connect": "Connect Wallet", + "contract": "Contract", + "create": "Create", + "description": "Description", + "exit": "Exit", + "farm": "Farm", + "history": "History", + "inactive": "Inative", + "infinite-approve": "Infinite Approve", + "max": "MAX", + "max-safe": "MAX SAFE", + "mint": "Mint", + "last": "Last", + "loading": "Loading", + "pool": "Pool", + "stake": "Stake", + "stake2": "Amount to Stake", + "staked": "Staked", + "token": "Token", + "tokens": "Tokens", + "trade": "Trade", + "tran-sent": "⏰ Transaction Sent!", + "tran-confirmed": "✔️ Transaction Confirmed!", + "tran-wait": "Plz wait for the transaction confirmation.", + "tran-wait2": "All set, please wait for another confirmation", + "update": "Update", + "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "votes": "Votes", + "wait": "Please wait...", + "welcome": { + "tcap": "Total Cryptocurrency Market Capitalization", + "tcap-token": "Total Cryptocurrency Market Capitalization Token", + "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", + "title1": "My Total Balance", + "subtitle1": "Connected Account", + "title2": "Use TCAP", + "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "title3": "Connect Your Account", + "subtitle3": "Mint TCAP, or check your balance connecting your account", + "tcap-balance": "TCAP Balance", + "ctx-balance": "CTX Balance" + }, + "vault": { + "warning": "", + "loading": "Loading Vault", + "title1": "The Vault", + "subtitle1": "Select your Collateral", + "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", + "approve": "Approve Vault", + "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", + "create": "Create Vault", + "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", + "balance-title": "{{vault}} Balance", + "ratio-title": "Vault Ratio", + "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "collateral": { + "title": "Staked Collateral", + "add": "Add Collateral", + "remove": "Remove Collateral" + }, + "debt": { + "title": "Vault Debt", + "mint": "Mint TCAP", + "burn": "Burn TCAP", + "fee": "Burn Fee" + }, + "status": { + "na": "N/A", + "safe": "safe", + "warning": "warning", + "danger": "danger", + "error": "error" + }, + "errors": { + "no-collateral": "Not enough collateral on vault", + "burn-too-high": "Burn value too high" + } + }, + "pools": { + "pools": "Pools", + "enabled": "Enabled Pools", + "available": "Available Pools", + "liquidity": "Liquidity" + }, + "farming": { + "farming": "Farming", + "minting": "Minting Rewards", + "current-mint": "Current mint", + "current-reward": "Current Reward", + "liquidity": "Liquidity Rewards", + "unlocked": "Unlocked Reward", + "locked": "Locked Reward", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", + "unlocked-info": "Available to claim immediately.", + "locked-info": "Rewards are unlocked 6 months after the start of the pool." + }, + "governance": { + "amount-stake": "Amount to Stake", + "amount-remove": "Amount to Remove", + "new": "New Crypt Keeper", + "respresented": "Represented", + "stake-reward": "Stake Reward", + "staked-reward": "Staked Reward", + "why-me": "Why me?", + "expertise": "Expertise", + "delegate-to": "Delegate to Keeper", + "delegating": "Delegating", + "stake-delegate": "Stake & Delegate", + "stake-info": "Stake and Delegate CTX to this Crypt Keeper. Each time you Stake and Delegate, you must wait a minimum of 7 days before you can withdraw.", + "stake-info2": "Approve delegating CTX tokens. You only have to do this once.", + "withdraw": "Withdraw", + "withdrawing": "Withdrawing", + "withdraw-info": "Remove delegated votes from this Crypt Keeper. CTX must be staked and delegated for a minimum of 7 days before you are eligible to withdraw.", + "withdraw-info2": "* Eligible to withdraw on {{date}}", + "form": { + "create": "Create Crypt Keeper", + "keeper": "Keeper eth name or address", + "name": "Name" + }, + "success": { + "title": "Crypt. Keepers", + "message": "Crypt Keeper updated" + }, + "errors": { + "creating-keeper": "Error creating keeper.", + "exists": "Crypt Keeper for the address already exists.", + "invalid-amount": "Invalid amount to withdraw", + "invalid-ens-address": "Please enter a valid eth name or address", + "invalid-twitter": "It is not a valid twitter username", + "invalid-discord": "It is not a valid discord id", + "need-to-wait": "Need to wait the minimum staking period", + "too-long": "Field is too long ({{max}} characters max)" + } + }, + "graph": { + "staked-usd": "Total Staked in USD", + "staked-eth": "Total Staked in ETH", + "staked-dai": "Total Staked in DAI", + "staked-aave": "Total Staked in AAVE", + "staked-link": "Total Staked in LINK", + "staked-matic": "Total Staked in MATIC", + "total-supply": "Total Supply", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price" + }, + "errors": { + "empty": "Field can't be empty", + "invalid-address": "Please enter a valid address", + "invalid-ens": "Please enter a valid ENS name", + "invalid-file-type": "Invalid file type.", + "invalid-image-size": "Image max size is {{size}} KB", + "no-ctx": "Not enough CTX balance.", + "no-funds": "Insufficient funds to stake", + "not-approve": "Token not Approved", + "tran-rejected": "Transaction rejected", + "unexpected": "Unexpected error" + } +} \ No newline at end of file diff --git a/public/locales/it/keepers.json b/public/locales/it/keepers.json new file mode 100644 index 0000000..ac50236 --- /dev/null +++ b/public/locales/it/keepers.json @@ -0,0 +1,50 @@ +{ + "brajon.eth": { + "expertise": ["Development"], + "why": "I’ve been a Cryptex supporter since Nov 2020 and see the vision Joe and the team are trying to accomplish. My goal is to help this project reach its potential of creating institutional grade investment products that allow anyone to get exposure to currently nontradeable markets." + }, + "David R Jennings": { + "expertise": ["Investor"], + "why": "Here to invest with ctx long term" + }, + "DesertDwelr": { + "expertise": ["Development", "Operations"], + "why": "Like many of you in this community, my CTX/TCAP holdings are modest but my enthusiasm is not. I'd be honored to be the voice of other modest holders and help guide the future of this exciting organization. My approach will be to learn and listen.Learn about each proposal and be able to share the considerations of each option.Listen to your input and vote accordingly, even if that means going against the majority vote.\n\nA brief bio: I'm a software solution manager at a Fortune 50 company, leading my team throughout all stages of the product lifecycle. I'm a father of 3 boys, which is even more humbling.I am fascinated by crypto and the power of decentralization.I try to learn more every day.\n\nThanks for considering me! Regardless of who you select as your delegate, congratulations on staking and being part of this great community!" + }, + "dnkta.eth": { + "expertise": ["Operations"], + "why": "Take decisions in best faith for the protocol." + }, + "Huntsman": { + "expertise": ["Economics/Retail Investing"], + "why": "Huntsman is a relative newcomer to cryptocurrency investing, and while he only discovered Cryptex when it was listed on Gemini, his Cryptex journey has seen him allocate over 10% of his investment portfolio into collateralizing vaults, minting TCAP, and providing liquidity on Sushiswap. He is very excited about the potential of this DAO and its community, as well as its flagship TCAP. He is humbly asking for your delegation for those who want to place their stake with a retail everyman who can't wait for the Moon but wants to invest decades into this project to see it to its maximum potential." + }, + "indigo.eth": { + "expertise": ["Development", "Operations"], + "why": "I'm a security expert who specializes in smart contract and operational security auditing.\n\nI will vote for incentivized liquidity and staking, expansion to new projects/networks, and supporting operations that will drive adoption of TCAP." + }, + "Joshua Britt": { + "expertise": ["Development", "Operations"], + "why": "Here to make Ctx better for the future" + }, + "Leo": { + "expertise": ["Operations"], + "why": "I am a long-term crypto investor and builder. I am a big supporter of the cryptex project from the very beginning. I have promoted the project to a large Chinese crypto community with a few thousand people. I have initiated the debank.com integration and get it supported recently.\n\nI would like to represent the Chinese crypto investors in the project and continue supporting and promoting the cryptex project." + }, + "MediumArchibald": { + "expertise": ["Investigative journalist", "Freelance political/legal researcher"], + "why": "My profession is trust- and referral-based. I either present verifiable information, or I don’t get future clients." + }, + "Mr. Brightside": { + "expertise": ["Operations"], + "why": "Passionate about project, mission and vision. Multi-disciplinary background leading my own project and developments including a separate ERC-20 token." + }, + "scottie33": { + "expertise": ["Operations"], + "why": "I am super responsive, trustworthy, and support Cryptex 100%." + }, + "TheyCallMeJim": { + "expertise": ["Development", "Operations"], + "why": "Experienced crypto trader and audit analysis" + } +} \ No newline at end of file diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json new file mode 100644 index 0000000..9e37653 --- /dev/null +++ b/public/locales/it/translation.json @@ -0,0 +1,164 @@ +{ + "balance": "Balance", + "balance2": "Current Balance", + "choose-network": "Choose Network", + "claim": "Claim", + "click-copy": "Click to Copy", + "connect": "Connect Wallet", + "contract": "Contract", + "create": "Create", + "description": "Description", + "exit": "Exit", + "farm": "Farm", + "history": "History", + "inactive": "Inative", + "infinite-approve": "Infinite Approve", + "max": "MAX", + "max-safe": "MAX SAFE", + "mint": "Mint", + "last": "Last", + "loading": "Loading", + "pool": "Pool", + "stake": "Stake", + "stake2": "Amount to Stake", + "staked": "Staked", + "token": "Token", + "tokens": "Tokens", + "trade": "Trade", + "tran-sent": "⏰ Transaction Sent!", + "tran-confirmed": "✔️ Transaction Confirmed!", + "tran-wait": "Plz wait for the transaction confirmation.", + "tran-wait2": "All set, please wait for another confirmation", + "update": "Update", + "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "votes": "Votes", + "wait": "Please wait...", + "welcome": { + "tcap": "Total Cryptocurrency Market Capitalization", + "tcap-token": "Total Cryptocurrency Market Capitalization Token", + "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", + "title1": "My Total Balance", + "subtitle1": "Connected Account", + "title2": "Use TCAP", + "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "title3": "Connect Your Account", + "subtitle3": "Mint TCAP, or check your balance connecting your account", + "tcap-balance": "TCAP Balance", + "ctx-balance": "CTX Balance" + }, + "vault": { + "warning": "", + "loading": "Loading Vault", + "title1": "The Vault", + "subtitle1": "Select your Collateral", + "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", + "approve": "Approve Vault", + "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", + "create": "Create Vault", + "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", + "balance-title": "{{vault}} Balance", + "ratio-title": "Vault Ratio", + "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "collateral": { + "title": "Staked Collateral", + "add": "Add Collateral", + "remove": "Remove Collateral" + }, + "debt": { + "title": "Vault Debt", + "mint": "Mint TCAP", + "burn": "Burn TCAP", + "fee": "Burn Fee" + }, + "status": { + "na": "N/A", + "safe": "safe", + "warning": "warning", + "danger": "danger", + "error": "error" + }, + "errors": { + "no-collateral": "Not enough collateral on vault", + "burn-too-high": "Burn value too high" + } + }, + "pools": { + "pools": "Pools", + "enabled": "Enabled Pools", + "available": "Available Pools", + "liquidity": "Liquidity" + }, + "farming": { + "farming": "Farming", + "minting": "Minting Rewards", + "current-mint": "Current mint", + "current-reward": "Current Reward", + "liquidity": "Liquidity Rewards", + "unlocked": "Unlocked Reward", + "locked": "Locked Reward", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", + "unlocked-info": "Available to claim immediately.", + "locked-info": "Rewards are unlocked 6 months after the start of the pool." + }, + "governance": { + "amount-stake": "Amount to Stake", + "amount-remove": "Amount to Remove", + "new": "New Crypt Keeper", + "respresented": "Represented", + "stake-reward": "Stake Reward", + "staked-reward": "Staked Reward", + "why-me": "Why me?", + "expertise": "Expertise", + "delegate-to": "Delegate to Keeper", + "delegating": "Delegating", + "stake-delegate": "Stake & Delegate", + "stake-info": "Stake and Delegate CTX to this Crypt Keeper. Each time you Stake and Delegate, you must wait a minimum of 7 days before you can withdraw.", + "stake-info2": "Approve delegating CTX tokens. You only have to do this once.", + "withdraw": "Withdraw", + "withdrawing": "Withdrawing", + "withdraw-info": "Remove delegated votes from this Crypt Keeper. CTX must be staked and delegated for a minimum of 7 days before you are eligible to withdraw.", + "withdraw-info2": "* Eligible to withdraw on {{date}}", + "form": { + "create": "Create Crypt Keeper", + "keeper": "Keeper eth name or address", + "name": "Name" + }, + "success": { + "title": "Crypt. Keepers", + "message": "Crypt Keeper updated" + }, + "errors": { + "creating-keeper": "Error creating keeper.", + "exists": "Crypt Keeper for the address already exists.", + "invalid-amount": "Invalid amount to withdraw", + "invalid-ens-address": "Please enter a valid eth name or address", + "invalid-twitter": "It is not a valid twitter username", + "invalid-discord": "It is not a valid discord id", + "need-to-wait": "Need to wait the minimum staking period", + "too-long": "Field is too long ({{max}} characters max)" + } + }, + "graph": { + "staked-usd": "Total Staked in USD", + "staked-eth": "Total Staked in ETH", + "staked-dai": "Total Staked in DAI", + "staked-aave": "Total Staked in AAVE", + "staked-link": "Total Staked in LINK", + "staked-matic": "Total Staked in MATIC", + "total-supply": "Total Supply", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price" + }, + "errors": { + "empty": "Field can't be empty", + "invalid-address": "Please enter a valid address", + "invalid-ens": "Please enter a valid ENS name", + "invalid-file-type": "Invalid file type.", + "invalid-image-size": "Image max size is {{size}} KB", + "no-ctx": "Not enough CTX balance.", + "no-funds": "Insufficient funds to stake", + "not-approve": "Token not Approved", + "tran-rejected": "Transaction rejected", + "unexpected": "Unexpected error" + } +} \ No newline at end of file diff --git a/public/locales/pt/keepers.json b/public/locales/pt/keepers.json new file mode 100644 index 0000000..ac50236 --- /dev/null +++ b/public/locales/pt/keepers.json @@ -0,0 +1,50 @@ +{ + "brajon.eth": { + "expertise": ["Development"], + "why": "I’ve been a Cryptex supporter since Nov 2020 and see the vision Joe and the team are trying to accomplish. My goal is to help this project reach its potential of creating institutional grade investment products that allow anyone to get exposure to currently nontradeable markets." + }, + "David R Jennings": { + "expertise": ["Investor"], + "why": "Here to invest with ctx long term" + }, + "DesertDwelr": { + "expertise": ["Development", "Operations"], + "why": "Like many of you in this community, my CTX/TCAP holdings are modest but my enthusiasm is not. I'd be honored to be the voice of other modest holders and help guide the future of this exciting organization. My approach will be to learn and listen.Learn about each proposal and be able to share the considerations of each option.Listen to your input and vote accordingly, even if that means going against the majority vote.\n\nA brief bio: I'm a software solution manager at a Fortune 50 company, leading my team throughout all stages of the product lifecycle. I'm a father of 3 boys, which is even more humbling.I am fascinated by crypto and the power of decentralization.I try to learn more every day.\n\nThanks for considering me! Regardless of who you select as your delegate, congratulations on staking and being part of this great community!" + }, + "dnkta.eth": { + "expertise": ["Operations"], + "why": "Take decisions in best faith for the protocol." + }, + "Huntsman": { + "expertise": ["Economics/Retail Investing"], + "why": "Huntsman is a relative newcomer to cryptocurrency investing, and while he only discovered Cryptex when it was listed on Gemini, his Cryptex journey has seen him allocate over 10% of his investment portfolio into collateralizing vaults, minting TCAP, and providing liquidity on Sushiswap. He is very excited about the potential of this DAO and its community, as well as its flagship TCAP. He is humbly asking for your delegation for those who want to place their stake with a retail everyman who can't wait for the Moon but wants to invest decades into this project to see it to its maximum potential." + }, + "indigo.eth": { + "expertise": ["Development", "Operations"], + "why": "I'm a security expert who specializes in smart contract and operational security auditing.\n\nI will vote for incentivized liquidity and staking, expansion to new projects/networks, and supporting operations that will drive adoption of TCAP." + }, + "Joshua Britt": { + "expertise": ["Development", "Operations"], + "why": "Here to make Ctx better for the future" + }, + "Leo": { + "expertise": ["Operations"], + "why": "I am a long-term crypto investor and builder. I am a big supporter of the cryptex project from the very beginning. I have promoted the project to a large Chinese crypto community with a few thousand people. I have initiated the debank.com integration and get it supported recently.\n\nI would like to represent the Chinese crypto investors in the project and continue supporting and promoting the cryptex project." + }, + "MediumArchibald": { + "expertise": ["Investigative journalist", "Freelance political/legal researcher"], + "why": "My profession is trust- and referral-based. I either present verifiable information, or I don’t get future clients." + }, + "Mr. Brightside": { + "expertise": ["Operations"], + "why": "Passionate about project, mission and vision. Multi-disciplinary background leading my own project and developments including a separate ERC-20 token." + }, + "scottie33": { + "expertise": ["Operations"], + "why": "I am super responsive, trustworthy, and support Cryptex 100%." + }, + "TheyCallMeJim": { + "expertise": ["Development", "Operations"], + "why": "Experienced crypto trader and audit analysis" + } +} \ No newline at end of file diff --git a/public/locales/pt/translation.json b/public/locales/pt/translation.json new file mode 100644 index 0000000..9e37653 --- /dev/null +++ b/public/locales/pt/translation.json @@ -0,0 +1,164 @@ +{ + "balance": "Balance", + "balance2": "Current Balance", + "choose-network": "Choose Network", + "claim": "Claim", + "click-copy": "Click to Copy", + "connect": "Connect Wallet", + "contract": "Contract", + "create": "Create", + "description": "Description", + "exit": "Exit", + "farm": "Farm", + "history": "History", + "inactive": "Inative", + "infinite-approve": "Infinite Approve", + "max": "MAX", + "max-safe": "MAX SAFE", + "mint": "Mint", + "last": "Last", + "loading": "Loading", + "pool": "Pool", + "stake": "Stake", + "stake2": "Amount to Stake", + "staked": "Staked", + "token": "Token", + "tokens": "Tokens", + "trade": "Trade", + "tran-sent": "⏰ Transaction Sent!", + "tran-confirmed": "✔️ Transaction Confirmed!", + "tran-wait": "Plz wait for the transaction confirmation.", + "tran-wait2": "All set, please wait for another confirmation", + "update": "Update", + "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "votes": "Votes", + "wait": "Please wait...", + "welcome": { + "tcap": "Total Cryptocurrency Market Capitalization", + "tcap-token": "Total Cryptocurrency Market Capitalization Token", + "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", + "title1": "My Total Balance", + "subtitle1": "Connected Account", + "title2": "Use TCAP", + "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "title3": "Connect Your Account", + "subtitle3": "Mint TCAP, or check your balance connecting your account", + "tcap-balance": "TCAP Balance", + "ctx-balance": "CTX Balance" + }, + "vault": { + "warning": "", + "loading": "Loading Vault", + "title1": "The Vault", + "subtitle1": "Select your Collateral", + "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", + "approve": "Approve Vault", + "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", + "create": "Create Vault", + "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", + "balance-title": "{{vault}} Balance", + "ratio-title": "Vault Ratio", + "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "collateral": { + "title": "Staked Collateral", + "add": "Add Collateral", + "remove": "Remove Collateral" + }, + "debt": { + "title": "Vault Debt", + "mint": "Mint TCAP", + "burn": "Burn TCAP", + "fee": "Burn Fee" + }, + "status": { + "na": "N/A", + "safe": "safe", + "warning": "warning", + "danger": "danger", + "error": "error" + }, + "errors": { + "no-collateral": "Not enough collateral on vault", + "burn-too-high": "Burn value too high" + } + }, + "pools": { + "pools": "Pools", + "enabled": "Enabled Pools", + "available": "Available Pools", + "liquidity": "Liquidity" + }, + "farming": { + "farming": "Farming", + "minting": "Minting Rewards", + "current-mint": "Current mint", + "current-reward": "Current Reward", + "liquidity": "Liquidity Rewards", + "unlocked": "Unlocked Reward", + "locked": "Locked Reward", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", + "unlocked-info": "Available to claim immediately.", + "locked-info": "Rewards are unlocked 6 months after the start of the pool." + }, + "governance": { + "amount-stake": "Amount to Stake", + "amount-remove": "Amount to Remove", + "new": "New Crypt Keeper", + "respresented": "Represented", + "stake-reward": "Stake Reward", + "staked-reward": "Staked Reward", + "why-me": "Why me?", + "expertise": "Expertise", + "delegate-to": "Delegate to Keeper", + "delegating": "Delegating", + "stake-delegate": "Stake & Delegate", + "stake-info": "Stake and Delegate CTX to this Crypt Keeper. Each time you Stake and Delegate, you must wait a minimum of 7 days before you can withdraw.", + "stake-info2": "Approve delegating CTX tokens. You only have to do this once.", + "withdraw": "Withdraw", + "withdrawing": "Withdrawing", + "withdraw-info": "Remove delegated votes from this Crypt Keeper. CTX must be staked and delegated for a minimum of 7 days before you are eligible to withdraw.", + "withdraw-info2": "* Eligible to withdraw on {{date}}", + "form": { + "create": "Create Crypt Keeper", + "keeper": "Keeper eth name or address", + "name": "Name" + }, + "success": { + "title": "Crypt. Keepers", + "message": "Crypt Keeper updated" + }, + "errors": { + "creating-keeper": "Error creating keeper.", + "exists": "Crypt Keeper for the address already exists.", + "invalid-amount": "Invalid amount to withdraw", + "invalid-ens-address": "Please enter a valid eth name or address", + "invalid-twitter": "It is not a valid twitter username", + "invalid-discord": "It is not a valid discord id", + "need-to-wait": "Need to wait the minimum staking period", + "too-long": "Field is too long ({{max}} characters max)" + } + }, + "graph": { + "staked-usd": "Total Staked in USD", + "staked-eth": "Total Staked in ETH", + "staked-dai": "Total Staked in DAI", + "staked-aave": "Total Staked in AAVE", + "staked-link": "Total Staked in LINK", + "staked-matic": "Total Staked in MATIC", + "total-supply": "Total Supply", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price" + }, + "errors": { + "empty": "Field can't be empty", + "invalid-address": "Please enter a valid address", + "invalid-ens": "Please enter a valid ENS name", + "invalid-file-type": "Invalid file type.", + "invalid-image-size": "Image max size is {{size}} KB", + "no-ctx": "Not enough CTX balance.", + "no-funds": "Insufficient funds to stake", + "not-approve": "Token not Approved", + "tran-rejected": "Transaction rejected", + "unexpected": "Unexpected error" + } +} \ No newline at end of file diff --git a/public/locales/tr/keepers.json b/public/locales/tr/keepers.json new file mode 100644 index 0000000..ac50236 --- /dev/null +++ b/public/locales/tr/keepers.json @@ -0,0 +1,50 @@ +{ + "brajon.eth": { + "expertise": ["Development"], + "why": "I’ve been a Cryptex supporter since Nov 2020 and see the vision Joe and the team are trying to accomplish. My goal is to help this project reach its potential of creating institutional grade investment products that allow anyone to get exposure to currently nontradeable markets." + }, + "David R Jennings": { + "expertise": ["Investor"], + "why": "Here to invest with ctx long term" + }, + "DesertDwelr": { + "expertise": ["Development", "Operations"], + "why": "Like many of you in this community, my CTX/TCAP holdings are modest but my enthusiasm is not. I'd be honored to be the voice of other modest holders and help guide the future of this exciting organization. My approach will be to learn and listen.Learn about each proposal and be able to share the considerations of each option.Listen to your input and vote accordingly, even if that means going against the majority vote.\n\nA brief bio: I'm a software solution manager at a Fortune 50 company, leading my team throughout all stages of the product lifecycle. I'm a father of 3 boys, which is even more humbling.I am fascinated by crypto and the power of decentralization.I try to learn more every day.\n\nThanks for considering me! Regardless of who you select as your delegate, congratulations on staking and being part of this great community!" + }, + "dnkta.eth": { + "expertise": ["Operations"], + "why": "Take decisions in best faith for the protocol." + }, + "Huntsman": { + "expertise": ["Economics/Retail Investing"], + "why": "Huntsman is a relative newcomer to cryptocurrency investing, and while he only discovered Cryptex when it was listed on Gemini, his Cryptex journey has seen him allocate over 10% of his investment portfolio into collateralizing vaults, minting TCAP, and providing liquidity on Sushiswap. He is very excited about the potential of this DAO and its community, as well as its flagship TCAP. He is humbly asking for your delegation for those who want to place their stake with a retail everyman who can't wait for the Moon but wants to invest decades into this project to see it to its maximum potential." + }, + "indigo.eth": { + "expertise": ["Development", "Operations"], + "why": "I'm a security expert who specializes in smart contract and operational security auditing.\n\nI will vote for incentivized liquidity and staking, expansion to new projects/networks, and supporting operations that will drive adoption of TCAP." + }, + "Joshua Britt": { + "expertise": ["Development", "Operations"], + "why": "Here to make Ctx better for the future" + }, + "Leo": { + "expertise": ["Operations"], + "why": "I am a long-term crypto investor and builder. I am a big supporter of the cryptex project from the very beginning. I have promoted the project to a large Chinese crypto community with a few thousand people. I have initiated the debank.com integration and get it supported recently.\n\nI would like to represent the Chinese crypto investors in the project and continue supporting and promoting the cryptex project." + }, + "MediumArchibald": { + "expertise": ["Investigative journalist", "Freelance political/legal researcher"], + "why": "My profession is trust- and referral-based. I either present verifiable information, or I don’t get future clients." + }, + "Mr. Brightside": { + "expertise": ["Operations"], + "why": "Passionate about project, mission and vision. Multi-disciplinary background leading my own project and developments including a separate ERC-20 token." + }, + "scottie33": { + "expertise": ["Operations"], + "why": "I am super responsive, trustworthy, and support Cryptex 100%." + }, + "TheyCallMeJim": { + "expertise": ["Development", "Operations"], + "why": "Experienced crypto trader and audit analysis" + } +} \ No newline at end of file diff --git a/public/locales/tr/translation.json b/public/locales/tr/translation.json new file mode 100644 index 0000000..9e37653 --- /dev/null +++ b/public/locales/tr/translation.json @@ -0,0 +1,164 @@ +{ + "balance": "Balance", + "balance2": "Current Balance", + "choose-network": "Choose Network", + "claim": "Claim", + "click-copy": "Click to Copy", + "connect": "Connect Wallet", + "contract": "Contract", + "create": "Create", + "description": "Description", + "exit": "Exit", + "farm": "Farm", + "history": "History", + "inactive": "Inative", + "infinite-approve": "Infinite Approve", + "max": "MAX", + "max-safe": "MAX SAFE", + "mint": "Mint", + "last": "Last", + "loading": "Loading", + "pool": "Pool", + "stake": "Stake", + "stake2": "Amount to Stake", + "staked": "Staked", + "token": "Token", + "tokens": "Tokens", + "trade": "Trade", + "tran-sent": "⏰ Transaction Sent!", + "tran-confirmed": "✔️ Transaction Confirmed!", + "tran-wait": "Plz wait for the transaction confirmation.", + "tran-wait2": "All set, please wait for another confirmation", + "update": "Update", + "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "votes": "Votes", + "wait": "Please wait...", + "welcome": { + "tcap": "Total Cryptocurrency Market Capitalization", + "tcap-token": "Total Cryptocurrency Market Capitalization Token", + "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", + "title1": "My Total Balance", + "subtitle1": "Connected Account", + "title2": "Use TCAP", + "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "title3": "Connect Your Account", + "subtitle3": "Mint TCAP, or check your balance connecting your account", + "tcap-balance": "TCAP Balance", + "ctx-balance": "CTX Balance" + }, + "vault": { + "warning": "", + "loading": "Loading Vault", + "title1": "The Vault", + "subtitle1": "Select your Collateral", + "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", + "approve": "Approve Vault", + "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", + "create": "Create Vault", + "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", + "balance-title": "{{vault}} Balance", + "ratio-title": "Vault Ratio", + "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "collateral": { + "title": "Staked Collateral", + "add": "Add Collateral", + "remove": "Remove Collateral" + }, + "debt": { + "title": "Vault Debt", + "mint": "Mint TCAP", + "burn": "Burn TCAP", + "fee": "Burn Fee" + }, + "status": { + "na": "N/A", + "safe": "safe", + "warning": "warning", + "danger": "danger", + "error": "error" + }, + "errors": { + "no-collateral": "Not enough collateral on vault", + "burn-too-high": "Burn value too high" + } + }, + "pools": { + "pools": "Pools", + "enabled": "Enabled Pools", + "available": "Available Pools", + "liquidity": "Liquidity" + }, + "farming": { + "farming": "Farming", + "minting": "Minting Rewards", + "current-mint": "Current mint", + "current-reward": "Current Reward", + "liquidity": "Liquidity Rewards", + "unlocked": "Unlocked Reward", + "locked": "Locked Reward", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", + "unlocked-info": "Available to claim immediately.", + "locked-info": "Rewards are unlocked 6 months after the start of the pool." + }, + "governance": { + "amount-stake": "Amount to Stake", + "amount-remove": "Amount to Remove", + "new": "New Crypt Keeper", + "respresented": "Represented", + "stake-reward": "Stake Reward", + "staked-reward": "Staked Reward", + "why-me": "Why me?", + "expertise": "Expertise", + "delegate-to": "Delegate to Keeper", + "delegating": "Delegating", + "stake-delegate": "Stake & Delegate", + "stake-info": "Stake and Delegate CTX to this Crypt Keeper. Each time you Stake and Delegate, you must wait a minimum of 7 days before you can withdraw.", + "stake-info2": "Approve delegating CTX tokens. You only have to do this once.", + "withdraw": "Withdraw", + "withdrawing": "Withdrawing", + "withdraw-info": "Remove delegated votes from this Crypt Keeper. CTX must be staked and delegated for a minimum of 7 days before you are eligible to withdraw.", + "withdraw-info2": "* Eligible to withdraw on {{date}}", + "form": { + "create": "Create Crypt Keeper", + "keeper": "Keeper eth name or address", + "name": "Name" + }, + "success": { + "title": "Crypt. Keepers", + "message": "Crypt Keeper updated" + }, + "errors": { + "creating-keeper": "Error creating keeper.", + "exists": "Crypt Keeper for the address already exists.", + "invalid-amount": "Invalid amount to withdraw", + "invalid-ens-address": "Please enter a valid eth name or address", + "invalid-twitter": "It is not a valid twitter username", + "invalid-discord": "It is not a valid discord id", + "need-to-wait": "Need to wait the minimum staking period", + "too-long": "Field is too long ({{max}} characters max)" + } + }, + "graph": { + "staked-usd": "Total Staked in USD", + "staked-eth": "Total Staked in ETH", + "staked-dai": "Total Staked in DAI", + "staked-aave": "Total Staked in AAVE", + "staked-link": "Total Staked in LINK", + "staked-matic": "Total Staked in MATIC", + "total-supply": "Total Supply", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price" + }, + "errors": { + "empty": "Field can't be empty", + "invalid-address": "Please enter a valid address", + "invalid-ens": "Please enter a valid ENS name", + "invalid-file-type": "Invalid file type.", + "invalid-image-size": "Image max size is {{size}} KB", + "no-ctx": "Not enough CTX balance.", + "no-funds": "Insufficient funds to stake", + "not-approve": "Token not Approved", + "tran-rejected": "Transaction rejected", + "unexpected": "Unexpected error" + } +} \ No newline at end of file diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json new file mode 100644 index 0000000..9e37653 --- /dev/null +++ b/public/locales/zh/translation.json @@ -0,0 +1,164 @@ +{ + "balance": "Balance", + "balance2": "Current Balance", + "choose-network": "Choose Network", + "claim": "Claim", + "click-copy": "Click to Copy", + "connect": "Connect Wallet", + "contract": "Contract", + "create": "Create", + "description": "Description", + "exit": "Exit", + "farm": "Farm", + "history": "History", + "inactive": "Inative", + "infinite-approve": "Infinite Approve", + "max": "MAX", + "max-safe": "MAX SAFE", + "mint": "Mint", + "last": "Last", + "loading": "Loading", + "pool": "Pool", + "stake": "Stake", + "stake2": "Amount to Stake", + "staked": "Staked", + "token": "Token", + "tokens": "Tokens", + "trade": "Trade", + "tran-sent": "⏰ Transaction Sent!", + "tran-confirmed": "✔️ Transaction Confirmed!", + "tran-wait": "Plz wait for the transaction confirmation.", + "tran-wait2": "All set, please wait for another confirmation", + "update": "Update", + "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "votes": "Votes", + "wait": "Please wait...", + "welcome": { + "tcap": "Total Cryptocurrency Market Capitalization", + "tcap-token": "Total Cryptocurrency Market Capitalization Token", + "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", + "title1": "My Total Balance", + "subtitle1": "Connected Account", + "title2": "Use TCAP", + "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "title3": "Connect Your Account", + "subtitle3": "Mint TCAP, or check your balance connecting your account", + "tcap-balance": "TCAP Balance", + "ctx-balance": "CTX Balance" + }, + "vault": { + "warning": "", + "loading": "Loading Vault", + "title1": "The Vault", + "subtitle1": "Select your Collateral", + "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", + "approve": "Approve Vault", + "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", + "create": "Create Vault", + "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", + "balance-title": "{{vault}} Balance", + "ratio-title": "Vault Ratio", + "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "collateral": { + "title": "Staked Collateral", + "add": "Add Collateral", + "remove": "Remove Collateral" + }, + "debt": { + "title": "Vault Debt", + "mint": "Mint TCAP", + "burn": "Burn TCAP", + "fee": "Burn Fee" + }, + "status": { + "na": "N/A", + "safe": "safe", + "warning": "warning", + "danger": "danger", + "error": "error" + }, + "errors": { + "no-collateral": "Not enough collateral on vault", + "burn-too-high": "Burn value too high" + } + }, + "pools": { + "pools": "Pools", + "enabled": "Enabled Pools", + "available": "Available Pools", + "liquidity": "Liquidity" + }, + "farming": { + "farming": "Farming", + "minting": "Minting Rewards", + "current-mint": "Current mint", + "current-reward": "Current Reward", + "liquidity": "Liquidity Rewards", + "unlocked": "Unlocked Reward", + "locked": "Locked Reward", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", + "unlocked-info": "Available to claim immediately.", + "locked-info": "Rewards are unlocked 6 months after the start of the pool." + }, + "governance": { + "amount-stake": "Amount to Stake", + "amount-remove": "Amount to Remove", + "new": "New Crypt Keeper", + "respresented": "Represented", + "stake-reward": "Stake Reward", + "staked-reward": "Staked Reward", + "why-me": "Why me?", + "expertise": "Expertise", + "delegate-to": "Delegate to Keeper", + "delegating": "Delegating", + "stake-delegate": "Stake & Delegate", + "stake-info": "Stake and Delegate CTX to this Crypt Keeper. Each time you Stake and Delegate, you must wait a minimum of 7 days before you can withdraw.", + "stake-info2": "Approve delegating CTX tokens. You only have to do this once.", + "withdraw": "Withdraw", + "withdrawing": "Withdrawing", + "withdraw-info": "Remove delegated votes from this Crypt Keeper. CTX must be staked and delegated for a minimum of 7 days before you are eligible to withdraw.", + "withdraw-info2": "* Eligible to withdraw on {{date}}", + "form": { + "create": "Create Crypt Keeper", + "keeper": "Keeper eth name or address", + "name": "Name" + }, + "success": { + "title": "Crypt. Keepers", + "message": "Crypt Keeper updated" + }, + "errors": { + "creating-keeper": "Error creating keeper.", + "exists": "Crypt Keeper for the address already exists.", + "invalid-amount": "Invalid amount to withdraw", + "invalid-ens-address": "Please enter a valid eth name or address", + "invalid-twitter": "It is not a valid twitter username", + "invalid-discord": "It is not a valid discord id", + "need-to-wait": "Need to wait the minimum staking period", + "too-long": "Field is too long ({{max}} characters max)" + } + }, + "graph": { + "staked-usd": "Total Staked in USD", + "staked-eth": "Total Staked in ETH", + "staked-dai": "Total Staked in DAI", + "staked-aave": "Total Staked in AAVE", + "staked-link": "Total Staked in LINK", + "staked-matic": "Total Staked in MATIC", + "total-supply": "Total Supply", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price" + }, + "errors": { + "empty": "Field can't be empty", + "invalid-address": "Please enter a valid address", + "invalid-ens": "Please enter a valid ENS name", + "invalid-file-type": "Invalid file type.", + "invalid-image-size": "Image max size is {{size}} KB", + "no-ctx": "Not enough CTX balance.", + "no-funds": "Insufficient funds to stake", + "not-approve": "Token not Approved", + "tran-rejected": "Transaction rejected", + "unexpected": "Unexpected error" + } +} \ No newline at end of file From 86c5d4607d0554282a5257b3534988faec55a2fa Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 21 Jan 2022 15:09:24 -0600 Subject: [PATCH 010/278] fixed bug loading keepers --- src/components/Governance/ProfileCard.tsx | 3 ++- src/components/Governance/StakerStats.tsx | 12 +++++++++--- src/components/Vault/Details.tsx | 1 - src/components/Welcome/Welcome.tsx | 24 +++++++++++++++-------- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/components/Governance/ProfileCard.tsx b/src/components/Governance/ProfileCard.tsx index 0a25d0c..48bfc0d 100644 --- a/src/components/Governance/ProfileCard.tsx +++ b/src/components/Governance/ProfileCard.tsx @@ -89,7 +89,8 @@ const ProfileCard = ({ } await getProvider(); - }, [signer, delegator, governance, mediaQuery, addWithdrawTime]); + // eslint-disable-next-line + }, [signer, delegator, governance, mediaQuery]); const onRemoveClick = async () => { if (tokenOwnerStake) { diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 6b77641..293a392 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -52,15 +52,21 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes }: props) currentWT = parseInt(currentWaitTime.toString()); setWaitTime(currentWT); } + } + load(); + // eslint-disable-next-line + }, [signer, updateData,]); + + useEffect(() => { + async function load() { if (withdrawTimes.length > 0) { const lastDate = new Date(); - lastDate.setTime(withdrawTimes[0] - currentWT * 1000); + lastDate.setTime(withdrawTimes[0] - waitTime * 1000); setLastStakeDate(lastDate); } } load(); - // eslint-disable-next-line - }, [signer, updateData, withdrawTimes, updateTimes]); + }, [withdrawTimes, updateTimes, waitTime]); const claimRewards = async () => { if (governance.delegatorFactory) { diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index ff58d5c..08acb70 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -655,7 +655,6 @@ const Details = ({ address }: props) => { balance = ethers.utils.formatEther(await provider.getBalance(address)); } else if (selectedCollateralContract) { const value = BigNumber.from(await selectedCollateralContract.balanceOf(address)); - console.log(value); balance = ethers.utils.formatUnits(value, selectedVaultDecimals); } const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); diff --git a/src/components/Welcome/Welcome.tsx b/src/components/Welcome/Welcome.tsx index 0d184c6..ddd8e23 100644 --- a/src/components/Welcome/Welcome.tsx +++ b/src/components/Welcome/Welcome.tsx @@ -54,6 +54,7 @@ const Welcome = ({ signerAddress }: props) => { useEffect(() => { const loadAddress = async () => { + let tcapString = "0"; if (signer.signer && tokens.tcapToken && oracles.tcapOracle && tokens.tcapTokenRead) { if (signerAddress !== "" && signerAddress !== currentAddress) { const ens = await getENS(signerAddress); @@ -70,7 +71,7 @@ const Welcome = ({ signerAddress }: props) => { currentTcapBalanceCall, wethOraclePriceCall, ]); - const tcapString = ethers.utils.formatEther(currentTcapBalance); + tcapString = ethers.utils.formatEther(currentTcapBalance); setTcapBalance(tcapString); const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); @@ -95,6 +96,14 @@ const Welcome = ({ signerAddress }: props) => { setCurrentAddress(signerAddress); } } + }; + loadAddress(); + + // eslint-disable-next-line + }, [signerAddress]); + + useEffect(() => { + const loadData = async () => { if (data) { let currentTotalPrice = BigNumber.from(0); const prices = await data?.oracles; @@ -102,17 +111,16 @@ const Welcome = ({ signerAddress }: props) => { currentTotalPrice = BigNumber.from(prices[0].answer); } const TotalTcapPrice = currentTotalPrice.mul(10000000000); + const cTcapPrice = ethers.utils.formatEther(TotalTcapPrice.div(10000000000)); setTotalPrice(ethers.utils.formatEther(TotalTcapPrice)); - setTcapPrice(ethers.utils.formatEther(TotalTcapPrice.div(10000000000))); - const tcapUSD = parseFloat(tcapBalance) * parseFloat(tcapPrice); + setTcapPrice(cTcapPrice); + const tcapUSD = parseFloat(tcapBalance) * parseFloat(cTcapPrice); setTcapUSDBalance(tcapUSD.toString()); - setIsLoading(false); } + setIsLoading(false); }; - - loadAddress(); - // eslint-disable-next-line - }, [signerAddress, tcapUSDBalance, data]); + loadData(); + }, [data, tcapBalance]); if (isLoading) { return ; From eb8351fe42c8ec765fb5c24c85bdbe1498f90ba5 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 24 Jan 2022 11:15:20 -0600 Subject: [PATCH 011/278] new vaults enabled --- src/utils/constants.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index dded6b0..1943274 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -62,7 +62,7 @@ export const GRAPHQL_ENDPOINT = { export const FEATURES = { KEEPERS_API: false, - NEW_VAULTS: false, + NEW_VAULTS: true, OPTIMISM: false, POLYGON: false, }; From 01c72d0c5c985945dc9f2bcb70b5301b856b152c Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 25 Jan 2022 13:55:21 -0600 Subject: [PATCH 012/278] fix bug when showing prices on welcome page --- src/App.tsx | 5 +++-- src/components/Vault/Details.tsx | 25 ++++++++++++++++++++----- src/components/Welcome/Welcome.tsx | 19 ++++++++++++++++--- src/components/Welcome/index.tsx | 2 +- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index db554d7..a8b8a28 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -95,7 +95,7 @@ const App = () => { break; default: cNetwork = NETWORKS.rinkeby; - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.rinkeby)); + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); break; } networks.setCurrentChainId(networkId); @@ -508,6 +508,7 @@ const App = () => { // @ts-ignore /* networkProvider.on("chainChanged", (chainId: number) => { // web3Modal.clearCachedProvider(); + console.log("---- chainId -------"); setCurrentNetwork(chainId, ""); window.location.reload(); }); */ @@ -539,7 +540,7 @@ const App = () => { // Execute the created function directly loadProvider(); // eslint-disable-next-line - }, [web3Modal]); + }, [web3Modal, web3Modal.cachedProvider]); const handlers = useSwipeable({ onSwipedLeft: () => setShowSidebar(true), diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index 08acb70..f022b0c 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -837,12 +837,27 @@ const Details = ({ address }: props) => { const action = async () => { if (selectedVaultId === "0") { - const tx = await selectedVaultContract?.createVault(); - notifyUser(tx, refresh); + try { + const tx = await selectedVaultContract?.createVault(); + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001) { + errorNotification("Transaction rejected"); + } + } } else { - const amount = approveValue; - const tx = await selectedCollateralContract?.approve(selectedVaultContract?.address, amount); - notifyUser(tx, refresh); + try { + const amount = approveValue; + const tx = await selectedCollateralContract?.approve( + selectedVaultContract?.address, + amount + ); + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001) { + errorNotification("Transaction rejected"); + } + } } }; diff --git a/src/components/Welcome/Welcome.tsx b/src/components/Welcome/Welcome.tsx index ddd8e23..ba93b95 100644 --- a/src/components/Welcome/Welcome.tsx +++ b/src/components/Welcome/Welcome.tsx @@ -96,13 +96,26 @@ const Welcome = ({ signerAddress }: props) => { setCurrentAddress(signerAddress); } } + if (data) { + let currentTotalPrice = BigNumber.from(0); + const prices = await data?.oracles; + if (prices.length > 0) { + currentTotalPrice = BigNumber.from(prices[0].answer); + } + const TotalTcapPrice = currentTotalPrice.mul(10000000000); + setTotalPrice(ethers.utils.formatEther(TotalTcapPrice)); + setTcapPrice(ethers.utils.formatEther(TotalTcapPrice.div(10000000000))); + const tcapUSD = parseFloat(tcapString) * parseFloat(tcapPrice); + setTcapUSDBalance(tcapUSD.toString()); + setIsLoading(false); + } }; loadAddress(); // eslint-disable-next-line - }, [signerAddress]); + }, [signerAddress, data]); - useEffect(() => { + /* useEffect(() => { const loadData = async () => { if (data) { let currentTotalPrice = BigNumber.from(0); @@ -120,7 +133,7 @@ const Welcome = ({ signerAddress }: props) => { setIsLoading(false); }; loadData(); - }, [data, tcapBalance]); + }, [data, tcapBalance]); */ if (isLoading) { return ; diff --git a/src/components/Welcome/index.tsx b/src/components/Welcome/index.tsx index 7a5c4a4..ec80948 100644 --- a/src/components/Welcome/index.tsx +++ b/src/components/Welcome/index.tsx @@ -37,7 +37,7 @@ const Wrapper = ({ signerAddress }: props) => { setApolloClient(clientOracle(GRAPHQL_ENDPOINT.polygon)); break; default: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.rinkeby)); + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); break; } }, [currentNetwork.chainId]); From 28672471c5e57e7a2b973b6f02fad902f0bda234 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 25 Jan 2022 18:42:20 -0600 Subject: [PATCH 013/278] fix bug on metamask when blocking wallet --- src/App.tsx | 15 ++++++++++++--- src/components/Farm.tsx | 6 +++--- src/components/Vault/Details.tsx | 10 +++++----- src/components/modals/Delegate.tsx | 2 +- src/components/modals/NewProposal.tsx | 2 +- src/components/modals/Stake.tsx | 4 ++-- src/components/modals/Vote.tsx | 2 +- src/utils/utils.tsx | 2 +- 8 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index a8b8a28..c2cbea2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -507,11 +507,20 @@ const App = () => { setCurrentNetwork(network.chainId, walletName); // @ts-ignore /* networkProvider.on("chainChanged", (chainId: number) => { - // web3Modal.clearCachedProvider(); - console.log("---- chainId -------"); setCurrentNetwork(chainId, ""); window.location.reload(); }); */ + + if (!networkProvider.isFortmatic) { + // @ts-ignore + networkProvider.on("accountsChanged", (accounts: string[]) => { + if (accounts.length === 0) { + web3Modal.clearCachedProvider(); + } + window.location.reload(); + }); + } + setLoading(false); }); @@ -540,7 +549,7 @@ const App = () => { // Execute the created function directly loadProvider(); // eslint-disable-next-line - }, [web3Modal, web3Modal.cachedProvider]); + }, [web3Modal]); const handlers = useSwipeable({ onSwipedLeft: () => setShowSidebar(true), diff --git a/src/components/Farm.tsx b/src/components/Farm.tsx index 7c55182..a96f428 100644 --- a/src/components/Farm.tsx +++ b/src/components/Farm.tsx @@ -415,7 +415,7 @@ const Farm = () => { } notifyUser(tx, refresh); } catch (error) { - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { errorNotification("Insufficient funds to stake"); @@ -454,7 +454,7 @@ const Farm = () => { } notifyUser(tx, refresh); } catch (error) { - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { errorNotification("Error claiming vest"); @@ -484,7 +484,7 @@ const Farm = () => { } notifyUser(tx, refresh); } catch (error) { - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { errorNotification("Insufficient funds to exit"); diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index f022b0c..34e1061 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -634,7 +634,7 @@ const Details = ({ address }: props) => { } } catch (error) { console.error(error); - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { errorNotification("Insufficient funds to stake"); @@ -732,7 +732,7 @@ const Details = ({ address }: props) => { notifyUser(tx, refresh); } catch (error) { console.error(error); - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { errorNotification("Not enough collateral on vault"); @@ -779,7 +779,7 @@ const Details = ({ address }: props) => { notifyUser(tx, refresh); } catch (error) { console.error(error); - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { errorNotification("Burn value too high"); @@ -841,7 +841,7 @@ const Details = ({ address }: props) => { const tx = await selectedVaultContract?.createVault(); notifyUser(tx, refresh); } catch (error) { - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } } @@ -854,7 +854,7 @@ const Details = ({ address }: props) => { ); notifyUser(tx, refresh); } catch (error) { - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } } diff --git a/src/components/modals/Delegate.tsx b/src/components/modals/Delegate.tsx index 26caf47..2c954de 100644 --- a/src/components/modals/Delegate.tsx +++ b/src/components/modals/Delegate.tsx @@ -33,7 +33,7 @@ export const Delegate = ({ show, onHide, refresh }: props) => { setAddressText(""); onHide(); } catch (error) { - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { errorNotification("Invalid address"); diff --git a/src/components/modals/NewProposal.tsx b/src/components/modals/NewProposal.tsx index e30bb18..0b9c4a1 100644 --- a/src/components/modals/NewProposal.tsx +++ b/src/components/modals/NewProposal.tsx @@ -62,7 +62,7 @@ export const NewProposal = ({ show, onHide, refresh }: props) => { setDescription(""); onHide(); } catch (error) { - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { errorNotification("Description can't be empty"); diff --git a/src/components/modals/Stake.tsx b/src/components/modals/Stake.tsx index 7b84b14..c52b00c 100644 --- a/src/components/modals/Stake.tsx +++ b/src/components/modals/Stake.tsx @@ -56,7 +56,7 @@ export const Stake = ({ show, poolTitle, poolToken, pool, balance, onHide, refre setStakeText(""); onHide(); } catch (error) { - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { errorNotification("Token not Approved"); @@ -77,7 +77,7 @@ export const Stake = ({ show, poolTitle, poolToken, pool, balance, onHide, refre setStakeText(""); setIsApproved(true); } catch (error) { - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { console.log(error); diff --git a/src/components/modals/Vote.tsx b/src/components/modals/Vote.tsx index ac0ec44..beb28f5 100644 --- a/src/components/modals/Vote.tsx +++ b/src/components/modals/Vote.tsx @@ -41,7 +41,7 @@ export const Vote = ({ show, onHide, proposal, forVote, against, endTime, status notifyUser(tx); onHide(); } catch (error) { - if (error.code === 4001) { + if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { onHide(); diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index d286b44..8738383 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -265,7 +265,7 @@ export const isInLayer1 = (chainId: number | undefined) => { if (!isUndefined(chainId)) { return chainId === NETWORKS.mainnet.chainId || chainId === NETWORKS.rinkeby.chainId; } - return false; + return true; }; export const getDefaultProvider = (chainId: number | undefined, name: string | undefined) => { From fe8e1a8edaa49341c86929df7c3c573119d9358a Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 25 Jan 2022 19:11:57 -0600 Subject: [PATCH 014/278] verifiying network to load routes --- src/utils/utils.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 8738383..d286b44 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -265,7 +265,7 @@ export const isInLayer1 = (chainId: number | undefined) => { if (!isUndefined(chainId)) { return chainId === NETWORKS.mainnet.chainId || chainId === NETWORKS.rinkeby.chainId; } - return true; + return false; }; export const getDefaultProvider = (chainId: number | undefined, name: string | undefined) => { From 18a378eb414ac7c562326abb956a95f01937ca46 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 25 Jan 2022 19:32:26 -0600 Subject: [PATCH 015/278] fix default network connection --- src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index c2cbea2..21083bd 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -94,7 +94,7 @@ const App = () => { setApolloClient(clientOracle(GRAPHQL_ENDPOINT.polygon)); break; default: - cNetwork = NETWORKS.rinkeby; + cNetwork = NETWORKS.mainnet; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); break; } From a02b204970519142c5a92d3158d90837fdec0fad Mon Sep 17 00:00:00 2001 From: Andy Wu Date: Fri, 21 Jan 2022 23:12:58 -0800 Subject: [PATCH 016/278] feat: add dashboard translation from en to zh, first attempt, by AW update-1: replaced a few terms per grassroot's suggestions update-2: proposed a consistent term for crypt keeper per grassroot's suggestions --- public/locales/zh/translation.json | 270 ++++++++++++++--------------- 1 file changed, 135 insertions(+), 135 deletions(-) diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json index 9e37653..b9cfa56 100644 --- a/public/locales/zh/translation.json +++ b/public/locales/zh/translation.json @@ -1,164 +1,164 @@ { - "balance": "Balance", - "balance2": "Current Balance", - "choose-network": "Choose Network", - "claim": "Claim", - "click-copy": "Click to Copy", - "connect": "Connect Wallet", - "contract": "Contract", - "create": "Create", - "description": "Description", - "exit": "Exit", - "farm": "Farm", - "history": "History", - "inactive": "Inative", - "infinite-approve": "Infinite Approve", - "max": "MAX", - "max-safe": "MAX SAFE", - "mint": "Mint", - "last": "Last", - "loading": "Loading", - "pool": "Pool", - "stake": "Stake", - "stake2": "Amount to Stake", - "staked": "Staked", - "token": "Token", - "tokens": "Tokens", - "trade": "Trade", - "tran-sent": "⏰ Transaction Sent!", - "tran-confirmed": "✔️ Transaction Confirmed!", - "tran-wait": "Plz wait for the transaction confirmation.", - "tran-wait2": "All set, please wait for another confirmation", - "update": "Update", - "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", - "votes": "Votes", - "wait": "Please wait...", + "balance": "余额", + "balance2": "当前余额", + "choose-network": "选择网络", + "claim": "认领", + "click-copy": "点击复制", + "connect": "连接", + "contract": "合约", + "create": "创建", + "description": "描述", + "exit": "退出", + "farm": "农场", + "history": "历史", + "inactive": "未激活", + "infinite-approve": "无限授权", + "max": "最大", + "max-safe": "最大安全", + "mint": "铸造", + "last": "最后", + "loading": "加载中", + "pool": "池", + "stake": "抵押", + "stake2": "抵押数量", + "staked": "已抵押", + "token": "代币", + "tokens": "代币", + "trade": "交易", + "tran-sent": "⏰ 交易已发送!", + "tran-confirmed": "✔️ 交易已确认!", + "tran-wait": "请等待交易确认。", + "tran-wait2": "一切就绪,请等待另一次确认。", + "update": "更新", + "vault-warning": "⚠️ 确保始终有一个高于最低比率的比率,以避免被清算。", + "votes": "投票", + "wait": "请等待...", "welcome": { - "tcap": "Total Cryptocurrency Market Capitalization", - "tcap-token": "Total Cryptocurrency Market Capitalization Token", - "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", - "title1": "My Total Balance", - "subtitle1": "Connected Account", - "title2": "Use TCAP", - "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", - "title3": "Connect Your Account", - "subtitle3": "Mint TCAP, or check your balance connecting your account", - "tcap-balance": "TCAP Balance", - "ctx-balance": "CTX Balance" + "tcap": "加密货币总市值", + "tcap-token": "加密货币总市值代币", + "tcap-info": "加密货币总市值每移动1%就会在链上更新", + "title1": "我的总余额", + "subtitle1": "连接的账户", + "title2": "使用TCAP", + "subtitle2": "使用SushiSwap交易TCAP或使用保险库创建新的供应量", + "title3": "连接您的账户", + "subtitle3": "铸造TCAP,或检查你的余额连接你的账户", + "tcap-balance": "TCAP余额", + "ctx-balance": "CTX余额" }, "vault": { - "warning": "", - "loading": "Loading Vault", - "title1": "The Vault", - "subtitle1": "Select your Collateral", - "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", - "approve": "Approve Vault", - "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", - "create": "Create Vault", - "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", - "balance-title": "{{vault}} Balance", - "ratio-title": "Vault Ratio", - "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "warning": "警告", + "loading": "加载保险库", + "title1": "保险库", + "subtitle1": "选择你的抵押品", + "no-connected": "没有连接钱包。请连接您的钱包,创建一个保险库,并批准您的抵押品,开始铸造TCAP代币。", + "approve": "批准保险库", + "approve-text": "保险库未获批准。请批准你的抵押品以开始铸造TCAP代币。", + "create": "创建保险库", + "create-text": "没有创建保险库。请创建一个保险库并批准你的抵押品,以开始铸造TCAP代币。", + "balance-title": "{{vault}} 余额", + "ratio-title": "保险库比率", + "ratio-warning": "比率必须大于 {{minRatio}}% 以避免被清算。", "collateral": { - "title": "Staked Collateral", - "add": "Add Collateral", - "remove": "Remove Collateral" + "title": "抵押担保品", + "add": "添加抵押品", + "remove": "删除抵押品" }, "debt": { - "title": "Vault Debt", - "mint": "Mint TCAP", - "burn": "Burn TCAP", - "fee": "Burn Fee" + "title": "保险库债务", + "mint": "铸造TCAP", + "burn": "销毁TCAP", + "fee": "销毁费用" }, "status": { - "na": "N/A", - "safe": "safe", - "warning": "warning", - "danger": "danger", - "error": "error" + "na": "不适用", + "safe": "安全", + "warning": "警告", + "danger": "危险", + "error": "错误" }, "errors": { - "no-collateral": "Not enough collateral on vault", - "burn-too-high": "Burn value too high" + "no-collateral": "保险库没有足够的抵押品", + "burn-too-high": "销毁值太高" } }, "pools": { - "pools": "Pools", - "enabled": "Enabled Pools", - "available": "Available Pools", - "liquidity": "Liquidity" + "pools": "池", + "enabled": "启用的池子", + "available": "可用的池子", + "liquidity": "流动性" }, "farming": { - "farming": "Farming", - "minting": "Minting Rewards", - "current-mint": "Current mint", - "current-reward": "Current Reward", - "liquidity": "Liquidity Rewards", - "unlocked": "Unlocked Reward", - "locked": "Locked Reward", - "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", - "unlocked-info": "Available to claim immediately.", - "locked-info": "Rewards are unlocked 6 months after the start of the pool." + "farming": "挖矿", + "minting": "铸币奖励", + "current-mint": "当前铸造", + "current-reward": "当前奖励", + "liquidity": "流动性奖励", + "unlocked": "解锁的奖励", + "locked": "锁定的奖赏", + "current-info": "早期采用者的奖励在14天内发放,共计500,000 CTX。假设14天内每天大约6500个以太坊区块(91,000个以太坊区块),每个区块的奖励将是5.4945 CTX,分给当时的债务人。100%的奖励是立即可用的。", + "unlocked-info": "可立即领取。", + "locked-info": "奖励在池子开始6个月后解锁。" }, "governance": { - "amount-stake": "Amount to Stake", - "amount-remove": "Amount to Remove", - "new": "New Crypt Keeper", - "respresented": "Represented", - "stake-reward": "Stake Reward", - "staked-reward": "Staked Reward", - "why-me": "Why me?", - "expertise": "Expertise", - "delegate-to": "Delegate to Keeper", - "delegating": "Delegating", - "stake-delegate": "Stake & Delegate", - "stake-info": "Stake and Delegate CTX to this Crypt Keeper. Each time you Stake and Delegate, you must wait a minimum of 7 days before you can withdraw.", - "stake-info2": "Approve delegating CTX tokens. You only have to do this once.", - "withdraw": "Withdraw", - "withdrawing": "Withdrawing", - "withdraw-info": "Remove delegated votes from this Crypt Keeper. CTX must be staked and delegated for a minimum of 7 days before you are eligible to withdraw.", - "withdraw-info2": "* Eligible to withdraw on {{date}}", + "amount-stake": "质押金额", + "amount-remove": "移除质押金额", + "new": "新的治理代表", + "respresented": "代表", + "stake-reward": "质押奖励", + "staked-reward": "已质押奖励", + "why-me": "为什么是我?", + "expertise": "专业知识", + "delegate-to": "委托给治理代表", + "delegating": "授权", + "stake-delegate": "质押并委托", + "stake-info": "质押并委托CTX给这个代表。每次质押并委托,你必须等待至少7天后才能提款。", + "stake-info2": "批准委托CTX代币。你只需这样做一次。", + "withdraw": "提取", + "withdrawing": "提取", + "withdraw-info": "移除该代表的委托票。CTX必须被押注和委托至少7天才有资格退出。", + "withdraw-info2": "* 有资格在以下时间退出 {{date}}", "form": { - "create": "Create Crypt Keeper", - "keeper": "Keeper eth name or address", - "name": "Name" + "create": "创建Cryptex的治理代表", + "keeper": "代表人的以太坊域名或者地址", + "name": "姓名" }, "success": { - "title": "Crypt. Keepers", - "message": "Crypt Keeper updated" + "title": "治理代表", + "message": "治理代表已更新" }, "errors": { - "creating-keeper": "Error creating keeper.", - "exists": "Crypt Keeper for the address already exists.", - "invalid-amount": "Invalid amount to withdraw", - "invalid-ens-address": "Please enter a valid eth name or address", - "invalid-twitter": "It is not a valid twitter username", - "invalid-discord": "It is not a valid discord id", - "need-to-wait": "Need to wait the minimum staking period", - "too-long": "Field is too long ({{max}} characters max)" + "creating-keeper": "创建治理代表时出错。", + "exists": "该地址的治理代表已经存在。", + "invalid-amount": "无效的提款金额", + "invalid-ens-address": "请输入一个有效的以太域名或地址", + "invalid-twitter": "这不是一个有效的Twitter用户名", + "invalid-discord": "这不是一个有效的Discord ID", + "need-to-wait": "需要等待最短的质押时间", + "too-long": "字段太长。最长 ({{max}} 字符。)" } }, "graph": { - "staked-usd": "Total Staked in USD", - "staked-eth": "Total Staked in ETH", - "staked-dai": "Total Staked in DAI", - "staked-aave": "Total Staked in AAVE", - "staked-link": "Total Staked in LINK", - "staked-matic": "Total Staked in MATIC", - "total-supply": "Total Supply", - "tcap-price": "TCAP Price", - "ctx-price": "CTX Price" + "staked-usd": "总质押(美元)", + "staked-eth": "总质押(以太坊)", + "staked-dai": "总质押(DAI)", + "staked-aave": "总质押(AAVE)", + "staked-link": "总质押(LINK)", + "staked-matic": "总质押(MATIC)", + "total-supply": "供应总量", + "tcap-price": "TCAP 价格", + "ctx-price": "CTX 价格" }, "errors": { - "empty": "Field can't be empty", - "invalid-address": "Please enter a valid address", - "invalid-ens": "Please enter a valid ENS name", - "invalid-file-type": "Invalid file type.", - "invalid-image-size": "Image max size is {{size}} KB", - "no-ctx": "Not enough CTX balance.", - "no-funds": "Insufficient funds to stake", - "not-approve": "Token not Approved", - "tran-rejected": "Transaction rejected", - "unexpected": "Unexpected error" + "empty": "字段不能为空", + "invalid-address": "请输入一个有效的地址", + "invalid-ens": "请输入一个有效的ENS名称", + "invalid-file-type": "无效的文件类型。", + "invalid-image-size": "图像的最大尺寸是 {{size}} KB", + "no-ctx": "没有足够的CTX余额。", + "no-funds": "没有足够的资金质押", + "not-approve": "未批准的代币", + "tran-rejected": "交易被拒绝", + "unexpected": "意外的错误" } -} \ No newline at end of file +} From eb5e62446737c68ac70a0a1795063245095f6f75 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 28 Jan 2022 11:10:20 -0600 Subject: [PATCH 017/278] button to change language added --- public/index.html | 1 + public/locales/zh/translation.json | 2 +- src/components/Header.tsx | 25 +++++++++++++++++++++++++ src/utils/constants.tsx | 4 ++-- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/public/index.html b/public/index.html index aa79a4f..f470b36 100644 --- a/public/index.html +++ b/public/index.html @@ -5,6 +5,7 @@ + { + const { i18n } = useTranslation(); const web3Modal = useContext(Web3ModalContext); const signer = useContext(SignerContext); const tokens = useContext(TokensContext); @@ -32,6 +35,7 @@ const Header = ({ signerAddress }: props) => { const [address, setAddress] = useState("0x0000000000000000000000000000000000000000"); const [addressField, setAddressField] = useState(""); const [tokenBalance, setTokenBalance] = useState("0.0"); + const [language, setLanguage] = useState("EN"); const copyCodeToClipboard = (e: React.MouseEvent) => { e.preventDefault(); @@ -128,6 +132,17 @@ const Header = ({ signerAddress }: props) => { // eslint-disable-next-line }, [signerAddress, currentNetwork.chainId]); + const changeLanguage = (lng: string) => { + i18n.changeLanguage(lng); + setLanguage(lng); + }; + + const handleOnSelect = (eventKey: any, event: Object) => { + console.log(eventKey); + console.log(event); + changeLanguage(eventKey); + }; + return (
Date: Fri, 28 Jan 2022 16:42:35 -0600 Subject: [PATCH 018/278] change order of warnings --- src/components/Warnings.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/Warnings.tsx b/src/components/Warnings.tsx index 738fe7a..209ea5f 100644 --- a/src/components/Warnings.tsx +++ b/src/components/Warnings.tsx @@ -16,26 +16,26 @@ const Warnings = () => { return ( <> - {vaultWarning && location.pathname === "/vault" && ( + {showBeta && ( { - setVaultWarning(false); + setShowBeta(false); localStorage.setItem("alert", "false"); }} dismissible > - {t("vault-warning")} + 💀 {t("warning")} - )} - {showBeta && ( + )} + {vaultWarning && location.pathname === "/vault" && ( { - setShowBeta(false); + setVaultWarning(false); localStorage.setItem("alert", "false"); }} dismissible > - 💀 {t("warning")} + {t("vault-warning")} )} From cdd1cd837a615efef12a84901fa4b92450f23140 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 31 Jan 2022 11:10:57 -0600 Subject: [PATCH 019/278] set browser languange as default --- package.json | 5 +++-- public/locales/es/translation.json | 6 +++--- src/components/Header.tsx | 1 - src/components/Warnings.tsx | 2 +- src/i18n.js | 20 +++++++++++++++++++- yarn.lock | 9 ++++++++- 6 files changed, 34 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 0796c95..2b46ad0 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,13 @@ "@walletconnect/web3-provider": "^1.3.6", "authereum": "^0.1.0", "bootstrap": "^4.5.3", + "compressorjs": "1.1.1", "ethers": "^5.5.2", "ethers-multicall": "^0.2.1", "fortmatic": "^2.2.1", "graphql": "^15.4.0", "i18next": "^21.6.6", + "i18next-browser-languagedetector": "^6.1.3", "i18next-http-backend": "^1.3.1", "node-sass": "^4.14.1", "react": "^17.0.1", @@ -43,8 +45,7 @@ "typescript": "4.0.5", "walletlink": "^2.4.2", "web-vitals": "^0.2.4", - "web3modal": "^1.9.5", - "compressorjs": "1.1.1" + "web3modal": "^1.9.5" }, "devDependencies": { "@babel/core": "7.12.3", diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index ae35386..ba2d78c 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -31,10 +31,10 @@ "wait": "Please wait", "warning": "This project is in beta. Use at your own risk.", "welcome": { - "tcap": "Total Cryptocurrency Market Capitalization", + "tcap": "Capitalización total del mercado de criptomonedas", "tcap-token": "Total Cryptocurrency Market Capitalization Token", - "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", - "title1": "My Total Balance", + "tcap-info": "Token de capitalización de mercado de criptomonedas total", + "title1": "Mi balance total", "subtitle1": "Connected Account", "title2": "Use TCAP", "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 3393af9..bb70624 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -131,7 +131,6 @@ const Header = ({ signerAddress }: props) => { } const lng = localStorage.getItem("language"); if (lng) { - i18n.changeLanguage(lng); setLanguage(lng.toUpperCase()); } }; diff --git a/src/components/Warnings.tsx b/src/components/Warnings.tsx index 209ea5f..fcafa8b 100644 --- a/src/components/Warnings.tsx +++ b/src/components/Warnings.tsx @@ -26,7 +26,7 @@ const Warnings = () => { > 💀 {t("warning")} - )} + )} {vaultWarning && location.pathname === "/vault" && ( { diff --git a/src/i18n.js b/src/i18n.js index 0049228..b39e9ba 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -1,5 +1,6 @@ import i18n from "i18next"; import Backend from "i18next-http-backend"; +import LanguageDetector from "i18next-browser-languagedetector"; import { initReactI18next } from "react-i18next"; i18n @@ -8,11 +9,28 @@ i18n .use(Backend) // pass the i18n instance to react-i18next. .use(initReactI18next) + .use(LanguageDetector) // init i18next // for all options read: https://www.i18next.com/overview/configuration-options .init({ fallbackLng: "en", - lng: "en", + detection: { + order: [ + "localStorage", + "navigator", + "sessionStorage", + "querystring", + "cookie", + "htmlTag", + "path", + "subdomain", + ], + // keys or params to lookup language from + lookupCookie: "language", + lookupLocalStorage: "language", + lookupSessionStorage: "language", + caches: ["localStorage", "cookie"], + }, debug: false, interpolation: { diff --git a/yarn.lock b/yarn.lock index 2c602cc..cf79d89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1123,7 +1123,7 @@ core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.16.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== @@ -8385,6 +8385,13 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +i18next-browser-languagedetector@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-6.1.3.tgz#9bc47fb4a5db86d567318895df343d2d1b9692f3" + integrity sha512-T+oGXHXtrur14CGnZZ7qQ07X38XJQEI00b/4ILrtO6xPbwTlQ1wtMZC2H+tBULixHuVUXv8LKbxfjyITJkezUg== + dependencies: + "@babel/runtime" "^7.14.6" + i18next-http-backend@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/i18next-http-backend/-/i18next-http-backend-1.3.1.tgz#c1175aaead22b62a70bdb556b794fef1ba558b3a" From 50154de33a4e00d46ed209fca91bed1290ebc837 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 2 Feb 2022 09:08:51 -0600 Subject: [PATCH 020/278] mumbai support --- src/App.tsx | 128 +- src/components/Graph.tsx | 148 +- src/components/Header.tsx | 90 +- src/components/Vault/Details.tsx | 55 +- src/components/Welcome/Welcome.tsx | 39 +- src/components/Welcome/index.tsx | 3 + src/components/modals/ChangeNetwork.tsx | 31 +- src/contracts/cryptex.json | 5636 ++++++++++++++++++++++- src/utils/constants.tsx | 12 +- src/utils/utils.tsx | 32 +- 10 files changed, 5963 insertions(+), 211 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 4ff06c2..45d9b1a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -41,7 +41,7 @@ import cryptexJson from "./contracts/cryptex.json"; import ERC20 from "./contracts/ERC20.json"; import WETH from "./contracts/WETH.json"; import UniV2Pair from "./contracts/UniswapV2Pair.json"; -import { isValidNetwork, getDefaultProvider, toFragment } from "./utils/utils"; +import { isValidNetwork, isPolygon, getDefaultProvider, toFragment } from "./utils/utils"; import { GRAPHQL_ENDPOINT, NETWORKS } from "./utils/constants"; const clientOracle = (graphqlEndpoint: string) => @@ -75,22 +75,26 @@ const App = () => { const setCurrentNetwork = (networkId: number, walletName: string) => { let cNetwork; switch (networkId) { - case 1: + case NETWORKS.mainnet.chainId: cNetwork = NETWORKS.mainnet; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); break; - case 4: + case NETWORKS.rinkeby.chainId: cNetwork = NETWORKS.rinkeby; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.rinkeby)); break; - case 69: + case NETWORKS.okovan.chainId: cNetwork = NETWORKS.okovan; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.okovan)); break; - case 137: + case NETWORKS.polygon.chainId: cNetwork = NETWORKS.polygon; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.polygon)); break; + case NETWORKS.mumbai.chainId: + cNetwork = NETWORKS.mumbai; + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mumbai)); + break; default: cNetwork = NETWORKS.mainnet; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); @@ -98,8 +102,11 @@ const App = () => { } networks.setCurrentChainId(networkId); networks.setCurrentName(cNetwork.name); - networks.setCurrentWETHAddress(cNetwork.weth); networks.setCurrentDAIAddress(cNetwork.dai); + if (networkId !== NETWORKS.polygon.chainId && networkId !== NETWORKS.mumbai.chainId) { + // @ts-ignore + networks.setCurrentWETHAddress(cNetwork.weth); + } if (walletName !== "") networks.setCurrentWallet(walletName); }; @@ -256,10 +263,33 @@ const App = () => { } }; - const setPolygonContracts = async (currentSigner: ethers.Signer) => { - const contracts = cryptexJson[137].polygon.contracts; + const setPolygonContracts = async ( + currentSigner: ethers.Signer, + ethcallProvider: Provider, + chainId: number + ) => { + await ethcallProvider.init(); + signer.setCurrentEthcallProvider(ethcallProvider); + let contracts; + let daiAddress; + let maticAddress; + if (chainId === NETWORKS.polygon.chainId) { + contracts = cryptexJson[137].polygon.contracts; + daiAddress = NETWORKS.polygon.dai; + maticAddress = NETWORKS.polygon.matic; + } else { + contracts = cryptexJson[80001].mumbai.contracts; + daiAddress = NETWORKS.mumbai.dai; + maticAddress = NETWORKS.mumbai.matic; + } // Set Vaults + const currentDAIVault = new ethers.Contract( + contracts.DAIVaultHandler.address, + contracts.DAIVaultHandler.abi, + currentSigner + ); + vaults.setCurrentDAIVault(currentDAIVault); const currentMaticVault = new ethers.Contract( contracts.MATICVaultHandler.address, contracts.MATICVaultHandler.abi, @@ -267,6 +297,11 @@ const App = () => { ); vaults.setCurrentMaticVault(currentMaticVault); + const currentDAIVaultRead = new Contract( + contracts.DAIVaultHandler.address, + contracts.DAIVaultHandler.abi + ); + vaults.setCurrentDAIVaultRead(currentDAIVaultRead); const currentMATICVaultRead = new Contract( contracts.MATICVaultHandler.address, toFragment(contracts.MATICVaultHandler.abi) @@ -274,22 +309,55 @@ const App = () => { vaults.setCurrentMaticVaultRead(currentMATICVaultRead); // Set Tokens - const currentMATICToken = new ethers.Contract(NETWORKS.polygon.matic, ERC20.abi, currentSigner); + const currentDAIToken = new ethers.Contract(daiAddress, WETH.abi, currentSigner); + tokens.setCurrentDAIToken(currentDAIToken); + const currentMATICToken = new ethers.Contract(maticAddress, ERC20.abi, currentSigner); tokens.setCurrentMATICToken(currentMATICToken); - const currentMATICTokenRead = new Contract(NETWORKS.polygon.matic, ERC20.abi); + const currentTCAPToken = new ethers.Contract( + contracts.TCAP.address, + contracts.TCAP.abi, + currentSigner + ); + tokens.setCurrentTCAPToken(currentTCAPToken); + const currentDAITokenRead = new Contract(daiAddress, WETH.abi); + tokens.setCurrentDAITokenRead(currentDAITokenRead); + const currentMATICTokenRead = new Contract(maticAddress, ERC20.abi); tokens.setCurrentMATICTokenRead(currentMATICTokenRead); + const currentTCAPTokenRead = new Contract(contracts.TCAP.address, contracts.TCAP.abi); + tokens.setCurrentTCAPTokenRead(currentTCAPTokenRead); + // Set Oracles + const currentDAIOracle = new ethers.Contract( + contracts.DAIOracle.address, + contracts.DAIOracle.abi, + currentSigner + ); + oracles.setCurrentDAIOracle(currentDAIOracle); + const currentTCAPOracle = new ethers.Contract( + contracts.TCAPOracle.address, + contracts.TCAPOracle.abi, + currentSigner + ); + oracles.setCurrentTCAPOracle(currentTCAPOracle); const currentMATICOracle = new ethers.Contract( - contracts.MATICOracle.address, - contracts.MATICOracle.abi, + contracts.WMATICOracle.address, + contracts.WMATICOracle.abi, currentSigner ); oracles.setCurrentMATICOracle(currentMATICOracle); + const currentDAIOracleRead = new Contract(contracts.DAIOracle.address, contracts.DAIOracle.abi); + oracles.setCurrentDAIOracleRead(currentDAIOracleRead); + const currentTCAPOracleRead = new Contract( + contracts.TCAPOracle.address, + contracts.TCAPOracle.abi + ); + oracles.setCurrentTCAPOracleRead(currentTCAPOracleRead); const currentMATICOracleRead = new Contract( - contracts.MATICOracle.address, - contracts.MATICOracle.abi + contracts.WMATICOracle.address, + contracts.WMATICOracle.abi ); oracles.setCurrentMATICOracleRead(currentMATICOracleRead); + setLoading(false); }; const setContracts = async ( @@ -303,26 +371,21 @@ const App = () => { let wethAddress; let daiAddress; switch (chainId) { - case 1: + case NETWORKS.mainnet.chainId: contracts = cryptexJson[1].mainnet.contracts; wethAddress = NETWORKS.mainnet.weth; daiAddress = NETWORKS.mainnet.dai; break; - case 4: + case NETWORKS.rinkeby.chainId: contracts = cryptexJson[4].rinkeby.contracts; wethAddress = NETWORKS.rinkeby.weth; daiAddress = NETWORKS.rinkeby.dai; break; - case 69: + case NETWORKS.okovan.chainId: contracts = cryptexJson[69].okovan.contracts; wethAddress = NETWORKS.okovan.weth; daiAddress = NETWORKS.okovan.dai; break; - case 137: - contracts = cryptexJson[137].polygon.contracts; - wethAddress = NETWORKS.polygon.weth; - daiAddress = NETWORKS.polygon.dai; - break; default: contracts = cryptexJson[4].rinkeby.contracts; wethAddress = NETWORKS.rinkeby.weth; @@ -483,9 +546,6 @@ const App = () => { if (chainId === NETWORKS.mainnet.chainId || chainId === NETWORKS.rinkeby.chainId) { setEthereumContracts(chainId, currentSigner); } - if (chainId === NETWORKS.polygon.chainId) { - setPolygonContracts(currentSigner); - } }; web3Modal.on("connect", async (networkProvider) => { @@ -499,15 +559,21 @@ const App = () => { const currentSigner = currentProvider.getSigner(); signer.setCurrentSigner(currentSigner); const ethcallProvider = new Provider(currentProvider); - await setContracts(currentSigner, ethcallProvider, network.chainId || 4); + + if (isPolygon(network.chainId)) { + await setPolygonContracts(currentSigner, ethcallProvider, network.chainId || 4); + } else { + await setContracts(currentSigner, ethcallProvider, network.chainId || 4); + } + const cAddress = await currentSigner.getAddress(); setCurrentSignerAddress(cAddress); setCurrentNetwork(network.chainId, walletName); // @ts-ignore - /* networkProvider.on("chainChanged", (chainId: number) => { + networkProvider.on("chainChanged", (chainId: number) => { setCurrentNetwork(chainId, ""); window.location.reload(); - }); */ + }); if (!networkProvider.isFortmatic) { // @ts-ignore @@ -537,7 +603,11 @@ const App = () => { ); const randomSigner = ethers.Wallet.createRandom().connect(provider); const ethcallProvider = new Provider(randomSigner.provider); - setContracts(randomSigner, ethcallProvider, parseInt(chainId)); + if (isPolygon(parseInt(chainId))) { + setPolygonContracts(randomSigner, ethcallProvider, parseInt(chainId)); + } else { + setContracts(randomSigner, ethcallProvider, parseInt(chainId)); + } setCurrentNetwork(parseInt(chainId), ""); setLoading(false); } diff --git a/src/components/Graph.tsx b/src/components/Graph.tsx index 207749b..05eb15d 100644 --- a/src/components/Graph.tsx +++ b/src/components/Graph.tsx @@ -13,13 +13,13 @@ import { ReactComponent as StakeIcon } from "../assets/images/graph/stake.svg"; import { ReactComponent as H24Icon } from "../assets/images/graph/24h.svg"; import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; import { ReactComponent as WETHIcon } from "../assets/images/graph/weth.svg"; -// import { ReactComponent as POLYGONIcon } from "../assets/images/graph/polygon3.svg"; +import { ReactComponent as POLYGONIcon } from "../assets/images/graph/polygon3.svg"; import { ReactComponent as DAIIcon } from "../assets/images/graph/DAI.svg"; import { ReactComponent as AAVEIcon } from "../assets/images/graph/aave.svg"; import { ReactComponent as LINKIcon } from "../assets/images/graph/chainlink.svg"; import { ReactComponent as CtxIcon } from "../assets/images/ctx-coin.svg"; import cryptexJson from "../contracts/cryptex.json"; -import { getPriceInUSDFromPair, isInLayer1, isUndefined, toUSD } from "../utils/utils"; +import { getPriceInUSDFromPair, isInLayer1, isPolygon, isUndefined, toUSD } from "../utils/utils"; import { FEATURES, NETWORKS } from "../utils/constants"; import Loading from "./Loading"; @@ -33,7 +33,7 @@ const Graph = () => { const [ctxPrice, setCtxPrice] = useState("0.0"); const [ETHStake, setETHStake] = useState("0"); const [DAIStake, setDAIStake] = useState("0"); - // const [MATICStake, setMATICStake] = useState("0"); + const [MATICStake, setMATICStake] = useState("0"); const [aaveStake, setAaveStake] = useState("0"); const [linkStake, setLinkStake] = useState("0"); const [TotalStake, setTotalStake] = useState("0"); @@ -57,56 +57,46 @@ const Graph = () => { const validOracles = (): boolean => { let valid = - !isUndefined(oracles.wethOracleRead) && !isUndefined(oracles.daiOracleRead) && !isUndefined(oracles.tcapOracleRead) && !isUndefined(tokens.tcapTokenRead); - if ( - currentNetwork.chainId === NETWORKS.mainnet.chainId || - currentNetwork.chainId === NETWORKS.rinkeby.chainId - ) { + if (!isPolygon(currentNetwork.chainId)) { valid = valid && + !isUndefined(oracles.wethOracleRead) && !isUndefined(oracles.aaveOracle) && !isUndefined(oracles.linkOracle) && !isUndefined(tokens.ctxPoolTokenRead); } - if (currentNetwork.chainId === NETWORKS.polygon.chainId) { + if (isPolygon(currentNetwork.chainId)) { valid = valid && !isUndefined(oracles.maticOracle) && !isUndefined(oracles.maticOracleRead); } return valid; }; - /* const getMaticUSD = async () => { + const getMaticUSD = async () => { const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); // @ts-ignore const [maticOraclePrice] = await signer.ethcallProvider?.all([maticOraclePriceCall]); const maticUSD = ethers.utils.formatEther(maticOraclePrice.mul(10000000000)); return maticUSD; - }; */ + }; useEffect(() => { const load = async () => { if (oracles && tokens && data && signer && validOracles()) { const currentTotalPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); const currentTotalSupplyCall = await tokens.tcapTokenRead?.totalSupply(); - const ethcalls = [ - currentTotalPriceCall, - wethOraclePriceCall, - daiOraclePriceCall, - currentTotalSupplyCall, - ]; + const ethcalls = [currentTotalPriceCall, daiOraclePriceCall, currentTotalSupplyCall]; - if ( - currentNetwork.chainId === NETWORKS.mainnet.chainId || - currentNetwork.chainId === NETWORKS.rinkeby.chainId - ) { + if (!isPolygon(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); + ethcalls.push(wethOraclePriceCall); ethcalls.push(aaveOraclePriceCall); ethcalls.push(linkOraclePriceCall); ethcalls.push(reservesCtxPoolCall); @@ -119,23 +109,20 @@ const Graph = () => { let linkOraclePrice; let reservesCtxPool; - if ( - currentNetwork.chainId === NETWORKS.mainnet.chainId || - currentNetwork.chainId === NETWORKS.rinkeby.chainId - ) { + if (!isPolygon(currentNetwork.chainId)) { // @ts-ignore [ currentTotalPrice, - wethOraclePrice, daiOraclePrice, currentTotalSupply, + wethOraclePrice, aaveOraclePrice, linkOraclePrice, reservesCtxPool, ] = await signer.ethcallProvider?.all(ethcalls); } else { // @ts-ignore - [currentTotalPrice, wethOraclePrice, daiOraclePrice, currentTotalSupply] = + [currentTotalPrice, daiOraclePrice, currentTotalSupply] = await signer.ethcallProvider?.all(ethcalls); } @@ -145,7 +132,7 @@ const Graph = () => { let currentWETHStake = BigNumber.from(0); let currentAAVEStake = BigNumber.from(0); let currentLINKStake = BigNumber.from(0); - // const currentMATICStake = BigNumber.from(0); + let currentMATICStake = BigNumber.from(0); await data.states.forEach((s: any) => { const networkId = currentNetwork.chainId; @@ -163,31 +150,41 @@ const Graph = () => { case NETWORKS.polygon.chainId: contracts = cryptexJson[137].polygon.contracts; break; + case NETWORKS.mumbai.chainId: + contracts = cryptexJson[80001].mumbai.contracts; + break; default: contracts = cryptexJson[4].rinkeby.contracts; break; } - switch (s.id.toLowerCase()) { - case contracts.DAIVaultHandler.address.toLowerCase(): + if (!isPolygon(currentNetwork.chainId)) { + switch (s.id.toLowerCase()) { + case contracts.DAIVaultHandler.address.toLowerCase(): + currentDAIStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + break; + // @ts-ignore + case contracts.WETHVaultHandler.address.toLowerCase(): + currentWETHStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + break; + // @ts-ignore + case contracts.AaveVaultHandler.address.toLowerCase(): + currentAAVEStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + break; + // @ts-ignore + case contracts.LinkVaultHandler.address.toLowerCase(): + currentLINKStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + break; + default: + break; + } + } else { + if (s.id.toLowerCase() === contracts.DAIVaultHandler.address.toLowerCase()) { currentDAIStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - break; - case contracts.WETHVaultHandler.address.toLowerCase(): - currentWETHStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - break; - // @ts-ignore - case contracts.AaveVaultHandler.address.toLowerCase(): - currentAAVEStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - break; + } // @ts-ignore - case contracts.LinkVaultHandler.address.toLowerCase(): - currentLINKStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - break; - // @ts-ignore - /* case contracts.MATICVaultHandler.address.toLowerCase(): + if (s.id.toLowerCase() === contracts.MATICVaultHandler.address.toLowerCase()) { currentMATICStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - break; */ - default: - break; + } } }); @@ -199,39 +196,33 @@ const Graph = () => { setAaveStake(formatAAVE); const formatLINK = ethers.utils.formatEther(currentLINKStake); setLinkStake(formatLINK); - /* const formatMATIC = ethers.utils.formatEther(currentMATICStake); - setMATICStake(formatMATIC); */ + const formatMATIC = ethers.utils.formatEther(currentMATICStake); + setMATICStake(formatMATIC); - const ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); const daiUSD = ethers.utils.formatEther(daiOraclePrice.mul(10000000000)); + let ethUSD = "0"; let aaveUSD = "0"; let linkUSD = "0"; - // let maticUSD = "0"; - if ( - currentNetwork.chainId === NETWORKS.mainnet.chainId || - currentNetwork.chainId === NETWORKS.rinkeby.chainId - ) { + let maticUSD = "0"; + if (!isPolygon(currentNetwork.chainId)) { + ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); aaveUSD = ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)); linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); - } - /* if (currentNetwork.chainId === NETWORKS.polygon.chainId) { + } else { maticUSD = await getMaticUSD(); - } */ + } const totalUSD = toUSD(ethUSD, formatETH) + toUSD(daiUSD, formatDAI) + toUSD(aaveUSD, formatAAVE) + - toUSD(linkUSD, formatLINK); - // toUSD(maticUSD, formatMATIC); + toUSD(linkUSD, formatLINK) + + toUSD(maticUSD, formatMATIC); setTotalStake(totalUSD.toString()); setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); if (signer) { - const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - if ( - currentNetwork.chainId === NETWORKS.mainnet.chainId || - currentNetwork.chainId === NETWORKS.rinkeby.chainId - ) { + if (isInLayer1(currentNetwork.chainId)) { + const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); const currentPriceCTX = getPriceInUSDFromPair( reservesCtxPool[0], reservesCtxPool[1], @@ -293,14 +284,21 @@ const Graph = () => { /> - - -

{t("graph.staked-eth")}

-
- {" "} - ETH -
-
+ {!isPolygon(currentNetwork.chainId) && ( + + +

{t("graph.staked-eth")}

+
+ {" "} + ETH +
+
+ )}

{t("graph.staked-dai")}

@@ -356,7 +354,7 @@ const Graph = () => { )} )} - {/* {currentNetwork.chainId === NETWORKS.polygon.chainId && ( + {isPolygon(currentNetwork.chainId) && (

{t("graph.staked-matic")}

@@ -370,7 +368,7 @@ const Graph = () => { MATIC
- )} */} + )} ); diff --git a/src/components/Header.tsx b/src/components/Header.tsx index bb70624..1233eb0 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -14,7 +14,7 @@ import SignerContext from "../state/SignerContext"; import { Web3ModalContext } from "../state/Web3ModalContext"; import TokensContext from "../state/TokensContext"; import NetworkContext from "../state/NetworkContext"; -import { makeShortAddress, getENS } from "../utils/utils"; +import { makeShortAddress, getENS, isPolygon } from "../utils/utils"; import { FEATURES, NETWORKS } from "../utils/constants"; import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; import { ReactComponent as ETHIcon } from "../assets/images/graph/weth.svg"; @@ -57,6 +57,50 @@ const Header = ({ signerAddress }: props) => { document.body.removeChild(el); }; + async function addNetwork(newChainId: string) { + let chainName = "Polygon Mainnet"; + let currency = "Matic Token"; + let symbol = "MATIC"; + let rpcUrl = "https://rpc-mainnet.maticvigil.com/"; + let blockUrl = "https://polygonscan.com/"; + + if (newChainId === NETWORKS.mumbai.hexChainId) { + chainName = "Mumbai"; + currency = "Matic Token"; + symbol = "MATIC"; + rpcUrl = "https://rpc-mumbai.maticvigil.com/"; + blockUrl = "https://mumbai.polygonscan.com/"; + } + if (newChainId === NETWORKS.okovan.hexChainId) { + chainName = "Optimistic Ethereum (Kovan)"; + currency = "Ether (ETH)"; + symbol = "ETH"; + rpcUrl = "https://kovan.optimism.io"; + blockUrl = "https://kovan-optimistic.etherscan.io"; + } + + try { + await window.ethereum.request({ + method: "wallet_addEthereumChain", + params: [ + { + chainId: newChainId, + chainName, + nativeCurrency: { + name: currency, + symbol, + decimals: 18, + }, + rpcUrls: [rpcUrl], + blockExplorerUrls: [blockUrl], + }, + ], + }); + } catch (addError) { + // handle "add" error + } + } + async function changeNetwork(newChainId: string) { if (currentNetwork.wallet === "metamask") { try { @@ -68,37 +112,9 @@ const Header = ({ signerAddress }: props) => { // This error code indicates that the chain has not been added to MetaMask. if ( error.code === 4902 && - (newChainId === NETWORKS.okovan.hexChainId || newChainId === NETWORKS.polygon.hexChainId) + (newChainId !== NETWORKS.mainnet.hexChainId || newChainId !== NETWORKS.rinkeby.hexChainId) ) { - try { - await window.ethereum.request({ - method: "wallet_addEthereumChain", - params: [ - { - chainId: newChainId, - chainName: - newChainId === NETWORKS.okovan.hexChainId - ? "Optimistic Ethereum (Kovan)" - : "Polygon Mainnet", - nativeCurrency: { - name: newChainId === NETWORKS.okovan.hexChainId ? "Ether (ETH)" : "Matic Token", - symbol: newChainId === NETWORKS.okovan.hexChainId ? "ETH" : "MATIC", - decimals: 18, - }, - rpcUrls: - newChainId === NETWORKS.okovan.hexChainId - ? ["https://kovan.optimism.io"] - : ["https://rpc-mainnet.maticvigil.com/"], - blockExplorerUrls: - newChainId === NETWORKS.okovan.hexChainId - ? ["https://kovan-optimistic.etherscan.io"] - : ["https://polygonscan.com/"], - }, - ], - }); - } catch (addError) { - // handle "add" error - } + addNetwork(newChainId); } } } @@ -129,8 +145,9 @@ const Header = ({ signerAddress }: props) => { const currentTcapBalance = await tokens.tcapToken.balanceOf(signerAddress); setTokenBalance(ethers.utils.formatEther(currentTcapBalance)); } - const lng = localStorage.getItem("language"); + let lng = localStorage.getItem("language"); if (lng) { + if (lng === "en-US") lng = "en"; setLanguage(lng.toUpperCase()); } }; @@ -179,7 +196,7 @@ const Header = ({ signerAddress }: props) => { } > {currentNetwork.chainId === NETWORKS.okovan.chainId || - currentNetwork.chainId === NETWORKS.polygon.chainId ? ( + isPolygon(currentNetwork.chainId) ? (
{currentNetwork.chainId === NETWORKS.okovan.chainId ? ( <> @@ -187,7 +204,12 @@ const Header = ({ signerAddress }: props) => { ) : ( <> -
Polygon
+ + {currentNetwork.chainId === NETWORKS.polygon.chainId ? ( +
Polygon
+ ) : ( +
Mumbai
+ )} )}
diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index 41bbc77..b6b414a 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -34,6 +34,7 @@ import { errorNotification, getDefaultProvider, isInLayer1, + isPolygon, getRatio, getSafeRemoveCollateral, getSafeMint, @@ -56,17 +57,21 @@ const Details = ({ address, t }: props) => { const vaults = useContext(VaultsContext); const signer = useContext(SignerContext); - let currency = currentNetwork.chainId !== NETWORKS.polygon.chainId ? "ETH" : "MATIC"; + let currency = !isPolygon(currentNetwork.chainId) ? "ETH" : "MATIC"; const match = useRouteMatch("/vault/:currency"); const history = useHistory(); // @ts-ignore switch (match?.params?.currency?.toLowerCase()) { case "eth": currency = "ETH"; + if (FEATURES.POLYGON && isPolygon(currentNetwork.chainId)) { + history?.push(`/vault/MATIC`); + currency = "MATIC"; + } break; case "weth": currency = "WETH"; - if (FEATURES.POLYGON && currentNetwork.chainId === NETWORKS.polygon.chainId) { + if (FEATURES.POLYGON && isPolygon(currentNetwork.chainId)) { history?.push(`/vault/MATIC`); currency = "MATIC"; } @@ -92,7 +97,7 @@ const Details = ({ address, t }: props) => { break; case "matic": currency = "MATIC"; - if (!FEATURES.POLYGON && currentNetwork.chainId !== NETWORKS.polygon.chainId) { + if (!FEATURES.POLYGON && !isPolygon(currentNetwork.chainId)) { history?.push(`/vault/ETH`); currency = "ETH"; } @@ -102,8 +107,7 @@ const Details = ({ address, t }: props) => { history?.push(`/vault/WETH`); break; default: - currency = - FEATURES.POLYGON && currentNetwork.chainId === NETWORKS.polygon.chainId ? "MATIC" : "ETH"; + currency = FEATURES.POLYGON && isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"; break; } @@ -188,34 +192,31 @@ const Details = ({ address, t }: props) => { const validVaults = (): boolean => { let valid = - !isUndefined(oracles.wethOracle) && !isUndefined(oracles.daiOracle) && !isUndefined(oracles.tcapOracle) && - !isUndefined(oracles.wethOracleRead) && !isUndefined(oracles.daiOracleRead) && - !isUndefined(vaults.wethVault) && !isUndefined(vaults.daiVault) && - !isUndefined(tokens.wethTokenRead) && !isUndefined(tokens.daiTokenRead); - if ( - currentNetwork.chainId === NETWORKS.mainnet.chainId || - currentNetwork.chainId === NETWORKS.rinkeby.chainId - ) { + if (isInLayer1(currentNetwork.chainId)) { valid = valid && + !isUndefined(oracles.wethOracle) && !isUndefined(oracles.aaveOracle) && !isUndefined(oracles.linkOracle) && + !isUndefined(oracles.wethOracleRead) && !isUndefined(oracles.aaveOracleRead) && !isUndefined(oracles.linkOracleRead) && + !isUndefined(vaults.wethVault) && !isUndefined(vaults.aaveVault) && !isUndefined(vaults.linkVault) && !isUndefined(tokens.aaveToken) && !isUndefined(tokens.linkToken) && + !isUndefined(tokens.wethTokenRead) && !isUndefined(tokens.aaveTokenRead) && !isUndefined(tokens.linkTokenRead); } - if (currentNetwork.chainId === NETWORKS.polygon.chainId) { + if (isPolygon(currentNetwork.chainId)) { valid = valid && !isUndefined(oracles.maticOracle) && @@ -230,8 +231,8 @@ const Details = ({ address, t }: props) => { }; const isGasAsset = () => - (currentNetwork.chainId !== NETWORKS.polygon.chainId && selectedVault === "ETH") || - (currentNetwork.chainId === NETWORKS.polygon.chainId && selectedVault === "MATIC"); + (!isPolygon(currentNetwork.chainId) && selectedVault === "ETH") || + (isPolygon(currentNetwork.chainId) && selectedVault === "MATIC"); async function loadVault(vaultType: string, vaultData: any) { if (signer.signer && validVaults() && vaultData) { @@ -242,11 +243,11 @@ const Details = ({ address, t }: props) => { let currentTokenRead; let balance; const provider = getDefaultProvider( - currentNetwork.chainId || NETWORKS.rinkeby.chainId, + currentNetwork.chainId || NETWORKS.mainnet.chainId, currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.rinkeby.name ); switch (vaultType) { - case "ETH": { + case "ETH": currentVault = vaults.wethVault; currentVaultRead = vaults.wethVaultRead; currentToken = tokens.wethToken; @@ -254,7 +255,6 @@ const Details = ({ address, t }: props) => { currentTokenRead = tokens.wethTokenRead; balance = await provider.getBalance(address); break; - } case "WETH": currentVault = vaults.wethVault; currentVaultRead = vaults.wethVaultRead; @@ -289,7 +289,7 @@ const Details = ({ address, t }: props) => { currentToken = tokens.maticToken; currentOracleRead = oracles.maticOracleRead; currentTokenRead = tokens.maticTokenRead; - balance = await provider.getBalance(address); + // balance = await provider.getBalance(address); break; default: currentVault = vaults.wethVault; @@ -339,7 +339,7 @@ const Details = ({ address, t }: props) => { balance = await currentToken.balanceOf(address); } - let decimals; + let decimals = 18; let currentPrice; if (currentVaultData) { @@ -450,7 +450,12 @@ const Details = ({ address, t }: props) => { console.log(error); }, onCompleted: () => { - loadVault(selectedVault, data); + let vaultType = selectedVault; + if (isPolygon(currentNetwork.chainId) && vaultType === "ETH") { + vaultType = "MATIC"; + setSelectedVault("MATIC"); + } + loadVault(vaultType, data); }, }); @@ -916,9 +921,9 @@ const Details = ({ address, t }: props) => {
- {currentNetwork.chainId === NETWORKS.polygon.chainId && } - - + {isPolygon(currentNetwork.chainId) && } + {!isPolygon(currentNetwork.chainId) && } + {!isPolygon(currentNetwork.chainId) && } {FEATURES.NEW_VAULTS && isInLayer1(currentNetwork.chainId) && ( <> diff --git a/src/components/Welcome/Welcome.tsx b/src/components/Welcome/Welcome.tsx index ee97968..54aa2bd 100644 --- a/src/components/Welcome/Welcome.tsx +++ b/src/components/Welcome/Welcome.tsx @@ -67,24 +67,23 @@ const Welcome = ({ signerAddress }: props) => { } const currentTcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(signerAddress); - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); // @ts-ignore - const [currentTcapBalance, wethOraclePrice] = await signer.ethcallProvider?.all([ - currentTcapBalanceCall, - wethOraclePriceCall, - ]); + const [currentTcapBalance] = await signer.ethcallProvider?.all([currentTcapBalanceCall]); tcapString = ethers.utils.formatEther(currentTcapBalance); setTcapBalance(tcapString); - const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); if (isInLayer1(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(signerAddress); const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); // @ts-ignore - const [currentCtxBalance, reservesCtxPool] = await signer.ethcallProvider?.all([ - currentCtxBalanceCall, - reservesCtxPoolCall, - ]); + const [wethOraclePrice, currentCtxBalance, reservesCtxPool] = + await signer.ethcallProvider?.all([ + wethOraclePriceCall, + currentCtxBalanceCall, + reservesCtxPoolCall, + ]); + const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); const ctxString = ethers.utils.formatEther(currentCtxBalance); setCtxBalance(ctxString); const currentPriceCTX = await getPriceInUSDFromPair( @@ -117,26 +116,6 @@ const Welcome = ({ signerAddress }: props) => { // eslint-disable-next-line }, [signerAddress, data]); - /* useEffect(() => { - const loadData = async () => { - if (data) { - let currentTotalPrice = BigNumber.from(0); - const prices = await data?.oracles; - if (prices.length > 0) { - currentTotalPrice = BigNumber.from(prices[0].answer); - } - const TotalTcapPrice = currentTotalPrice.mul(10000000000); - const cTcapPrice = ethers.utils.formatEther(TotalTcapPrice.div(10000000000)); - setTotalPrice(ethers.utils.formatEther(TotalTcapPrice)); - setTcapPrice(cTcapPrice); - const tcapUSD = parseFloat(tcapBalance) * parseFloat(cTcapPrice); - setTcapUSDBalance(tcapUSD.toString()); - } - setIsLoading(false); - }; - loadData(); - }, [data, tcapBalance]); */ - if (isLoading) { return ; } diff --git a/src/components/Welcome/index.tsx b/src/components/Welcome/index.tsx index ec80948..31653d1 100644 --- a/src/components/Welcome/index.tsx +++ b/src/components/Welcome/index.tsx @@ -36,6 +36,9 @@ const Wrapper = ({ signerAddress }: props) => { case NETWORKS.polygon.chainId: setApolloClient(clientOracle(GRAPHQL_ENDPOINT.polygon)); break; + case NETWORKS.mumbai.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mumbai)); + break; default: setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); break; diff --git a/src/components/modals/ChangeNetwork.tsx b/src/components/modals/ChangeNetwork.tsx index 4dbc440..bfa61c7 100644 --- a/src/components/modals/ChangeNetwork.tsx +++ b/src/components/modals/ChangeNetwork.tsx @@ -18,6 +18,27 @@ export const ChangeNetwork = ({ show, onHide, changeNetwork }: props) => { const { t } = useTranslation(); const networks = useNetworks(); + const PolygonNetworks = () => { + let { hexChainId, chainId } = NETWORKS.polygon; + let name = "Polygon"; + + if (process.env.REACT_APP_NETWORK_ID !== "1") { + hexChainId = NETWORKS.mumbai.hexChainId; + chainId = NETWORKS.mumbai.chainId; + name = "Mumbai"; + } + + return ( + + ); + }; + return ( { Kovan )} - {FEATURES.POLYGON && ( - - )} + {FEATURES.POLYGON && }
diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index 6f702a0..557c54c 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -54075,7 +54075,7 @@ } ] }, - "MATICOracle": { + "WMATICOracle": { "address": "0x5717DC7Cc0489dCc00316bcDB7e752aec664673e", "abi": [ { @@ -60655,6 +60655,5640 @@ } } }, + "80001": { + "mumbai": { + "name": "mumbai", + "chainId": "80001", + "contracts": { + "AAVE": { + "address": "0xa099e10Bca775FCE4f8c4A31fFcD41Bea16d48d9", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "AggregatorInterfaceTCAP": { + "address": "0xC0db3e1b05Ed411138508855cE45c86B07D12c20", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "int256", + "name": "current", + "type": "int256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "roundId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "AnswerUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "roundId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "startedBy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startedAt", + "type": "uint256" + } + ], + "name": "NewRound", + "type": "event" + }, + { + "inputs": [], + "name": "latestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "latestRoundData", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int256", + "name": "_tcap", + "type": "int256" + } + ], + "name": "setLatestAnswer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "DAI": { + "address": "0xB06498E2a35d5F09AB53643F2b479a9bf909E796", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "DAIOracle": { + "address": "0xde183354d149aDcC10aE0F8559fd094bA70401ef", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_timelock", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "DAIVaultHandler": { + "address": "0x99b36e59A8aAaB35161EF9E0bA2da178e4e6FeB7", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardHandler", + "outputs": [ + { + "internalType": "contract IRewardHandler", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "LINK": { + "address": "0x98AFDDE512D8F2095f0A102F5AE9E0272615a06f", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "MATICVaultHandler": { + "address": "0x628D761B3801EBaF1Dd33DED1DcA01d620F3C1f3", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_maticOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "addCollateralMATIC", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateralMATIC", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardHandler", + "outputs": [ + { + "internalType": "contract IRewardHandler", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "PolygonL2Messenger": { + "address": "0xf6252af194093adDbD03442D7dA186b8d272F296", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_fxRootSender", + "type": "address" + }, + { + "internalType": "address", + "name": "_fxChild", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousFxChild", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newFxChild", + "type": "address" + } + ], + "name": "FxChildUpdate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousFxRootSender", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newFxRootSender", + "type": "address" + } + ], + "name": "FxRootSenderUpdate", + "type": "event" + }, + { + "inputs": [], + "name": "fxChild", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fxRootSender", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "rootMessageSender", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "processMessageFromRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_fxChild", + "type": "address" + } + ], + "name": "updateFxChild", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_fxRootSender", + "type": "address" + } + ], + "name": "updateFxRootSender", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "xDomainMessageSender", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "xDomainMsgSender", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "PolygonOrchestrator": { + "address": "0x13fcDc22A2C9E558f21d17B688C38B2B5E2B4eF6", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_guardian", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_polygonMessenger", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "guardian", + "type": "address" + } + ], + "name": "GuardianSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "TransactionExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract PolygonL2Messenger", + "name": "oldPolygonMessenger", + "type": "address" + }, + { + "indexed": false, + "internalType": "contract PolygonL2Messenger", + "name": "newPolygonMessenger", + "type": "address" + } + ], + "name": "UpdatedPolygonMessenger", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" + }, + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "addTCAPVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" + }, + { + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "enableTCAPCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "executeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "guardian", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "pauseVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "polygonMessenger", + "outputs": [ + { + "internalType": "contract PolygonL2Messenger", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" + }, + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "removeTCAPVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "retrieveETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "setEmergencyBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "setEmergencyLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_guardian", + "type": "address" + } + ], + "name": "setGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + } + ], + "name": "setTCAPCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "unpauseVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newPolygonMessenger", + "type": "address" + } + ], + "name": "updatePolygonMessenger", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "PolygonTreasury": { + "address": "0x4FBbd5A7d387AC4Ed69F784BbEb6387750f94AfC", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_polygonMessenger", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "TransactionExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract PolygonL2Messenger", + "name": "oldPolygonMessenger", + "type": "address" + }, + { + "indexed": false, + "internalType": "contract PolygonL2Messenger", + "name": "newPolygonMessenger", + "type": "address" + } + ], + "name": "UpdatedPolygonMessenger", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "executeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "polygonMessenger", + "outputs": [ + { + "internalType": "contract PolygonL2Messenger", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "retrieveETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newPolygonMessenger", + "type": "address" + } + ], + "name": "updatePolygonMessenger", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "TCAP": { + "address": "0x4799639D4cdD9eCd21c0605cC2F8aa3c14B59724", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + }, + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "NewCap", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "NewCapEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_tokenHandler", + "type": "address" + } + ], + "name": "VaultHandlerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_tokenHandler", + "type": "address" + } + ], + "name": "VaultHandlerRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vaultHandler", + "type": "address" + } + ], + "name": "addVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "capEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "enableCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vaultHandler", + "type": "address" + } + ], + "name": "removeVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + } + ], + "name": "setCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "vaultHandlers", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "TCAPOracle": { + "address": "0x0a916A660157E7663AA57aA5f7De23A909ab42dB", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_timelock", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "WMATICOracle": { + "address": "0x0B3e7f177913452F8C7281Ebd5f4DE80849d3D54", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_timelock", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + } + } + } + }, "31337": { "hardhat": { "name": "hardhat", diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 1943274..c863e5b 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -44,11 +44,16 @@ export const NETWORKS = { chainId: 137, hexChainId: "0x89", name: "matic", - eth: "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", - weth: "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619", dai: "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063", matic: "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270", }, + mumbai: { + chainId: 80001, + hexChainId: "0x13881", + name: "matic", + dai: "0xB06498E2a35d5F09AB53643F2b479a9bf909E796", + matic: "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", + }, }; export const API_ENDPOINT = "https://api.cryptex.finance"; @@ -58,11 +63,12 @@ export const GRAPHQL_ENDPOINT = { rinkeby: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-rinkeby-two", okovan: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo", polygon: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-polygon", + mumbai: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-polygon", }; export const FEATURES = { KEEPERS_API: false, NEW_VAULTS: true, OPTIMISM: false, - POLYGON: false, + POLYGON: true, }; diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 70e3ff7..f2ccb86 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -257,7 +257,7 @@ export const isValidNetwork = (chainId: number) => { return ( chainId === NETWORKS.rinkeby.chainId || (FEATURES.OPTIMISM && chainId === NETWORKS.okovan.chainId) || - (FEATURES.POLYGON && chainId === NETWORKS.polygon.chainId) + (FEATURES.POLYGON && chainId === NETWORKS.mumbai.chainId) ); }; @@ -268,16 +268,38 @@ export const isInLayer1 = (chainId: number | undefined) => { return false; }; +export const isPolygon = (chainId: number | undefined) => { + if (!isUndefined(chainId)) { + return chainId === NETWORKS.polygon.chainId || chainId === NETWORKS.mumbai.chainId; + } + return false; +}; + export const getDefaultProvider = (chainId: number | undefined, name: string | undefined) => { let provider; if (chainId === NETWORKS.okovan.chainId) { provider = ethers.getDefaultProvider(process.env.REACT_APP_ALCHEMY_URL_OKOVAN); } else { - const alchemyKey = - chainId === NETWORKS.mainnet.chainId - ? process.env.REACT_APP_ALCHEMY_KEY - : process.env.REACT_APP_ALCHEMY_KEY_RINKEBY; + let alchemyKey; + switch (chainId) { + case NETWORKS.mainnet.chainId: + alchemyKey = process.env.REACT_APP_ALCHEMY_KEY; + break; + case NETWORKS.rinkeby.chainId: + alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_RINKEBY; + break; + case NETWORKS.polygon.chainId: + alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_POLYGON; + break; + case NETWORKS.mumbai.chainId: + alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_MUMBAI; + break; + default: + alchemyKey = process.env.REACT_APP_ALCHEMY_KEY; + break; + } provider = ethers.getDefaultProvider(name, { + infura: process.env.REACT_APP_INFURA_ID, alchemy: alchemyKey, }); } From 5e1d498fc9225911fe63fc0bbc94c0350eec1d26 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 2 Feb 2022 17:28:33 -0600 Subject: [PATCH 021/278] keepers order by amount staked --- src/components/Governance/Delegators.tsx | 42 +++++++++++++++--------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/components/Governance/Delegators.tsx b/src/components/Governance/Delegators.tsx index 1cca8d2..7d758fa 100644 --- a/src/components/Governance/Delegators.tsx +++ b/src/components/Governance/Delegators.tsx @@ -10,22 +10,22 @@ import StakerStats from "./StakerStats"; import SignerContext from "../../state/SignerContext"; import GovernanceContext from "../../state/GovernanceContext"; import { API_ENDPOINT, FEATURES } from "../../utils/constants"; -import { delegatorsInfo } from "./data"; +import { delegatorsInfo, infoType } from "./data"; type props = { currentSignerAddress: string; }; -type delegatorType = { +/* type delegatorType = { id: string; delegatee: string; delegatedVotes: string; delegatedVotesRaw: string; tokenOwners: { stake: string; stakeRaw: string }[]; totalHoldersRepresented: Number; -}; +}; */ const Delegators = ({ currentSignerAddress }: props) => { - const [delegators, setDelegators] = useState([]); + const [keepers, setKeepers] = useState([]); const [keepersInfo, setKeepersInfo] = useState([]); const [keeperIndex, setKeeperIndex] = useState(-1); const [showKeeperForm, setShowKeeperForm] = useState(false); @@ -67,7 +67,7 @@ const Delegators = ({ currentSignerAddress }: props) => { await data.delegators.forEach((d: any) => { currentDelegators.push(d); }); - setDelegators(currentDelegators); + setKeepers(currentDelegators); } } }; @@ -129,12 +129,22 @@ const Delegators = ({ currentSignerAddress }: props) => { setShowKeeperForm(false); }; - const getDelegatorData = (address: string): delegatorType | null => { - const index = delegators.findIndex( + /* const getDelegatorData = (address: string): delegatorType | null => { + const index = keepers.findIndex( (item) => item.delegatee.toLowerCase() === address.toLowerCase() ); if (index !== -1) { - return delegators[index]; + return keepers[index]; + } + return null; + }; */ + + const getKeepersData = (address: string): infoType | null => { + const index = keepersInfo.findIndex( + (item) => item.address.toLowerCase() === address.toLowerCase() + ); + if (index !== -1) { + return keepersInfo[index]; } return null; }; @@ -175,19 +185,19 @@ const Delegators = ({ currentSignerAddress }: props) => { )}
- {keepersInfo.map((kInfo, index) => { - const delegator = getDelegatorData(kInfo.address); - if (delegator) { + {keepers.map((keeper, index) => { + const keeperInfo = getKeepersData(keeper.delegatee); + if (keeperInfo) { return ( showUpdateKeeper(index)} openDelegate={openDelegate} openWithdraw={openWithdraw} addWithdrawTime={addWithdrawTime} - isSigner={delegator.delegatee.toLowerCase() !== currentSignerAddress.toLowerCase()} + isSigner={keeper.delegatee.toLowerCase() !== currentSignerAddress.toLowerCase()} /> ); } @@ -199,7 +209,7 @@ const Delegators = ({ currentSignerAddress }: props) => { show={showKeeperForm} currentAddress={currentSignerAddress} delegatorFactory={governance.delegatorFactory} - keepers={delegators} + keepers={keepers} keeperInfo={keeperIndex !== -1 ? keepersInfo[keeperIndex] : null} onHide={() => hideKeeperForm()} refresh={() => refresh()} From 1dea73d4d13cd4e49d57924bac6e85e28634cd9c Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 7 Feb 2022 11:36:10 -0600 Subject: [PATCH 022/278] config optmism --- src/App.tsx | 172 +++++++------ src/assets/images/graph/snx.svg | 1 + src/assets/images/graph/uni.svg | 2 + src/assets/images/vault/uni.svg | 4 + src/components/Graph.tsx | 103 +++++--- src/components/Header.tsx | 154 +++++++----- src/components/Vault/Details.tsx | 73 +++--- src/components/modals/ChangeNetwork.tsx | 51 ++-- src/contracts/cryptex.json | 320 +++++++++++++++++++++++- src/utils/constants.tsx | 10 +- src/utils/utils.tsx | 16 +- 11 files changed, 672 insertions(+), 234 deletions(-) create mode 100644 src/assets/images/graph/snx.svg create mode 100644 src/assets/images/graph/uni.svg create mode 100644 src/assets/images/vault/uni.svg diff --git a/src/App.tsx b/src/App.tsx index 21083bd..d9ea88c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -40,7 +40,13 @@ import cryptexJson from "./contracts/cryptex.json"; import ERC20 from "./contracts/ERC20.json"; import WETH from "./contracts/WETH.json"; import UniV2Pair from "./contracts/UniswapV2Pair.json"; -import { isValidNetwork, getDefaultProvider, toFragment } from "./utils/utils"; +import { + isInLayer1, + isPolygon, + isValidNetwork, + getDefaultProvider, + toFragment, +} from "./utils/utils"; import { GRAPHQL_ENDPOINT, NETWORKS } from "./utils/constants"; const clientOracle = (graphqlEndpoint: string) => @@ -132,22 +138,11 @@ const App = () => { currentSigner ); vaults.setCurrentAAVEVault(currentAAVEVault); - const currentLINKVault = new ethers.Contract( - contracts.LinkVaultHandler.address, - contracts.LinkVaultHandler.abi, - currentSigner - ); - vaults.setCurrentLINKVault(currentLINKVault); const currentAVEEVaultRead = new Contract( contracts.AaveVaultHandler.address, contracts.AaveVaultHandler.abi ); vaults.setCurrentAAVEVaultRead(currentAVEEVaultRead); - const currentLINKVaultRead = new Contract( - contracts.LinkVaultHandler.address, - contracts.LinkVaultHandler.abi - ); - vaults.setCurrentLINKVaultRead(currentLINKVaultRead); // Tokens const currentAAVEToken = new ethers.Contract( @@ -156,17 +151,43 @@ const App = () => { currentSigner ); tokens.setCurrentAAVEToken(currentAAVEToken); - const currentLINKToken = new ethers.Contract( - contracts.LINK.address, - contracts.LINK.abi, - currentSigner - ); - tokens.setCurrentLINKToken(currentLINKToken); const currentAAVETokenRead = new Contract(contracts.AAVE.address, contracts.AAVE.abi); tokens.setCurrentAAVETokenRead(currentAAVETokenRead); - const currentLINKTokenRead = new Contract(contracts.LINK.address, contracts.LINK.abi); - tokens.setCurrentLINKTokenRead(currentLINKTokenRead); + + // Set Rewards + const currentWETHReward = new ethers.Contract( + // @ts-ignore + contracts.WETHRewardHandler.address, + // @ts-ignore + contracts.WETHRewardHandler.abi, + currentSigner + ); + rewards.setCurrentWETHReward(currentWETHReward); + const currentDAIReward = new ethers.Contract( + // @ts-ignore + contracts.DAIRewardHandler.address, + // @ts-ignore + contracts.DAIRewardHandler.abi, + currentSigner + ); + rewards.setCurrentDAIReward(currentDAIReward); + + const currentWETHRewardRead = new Contract( + // @ts-ignore + contracts.WETHRewardHandler.address, + // @ts-ignore + contracts.WETHRewardHandler.abi + ); + rewards.setCurrentWETHRewardRead(currentWETHRewardRead); + + const currentDAIRewardRead = new Contract( + // @ts-ignore + contracts.DAIRewardHandler.address, + // @ts-ignore + contracts.DAIRewardHandler.abi + ); + rewards.setCurrentDAIRewardRead(currentDAIRewardRead); // Set Liquidity Rewards const currentWETHPoolReward = new ethers.Contract( @@ -203,22 +224,11 @@ const App = () => { currentSigner ); oracles.setCurrentAAVEOracle(currentAAVEOracle); - const currentLINKOracle = new ethers.Contract( - contracts.LinkOracle.address, - contracts.LinkOracle.abi, - currentSigner - ); - oracles.setCurrentLINKOracle(currentLINKOracle); const currentAAVEOracleRead = new Contract( contracts.AaveOracle.address, contracts.AaveOracle.abi ); oracles.setCurrentAAVEOracleRead(currentAAVEOracleRead); - const currentLINKOracleRead = new Contract( - contracts.LinkOracle.address, - contracts.LinkOracle.abi - ); - oracles.setCurrentLINKOracleRead(currentLINKOracleRead); // Set Governance const currentDelegatorFactory = new ethers.Contract( @@ -258,7 +268,9 @@ const App = () => { } }; - const setPolygonContracts = async (currentSigner: ethers.Signer) => { + const setPolygonContracts = async (currentSigner: ethers.Signer, ethcallProvider: Provider) => { + await ethcallProvider.init(); + signer.setCurrentEthcallProvider(ethcallProvider); const contracts = cryptexJson[137].polygon.contracts; // Set Vaults @@ -315,15 +327,15 @@ const App = () => { wethAddress = NETWORKS.rinkeby.weth; daiAddress = NETWORKS.rinkeby.dai; break; - case 69: + case 10: contracts = cryptexJson[69].okovan.contracts; wethAddress = NETWORKS.okovan.weth; daiAddress = NETWORKS.okovan.dai; break; - case 137: - contracts = cryptexJson[137].polygon.contracts; - wethAddress = NETWORKS.polygon.weth; - daiAddress = NETWORKS.polygon.dai; + case 69: + contracts = cryptexJson[69].okovan.contracts; + wethAddress = NETWORKS.okovan.weth; + daiAddress = NETWORKS.okovan.dai; break; default: contracts = cryptexJson[4].rinkeby.contracts; @@ -345,6 +357,12 @@ const App = () => { currentSigner ); vaults.setCurrentDAIVault(currentDAIVault); + const currentLINKVault = new ethers.Contract( + contracts.LinkVaultHandler.address, + contracts.LinkVaultHandler.abi, + currentSigner + ); + vaults.setCurrentLINKVault(currentLINKVault); const currentWETHVaultRead = new Contract( contracts.WETHVaultHandler.address, @@ -356,6 +374,11 @@ const App = () => { contracts.DAIVaultHandler.abi ); vaults.setCurrentDAIVaultRead(currentDAIVaultRead); + const currentLINKVaultRead = new Contract( + contracts.LinkVaultHandler.address, + contracts.LinkVaultHandler.abi + ); + vaults.setCurrentLINKVaultRead(currentLINKVaultRead); // Set Tokens const currentWETHToken = new ethers.Contract(wethAddress, ERC20.abi, currentSigner); @@ -368,6 +391,12 @@ const App = () => { currentSigner ); tokens.setCurrentTCAPToken(currentTCAPToken); + const currentLINKToken = new ethers.Contract( + contracts.LINK.address, + contracts.LINK.abi, + currentSigner + ); + tokens.setCurrentLINKToken(currentLINKToken); const currentWETHTokenRead = new Contract(wethAddress, ERC20.abi); tokens.setCurrentWETHTokenRead(currentWETHTokenRead); @@ -375,40 +404,8 @@ const App = () => { tokens.setCurrentDAITokenRead(currentDAITokenRead); const currentTCAPTokenRead = new Contract(contracts.TCAP.address, contracts.TCAP.abi); tokens.setCurrentTCAPTokenRead(currentTCAPTokenRead); - - // Set Rewards - const currentWETHReward = new ethers.Contract( - // @ts-ignore - contracts.WETHRewardHandler.address, - // @ts-ignore - contracts.WETHRewardHandler.abi, - currentSigner - ); - rewards.setCurrentWETHReward(currentWETHReward); - const currentDAIReward = new ethers.Contract( - // @ts-ignore - contracts.DAIRewardHandler.address, - // @ts-ignore - contracts.DAIRewardHandler.abi, - currentSigner - ); - rewards.setCurrentDAIReward(currentDAIReward); - - const currentWETHRewardRead = new Contract( - // @ts-ignore - contracts.WETHRewardHandler.address, - // @ts-ignore - contracts.WETHRewardHandler.abi - ); - rewards.setCurrentWETHRewardRead(currentWETHRewardRead); - - const currentDAIRewardRead = new Contract( - // @ts-ignore - contracts.DAIRewardHandler.address, - // @ts-ignore - contracts.DAIRewardHandler.abi - ); - rewards.setCurrentDAIRewardRead(currentDAIRewardRead); + const currentLINKTokenRead = new Contract(contracts.LINK.address, contracts.LINK.abi); + tokens.setCurrentLINKTokenRead(currentLINKTokenRead); // Set Oracles const currentWETHOracle = new ethers.Contract( @@ -423,6 +420,12 @@ const App = () => { currentSigner ); oracles.setCurrentDAIOracle(currentDAIOracle); + const currentLINKOracle = new ethers.Contract( + contracts.LinkOracle.address, + contracts.LinkOracle.abi, + currentSigner + ); + oracles.setCurrentLINKOracle(currentLINKOracle); const currentTCAPOracle = new ethers.Contract( contracts.TCAPOracle.address, contracts.TCAPOracle.abi, @@ -437,6 +440,11 @@ const App = () => { oracles.setCurrentWETHOracleRead(currentWETHOracleRead); const currentDAIOracleRead = new Contract(contracts.DAIOracle.address, contracts.DAIOracle.abi); oracles.setCurrentDAIOracleRead(currentDAIOracleRead); + const currentLINKOracleRead = new Contract( + contracts.LinkOracle.address, + contracts.LinkOracle.abi + ); + oracles.setCurrentLINKOracleRead(currentLINKOracleRead); const currentTCAPOracleRead = new Contract( contracts.TCAPOracle.address, contracts.TCAPOracle.abi @@ -482,12 +490,9 @@ const App = () => { ); governance.setCurrentTimelockRead(currentTimelockRead); - if (chainId === NETWORKS.mainnet.chainId || chainId === NETWORKS.rinkeby.chainId) { + if (isInLayer1(chainId)) { setEthereumContracts(chainId, currentSigner); } - if (chainId === NETWORKS.polygon.chainId) { - setPolygonContracts(currentSigner); - } }; web3Modal.on("connect", async (networkProvider) => { @@ -501,15 +506,20 @@ const App = () => { const currentSigner = currentProvider.getSigner(); signer.setCurrentSigner(currentSigner); const ethcallProvider = new Provider(currentProvider); - await setContracts(currentSigner, ethcallProvider, network.chainId || 4); + + if (isPolygon(network.chainId)) { + await setPolygonContracts(currentSigner, ethcallProvider); + } else { + await setContracts(currentSigner, ethcallProvider, network.chainId || 4); + } const cAddress = await currentSigner.getAddress(); setCurrentSignerAddress(cAddress); setCurrentNetwork(network.chainId, walletName); // @ts-ignore - /* networkProvider.on("chainChanged", (chainId: number) => { + networkProvider.on("chainChanged", (chainId: number) => { setCurrentNetwork(chainId, ""); window.location.reload(); - }); */ + }); if (!networkProvider.isFortmatic) { // @ts-ignore @@ -541,7 +551,11 @@ const App = () => { ); const randomSigner = ethers.Wallet.createRandom().connect(provider); const ethcallProvider = new Provider(randomSigner.provider); - setContracts(randomSigner, ethcallProvider, parseInt(chainId)); + if (isPolygon(parseInt(chainId))) { + setPolygonContracts(randomSigner, ethcallProvider); + } else { + setContracts(randomSigner, ethcallProvider, parseInt(chainId)); + } setCurrentNetwork(parseInt(chainId), ""); setLoading(false); } diff --git a/src/assets/images/graph/snx.svg b/src/assets/images/graph/snx.svg new file mode 100644 index 0000000..fffe3dd --- /dev/null +++ b/src/assets/images/graph/snx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/graph/uni.svg b/src/assets/images/graph/uni.svg new file mode 100644 index 0000000..52b005a --- /dev/null +++ b/src/assets/images/graph/uni.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/assets/images/vault/uni.svg b/src/assets/images/vault/uni.svg new file mode 100644 index 0000000..cd72bdc --- /dev/null +++ b/src/assets/images/vault/uni.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/components/Graph.tsx b/src/components/Graph.tsx index 00af3fb..3ae58b1 100644 --- a/src/components/Graph.tsx +++ b/src/components/Graph.tsx @@ -16,10 +16,19 @@ import { ReactComponent as POLYGONIcon } from "../assets/images/graph/polygon3.s import { ReactComponent as DAIIcon } from "../assets/images/graph/DAI.svg"; import { ReactComponent as AAVEIcon } from "../assets/images/graph/aave.svg"; import { ReactComponent as LINKIcon } from "../assets/images/graph/chainlink.svg"; +import { ReactComponent as UNIIcon } from "../assets/images/graph/uni.svg"; +import { ReactComponent as SNXIcon } from "../assets/images/graph/snx.svg"; import { ReactComponent as CtxIcon } from "../assets/images/ctx-coin.svg"; import cryptexJson from "../contracts/cryptex.json"; -import { getPriceInUSDFromPair, isInLayer1, isUndefined, toUSD } from "../utils/utils"; -import { FEATURES, NETWORKS } from "../utils/constants"; +import { + getPriceInUSDFromPair, + isInLayer1, + isOptimism, + isPolygon, + isUndefined, + toUSD, +} from "../utils/utils"; +import { NETWORKS } from "../utils/constants"; import Loading from "./Loading"; const Graph = () => { @@ -322,36 +331,66 @@ const Graph = () => { />{" "} - {FEATURES.NEW_VAULTS && ( - <> - - -

Total Staked in AAVE

-
- {" "} - AAVE -
-
- - -

Total Staked in LINK

-
- {" "} - LINK -
-
- - )} + + +

Total Staked in AAVE

+
+ {" "} + AAVE +
+
+ + )} + {!isPolygon(currentNetwork.chainId) && ( + <> + + +

Total Staked in LINK

+
+ {" "} + LINK +
+
+ + )} + {isOptimism(currentNetwork.chainId) && ( + <> + + +

Total Staked in UNI

+
+ {" "} + UNI +
+
+ + +

Total Staked in SNX

+
+ {" "} + SNX +
+
)} {currentNetwork.chainId === NETWORKS.polygon.chainId && ( diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 9b6d2b0..7dea4c6 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -12,8 +12,8 @@ import SignerContext from "../state/SignerContext"; import { Web3ModalContext } from "../state/Web3ModalContext"; import TokensContext from "../state/TokensContext"; import NetworkContext from "../state/NetworkContext"; -import { makeShortAddress, getENS } from "../utils/utils"; -import { FEATURES, NETWORKS } from "../utils/constants"; +import { makeShortAddress, getENS, isInLayer1, isOptimism, isPolygon } from "../utils/utils"; +import { NETWORKS } from "../utils/constants"; import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; import { ReactComponent as ETHIcon } from "../assets/images/graph/weth.svg"; import { ReactComponent as OPTIMISMIcon } from "../assets/images/graph/optimism.svg"; @@ -50,6 +50,48 @@ const Header = ({ signerAddress }: props) => { document.body.removeChild(el); }; + async function addNetwork(newChainId: string) { + let chainName = "Optimism"; + let currency = "Ether (ETH)"; + let symbol = "OETH"; + let rpcUrl = "https://mainnet.optimism.io/"; + let blockExplorerUrl = "https://optimistic.etherscan.io"; + + if (newChainId === NETWORKS.okovan.hexChainId) { + chainName = "Optimistic Ethereum (Kovan)"; + rpcUrl = "https://kovan.optimism.io"; + blockExplorerUrl = "https://kovan-optimistic.etherscan.io"; + } + if (newChainId === NETWORKS.polygon.hexChainId) { + chainName = "Polygon Mainnet"; + currency = "Matic Token"; + symbol = "MATIC"; + rpcUrl = "https://rpc-mainnet.maticvigil.com/"; + blockExplorerUrl = "https://polygonscan.com/"; + } + + try { + await window.ethereum.request({ + method: "wallet_addEthereumChain", + params: [ + { + chainId: newChainId, + chainName, + nativeCurrency: { + name: currency, + symbol, + decimals: 18, + }, + rpcUrls: [rpcUrl], + blockExplorerUrls: [blockExplorerUrl], + }, + ], + }); + } catch (addError) { + // handle "add" error + } + } + async function changeNetwork(newChainId: string) { if (currentNetwork.wallet === "metamask") { try { @@ -61,37 +103,11 @@ const Header = ({ signerAddress }: props) => { // This error code indicates that the chain has not been added to MetaMask. if ( error.code === 4902 && - (newChainId === NETWORKS.okovan.hexChainId || newChainId === NETWORKS.polygon.hexChainId) + (newChainId === NETWORKS.optimism.hexChainId || + newChainId === NETWORKS.okovan.hexChainId || + newChainId === NETWORKS.polygon.hexChainId) ) { - try { - await window.ethereum.request({ - method: "wallet_addEthereumChain", - params: [ - { - chainId: newChainId, - chainName: - newChainId === NETWORKS.okovan.hexChainId - ? "Optimistic Ethereum (Kovan)" - : "Polygon Mainnet", - nativeCurrency: { - name: newChainId === NETWORKS.okovan.hexChainId ? "Ether (ETH)" : "Matic Token", - symbol: newChainId === NETWORKS.okovan.hexChainId ? "ETH" : "MATIC", - decimals: 18, - }, - rpcUrls: - newChainId === NETWORKS.okovan.hexChainId - ? ["https://kovan.optimism.io"] - : ["https://rpc-mainnet.maticvigil.com/"], - blockExplorerUrls: - newChainId === NETWORKS.okovan.hexChainId - ? ["https://kovan-optimistic.etherscan.io"] - : ["https://polygonscan.com/"], - }, - ], - }); - } catch (addError) { - // handle "add" error - } + addNetwork(newChainId); } } } @@ -128,47 +144,47 @@ const Header = ({ signerAddress }: props) => { // eslint-disable-next-line }, [signerAddress, currentNetwork.chainId]); + const EthereumBtn = () => ( + <> + +
{currentNetwork.chainId === NETWORKS.mainnet.chainId ? "Ethereum" : "Rinkeby"}
+ + ); + + const OptimismBtn = () => ( + <> + +
{currentNetwork.chainId === NETWORKS.optimism.chainId ? "Optimism" : "Kovan"}
+ + ); + + const PolygonBtn = () => ( + <> + +
{currentNetwork.chainId === NETWORKS.polygon.chainId ? "Polygon" : "Mumbai"}
+ + ); + return (
From 60aeb471d59e442aca85b64e7f2043e834d98a58 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 9 Feb 2022 11:11:06 -0600 Subject: [PATCH 026/278] updating optimism vaults adresses --- src/components/Vault/Details.tsx | 6 +- src/contracts/cryptex.json | 140 ++----------------------------- src/utils/constants.tsx | 6 ++ src/utils/utils.tsx | 3 +- 4 files changed, 18 insertions(+), 137 deletions(-) diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index 32bb727..4f3d911 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -874,6 +874,7 @@ const Details = ({ address }: props) => { const action = async () => { if (selectedVaultId === "0") { + setBtnDisabled(true); try { const tx = await selectedVaultContract?.createVault(); notifyUser(tx, refresh); @@ -882,7 +883,9 @@ const Details = ({ address }: props) => { errorNotification("Transaction rejected"); } } + setBtnDisabled(false); } else { + setBtnDisabled(true); try { const amount = approveValue; const tx = await selectedCollateralContract?.approve( @@ -895,6 +898,7 @@ const Details = ({ address }: props) => { errorNotification("Transaction rejected"); } } + setBtnDisabled(false); } }; @@ -1331,7 +1335,7 @@ const Details = ({ address }: props) => {
{title}

{text}

-
diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index a454276..61e21dd 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -32417,7 +32417,7 @@ ] }, "DAIVaultHandler": { - "address": "0x1A14F9367Db41400BE5d38a0bC48d4Cc2e4B7157", + "address": "0x2C890633Db29f21fccbA57c68DcCEF09AB0D4763", "abi": [ { "inputs": [ @@ -32876,19 +32876,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "MAX_DECIMAL_PLACES", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "MAX_FEE", @@ -32993,19 +32980,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "collateralDecimalsAdjustmentFactor", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "collateralPriceOracle", @@ -34149,7 +34123,7 @@ ] }, "LinkVaultHandler": { - "address": "0x717170B66654292dFBd89c39F5aE6753D2aC1381", + "address": "0x61925C38e28F60e688f7d05E65f63792166a5aFE", "abi": [ { "inputs": [ @@ -34608,19 +34582,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "MAX_DECIMAL_PLACES", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "MAX_FEE", @@ -34725,19 +34686,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "collateralDecimalsAdjustmentFactor", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "collateralPriceOracle", @@ -36204,7 +36152,7 @@ ] }, "SNXVaultHandler": { - "address": "0x443366a7a5821619D8d57405511E4fadD9964771", + "address": "0xc8BB1cd417D20116387a5e0603e195cA4f3Cf59A", "abi": [ { "inputs": [ @@ -36663,19 +36611,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "MAX_DECIMAL_PLACES", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "MAX_FEE", @@ -36780,19 +36715,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "collateralDecimalsAdjustmentFactor", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "collateralPriceOracle", @@ -38517,7 +38439,7 @@ ] }, "UNIVaultHandler": { - "address": "0x5B577578565c2404BB84E734F583CF8523236eF1", + "address": "0x66ae98E432329E42B7988CFDCB6f524b1999CB4a", "abi": [ { "inputs": [ @@ -38976,19 +38898,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "MAX_DECIMAL_PLACES", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "MAX_FEE", @@ -39093,19 +39002,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "collateralDecimalsAdjustmentFactor", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "collateralPriceOracle", @@ -39767,7 +39663,7 @@ ] }, "WETHVaultHandler": { - "address": "0x56549e2fE1D9f0a9556f92494d04F263A5011a00", + "address": "0xE0c99C503c4AE5eC50aC63C59C7eF4725C355fdD", "abi": [ { "inputs": [ @@ -40226,19 +40122,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "MAX_DECIMAL_PLACES", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "MAX_FEE", @@ -40350,19 +40233,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "collateralDecimalsAdjustmentFactor", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "collateralPriceOracle", diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 3877d6b..1fbd184 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -42,6 +42,9 @@ export const NETWORKS = { link: "0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6", snx: "0x8700daec35af8ff88c16bdf0418774cb3d7599b4", uni: "0x6fd9d7ad17242c41f7131d257212c54a0e816691", + infuraRpcUrl: "https://optimism-mainnet.infura.io/v3/".concat( + process.env.REACT_APP_INFURA_ID || "" + ), }, okovan: { chainId: 69, @@ -50,6 +53,9 @@ export const NETWORKS = { eth: "0x13fcDc22A2C9E558f21d17B688C38B2B5E2B4eF6", weth: "0x13fcDc22A2C9E558f21d17B688C38B2B5E2B4eF6", dai: "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + infuraRpcUrl: "https://optimism-kovan.infura.io/v3/".concat( + process.env.REACT_APP_INFURA_ID || "" + ), }, polygon: { chainId: 137, diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index f9563c5..8750b70 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -287,7 +287,8 @@ export const getDefaultProvider = (chainId: number | undefined, name: string | u if (chainId === NETWORKS.okovan.chainId) { provider = ethers.getDefaultProvider(process.env.REACT_APP_ALCHEMY_URL_OKOVAN); } else if (chainId === NETWORKS.optimism.chainId) { - provider = ethers.getDefaultProvider(process.env.REACT_APP_ALCHEMY_URL_OPTIMISM); + // provider = ethers.getDefaultProvider(process.env.REACT_APP_ALCHEMY_URL_OPTIMISM); + provider = ethers.getDefaultProvider(NETWORKS.optimism.infuraRpcUrl); } else { const alchemyKey = chainId === NETWORKS.mainnet.chainId From 34183c587171385b0487b3a63a9b60b1e44f689b Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 9 Feb 2022 13:40:18 -0600 Subject: [PATCH 027/278] fixed bug when changing network from coinbase wallet --- src/App.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index be2b8c8..13d740b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -585,13 +585,15 @@ const App = () => { const cAddress = await currentSigner.getAddress(); setCurrentSignerAddress(cAddress); setCurrentNetwork(network.chainId, walletName); + // @ts-ignore networkProvider.on("chainChanged", (chainId: number) => { - setCurrentNetwork(chainId, ""); - window.location.reload(); + if (chainId !== network.chainId) { + setCurrentNetwork(chainId, ""); + window.location.reload(); + } }); - - if (!networkProvider.isFortmatic) { + if (networkProvider.isFortmatic) { // @ts-ignore networkProvider.on("accountsChanged", (accounts: string[]) => { if (accounts.length === 0) { From bb8a548f575cbc132ee721a18c7bc696145ad7a4 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 9 Feb 2022 16:07:56 -0600 Subject: [PATCH 028/278] updating mobile network button style --- src/styles/header.scss | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/styles/header.scss b/src/styles/header.scss index 7e21053..d959873 100644 --- a/src/styles/header.scss +++ b/src/styles/header.scss @@ -82,5 +82,20 @@ padding-right: 0rem; justify-content: center; margin-top: 70px; + + .network-container { + .btn { + width: 85%; + .title { + justify-content: center; + } + h6 { + margin-left: 2rem; + } + } + } + .info { + justify-content: center; + } } } From e880edab466b460febba673bd742f461155ed07f Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 10 Feb 2022 23:26:08 -0600 Subject: [PATCH 029/278] updating network button design --- src/App.tsx | 13 ++-- src/assets/images/graph/optimism.svg | 2 +- src/components/Header.tsx | 89 ++++++++++++++++++++++++++-- src/components/Vault/Details.tsx | 8 +-- src/hooks/useNetworks.tsx | 6 ++ src/state/NetworkContext.tsx | 4 ++ src/styles/header.scss | 50 ++++++++++++++++ 7 files changed, 159 insertions(+), 13 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 13d740b..04bf9b8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,6 +5,7 @@ import { ethers } from "ethers"; import { Provider, Contract, setMulticallAddress } from "ethers-multicall"; import { ToastContainer } from "react-toastify"; import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; +import { getProviderInfo } from "web3modal"; import "react-toastify/dist/ReactToastify.css"; import "./styles/toast.scss"; import { useSwipeable } from "react-swipeable"; @@ -82,7 +83,7 @@ const App = () => { setMulticallAddress(NETWORKS.optimism.chainId, "0xD0E99f15B24F265074747B2A1444eB02b9E30422"); setMulticallAddress(NETWORKS.okovan.chainId, "0x4EFBb8983D5C18A8b6B5084D936B7D12A0BEe2c9"); - const setCurrentNetwork = (networkId: number, walletName: string) => { + const setCurrentNetwork = (networkId: number, walletName: string, isBrowserWallet: boolean) => { let cNetwork; switch (networkId) { case 1: @@ -114,6 +115,7 @@ const App = () => { networks.setCurrentName(cNetwork.name); networks.setCurrentWETHAddress(cNetwork.weth); networks.setCurrentDAIAddress(cNetwork.dai); + networks.setCurrentIsBrowserWallet(isBrowserWallet); if (walletName !== "") networks.setCurrentWallet(walletName); }; @@ -582,14 +584,17 @@ const App = () => { } else { await setContracts(currentSigner, ethcallProvider, network.chainId || 4); } + + const isBrowserWallet = + networkProvider.isMetaMask || getProviderInfo(networkProvider.id === "walletlink"); const cAddress = await currentSigner.getAddress(); setCurrentSignerAddress(cAddress); - setCurrentNetwork(network.chainId, walletName); + setCurrentNetwork(network.chainId, walletName, isBrowserWallet); // @ts-ignore networkProvider.on("chainChanged", (chainId: number) => { if (chainId !== network.chainId) { - setCurrentNetwork(chainId, ""); + setCurrentNetwork(chainId, "", isBrowserWallet); window.location.reload(); } }); @@ -628,7 +633,7 @@ const App = () => { } else { setContracts(randomSigner, ethcallProvider, parseInt(chainId)); } - setCurrentNetwork(parseInt(chainId), ""); + setCurrentNetwork(parseInt(chainId), "", false); setLoading(false); } } diff --git a/src/assets/images/graph/optimism.svg b/src/assets/images/graph/optimism.svg index 5884101..10af787 100644 --- a/src/assets/images/graph/optimism.svg +++ b/src/assets/images/graph/optimism.svg @@ -1,2 +1,2 @@ - \ No newline at end of file diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 89faee6..5c82d2d 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -1,6 +1,7 @@ import React, { useContext, useEffect, useState } from "react"; import Nav from "react-bootstrap/esm/Nav"; import Button from "react-bootstrap/esm/Button"; +import Dropdown from "react-bootstrap/Dropdown"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; import "../styles/header.scss"; @@ -93,7 +94,7 @@ const Header = ({ signerAddress }: props) => { } async function changeNetwork(newChainId: string) { - if (currentNetwork.wallet === "metamask") { + if (currentNetwork.isBrowserWallet) { try { await window.ethereum.request({ method: "wallet_switchEthereumChain", @@ -113,6 +114,27 @@ const Header = ({ signerAddress }: props) => { } } + const onNetworkChange = async (newChainId: string | null) => { + if (currentNetwork.isBrowserWallet) { + try { + await window.ethereum.request({ + method: "wallet_switchEthereumChain", + params: [{ chainId: newChainId }], + }); + } catch (error) { + // This error code indicates that the chain has not been added to MetaMask. + if ( + error.code === 4902 && + (newChainId === NETWORKS.optimism.hexChainId || + newChainId === NETWORKS.okovan.hexChainId || + newChainId === NETWORKS.polygon.hexChainId) + ) { + addNetwork(newChainId); + } + } + } + }; + useEffect(() => { const loadAddress = async () => { if (signerAddress !== "" && signer.signer && tokens.tcapToken) { @@ -144,6 +166,7 @@ const Header = ({ signerAddress }: props) => { // eslint-disable-next-line }, [signerAddress, currentNetwork.chainId]); + /* const EthereumBtn = () => ( <> @@ -164,6 +187,46 @@ const Header = ({ signerAddress }: props) => {
{currentNetwork.chainId === NETWORKS.polygon.chainId ? "Polygon" : "Mumbai"}
); + */ + + const EthereumToggle = () => ( + <> + +
{process.env.REACT_APP_NETWORK_ID === "1" ? "Ethereum" : "Rinkeby"}
+ + ); + + const EthereumOpt = () => ( + + {EthereumToggle()} + + ); + + const OptimismToggle = () => ( + <> + +
{process.env.REACT_APP_NETWORK_ID === "1" ? "Optimism" : "Kovan"}
+ + ); + + const OptimismOpt = () => ( + + {OptimismToggle()} + + ); + + const PolygonToggle = () => ( + <> + +
{process.env.REACT_APP_NETWORK_ID === "1" ? "Polygon" : "Mumbai"}
+ + ); + + /* const PolygonOpt = () => ( + + {PolygonToggle()} + + ); */ return (
+ +
Vaults
+ 1,200 + + +
Collateral (USD)
+ $2,580,200.55 + + +
+
Debt
+ +
+ 5,210.55 + + +
Debt (USD)
+ $988,180.81 + + + + + + + +
+
Collateral:
+ + +
+ DAI +
+
+ + ETH + WETH + DAI + AAVE + LINK + +
+
+
+
Status:
+ + +
+ All +
+
+ + Empty + Ready + Active + Liquidation + +
+
+
+ + {radios.map((radio, idx) => ( + setRadioValue(e.currentTarget.value)} + > + {radio.name} + + ))} + +
+ +
- Available PoolsLiquidity{t("pools.available")}{t("pools.liquidity")}
+ + + + + + + + + + + + {vaults.map((v, index) => { + console.log("enter"); + return ( + + + + + + + + + ); + })} + +
StatusCollateralCollateral (USD) +
+ Debt +
+
Debt (USD)Ratio
+
+ {capitalize(v.status)} +
+
+
+ {v.collateral_value} + +
+
+
+ ${v.collateral_usd} +
+
+
+ {v.debt} +
+
+
+ ${v.debt_usd} +
+
+
+ + {v.ratio} + {v.ratio === "N/A" ? "" : "%"} + +
+
+
- - - - - - - - - - - - {vaults.map((v, index) => { - console.log("enter"); - return ( - - - - - - - - - ); - })} - -
StatusCollateralCollateral (USD) -
- Debt -
-
Debt (USD)Ratio
-
- {capitalize(v.status)} -
-
-
- {v.collateral_value} - -
-
-
- ${v.collateral_usd} -
-
-
- {v.debt} -
-
-
- ${v.debt_usd} -
-
-
- - {v.ratio} - {v.ratio === "N/A" ? "" : "%"} - -
-
+ diff --git a/src/components/Vault/Monitoring/vaults.tsx b/src/components/Vault/Monitoring/vaults.tsx new file mode 100644 index 0000000..5fae521 --- /dev/null +++ b/src/components/Vault/Monitoring/vaults.tsx @@ -0,0 +1,95 @@ +import React from "react"; +import Table from "react-bootstrap/Table"; +import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; +import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; +import { ReactComponent as DAIIcon } from "../../../assets/images/graph/DAI.svg"; +import { ReactComponent as AAVEIcon } from "../../../assets/images/graph/aave.svg"; +import { ReactComponent as LINKIcon } from "../../../assets/images/graph/chainlink.svg"; +import { vaultsType } from "../data"; + +type dataType = { + vaults: Array; +}; +type iconProps = { + name: string; +}; + +export const Vaults = ({ vaults }: dataType) => { + const CollateralIcon = ({ name }: iconProps) => { + console.log("AA"); + switch (name) { + case "eth": + return ; + case "dai": + return ; + case "aave": + return ; + default: + return ; + } + }; + + const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); + + return ( + + + + + + + + + + + + + {vaults.map((v, index) => { + console.log("enter"); + return ( + + + + + + + + + ); + })} + +
StatusCollateralCollateral (USD) +
+ Debt +
+
Debt (USD)Ratio
+
+ {capitalize(v.status)} +
+
+
+ {v.collateral_value} + +
+
+
+ ${v.collateral_usd} +
+
+
+ {v.debt} +
+
+
+ ${v.debt_usd} +
+
+
+ + {v.ratio} + {v.ratio === "N/A" ? "" : "%"} + +
+
+ ); +}; diff --git a/src/components/Vault/index.tsx b/src/components/Vault/index.tsx index 07bc84b..e1cac8e 100644 --- a/src/components/Vault/index.tsx +++ b/src/components/Vault/index.tsx @@ -1,3 +1,3 @@ export * from "./Vault"; -export * from "./Monitoring"; +export * from "./Monitoring/index"; diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 8750b70..9bed998 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -4,6 +4,7 @@ import { Fragment, JsonFragment } from "@ethersproject/abi"; import { toast } from "react-toastify"; import toasty from "../assets/images/toasty.png"; import { FEATURES, NETWORKS } from "./constants"; +import { OraclesContext } from "../state/OraclesContext"; export const makeShortAddress = (address: string) => { const shortAddress = `${address.substr(0, 6).toString()}...${address @@ -301,3 +302,26 @@ export const getDefaultProvider = (chainId: number | undefined, name: string | u } return provider; }; + +export const validOracles = (chainId: number, oracles: OraclesContext): boolean => { + let valid = + !isUndefined(oracles.wethOracleRead) && + !isUndefined(oracles.daiOracleRead) && + !isUndefined(oracles.tcapOracleRead); + + if (isInLayer1(chainId)) { + valid = valid && !isUndefined(oracles.aaveOracle) && !isUndefined(oracles.linkOracle); + } + if (isOptimism(chainId)) { + valid = + valid && + !isUndefined(oracles.linkOracleRead) && + !isUndefined(oracles.snxOracleRead) && + !isUndefined(oracles.uniOracleRead); + } + + if (chainId === NETWORKS.polygon.chainId) { + valid = valid && !isUndefined(oracles.maticOracle) && !isUndefined(oracles.maticOracleRead); + } + return valid; +}; From 503c2e010839c4928f15e9184b7f4d587a37a557 Mon Sep 17 00:00:00 2001 From: Jorge Destephen Lavaire Date: Thu, 24 Feb 2022 20:16:20 -0600 Subject: [PATCH 037/278] Rename WBTC.svg to wbtc.svg --- src/assets/images/graph/{WBTC.svg => wbtc.svg} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/assets/images/graph/{WBTC.svg => wbtc.svg} (100%) diff --git a/src/assets/images/graph/WBTC.svg b/src/assets/images/graph/wbtc.svg similarity index 100% rename from src/assets/images/graph/WBTC.svg rename to src/assets/images/graph/wbtc.svg From f4447f53c6b9808029d93482b2a29d83544a246f Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 24 Feb 2022 22:11:43 -0600 Subject: [PATCH 038/278] safe remove collateral fixed decimals rounding --- src/components/Vault/Details.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index 7ca91f3..ec7ec74 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -759,13 +759,16 @@ const Details = ({ address, t }: props) => { e.preventDefault(); const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - const collateralToRemove = await getSafeRemoveCollateral( + let collateralToRemove = await getSafeRemoveCollateral( minRatio, vaultCollateral, currentPrice, currentTcapPrice, vaultDebt ); + if (selectedVaultDecimals === 8) { + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; + } setRemoveCollateralTxt(collateralToRemove.toString()); let usd = toUSD(currentPrice, collateralToRemove.toString()); if (!usd) { From 419017aea982b5bc5dcf35b07ee917539a7b6ab8 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 24 Feb 2022 22:28:45 -0600 Subject: [PATCH 039/278] safe remove collateral fixed decimals rounding --- src/components/Vault/Details.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index ec7ec74..cfc96d4 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -767,7 +767,9 @@ const Details = ({ address, t }: props) => { vaultDebt ); if (selectedVaultDecimals === 8) { + console.log(collateralToRemove); collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); } setRemoveCollateralTxt(collateralToRemove.toString()); let usd = toUSD(currentPrice, collateralToRemove.toString()); From 552c781e481709762d6fff83375c8a8cd93a0a57 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 25 Feb 2022 13:35:01 -0600 Subject: [PATCH 040/278] update tcap token address --- public/locales/en/translation.json | 3 ++- public/locales/fr/translation.json | 3 ++- public/locales/zh/translation.json | 3 ++- src/components/Vault/Details.tsx | 10 ++++++++-- src/contracts/cryptex.json | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index c21568f..3bb7fe2 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -81,7 +81,8 @@ }, "errors": { "no-collateral": "Not enough collateral on vault", - "burn-too-high": "Burn value too high" + "burn-too-high": "Burn value too high", + "burn-balance-low": "Burn value is greater than your balance." } }, "pools": { diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 25b5c9b..292eec2 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -81,7 +81,8 @@ }, "errors": { "no-collateral": "Not enough collateral on vault", - "burn-too-high": "Burn value too high" + "burn-too-high": "Burn value too high", + "burn-balance-low": "Burn value is greater than your balance." } }, "pools": { diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json index e8e4881..4e64c59 100644 --- a/public/locales/zh/translation.json +++ b/public/locales/zh/translation.json @@ -81,7 +81,8 @@ }, "errors": { "no-collateral": "保险库没有足够的抵押品", - "burn-too-high": "销毁值太高" + "burn-too-high": "销毁值太高", + "burn-balance-low": "Burn value is greater than your balance." } }, "pools": { diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index cfc96d4..0fc49b3 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -767,7 +767,6 @@ const Details = ({ address, t }: props) => { vaultDebt ); if (selectedVaultDecimals === 8) { - console.log(collateralToRemove); collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); } @@ -829,9 +828,13 @@ const Details = ({ address, t }: props) => { const burnTCAP = async () => { if (burnTxt) { + const amount = ethers.utils.parseEther(burnTxt); + // const currentBalanceCall = await tokens.tcapTokenRead?.balanceOf(address); + // @ts-ignore + // const [currentBalance] = await signer.ethcallProvider?.all([currentBalanceCall]); + // if (amount.lt(currentBalance)) { setBtnDisabled(true); try { - const amount = ethers.utils.parseEther(burnTxt); const currentBurnFee = await selectedVaultContract?.getFee(amount); const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); @@ -850,6 +853,9 @@ const Details = ({ address, t }: props) => { setBurnTxt(""); setBurnUSD("0"); setBurnFee("0"); + /* } else { + errorNotification(t("vault.errors.burn-balance-low")); + } */ } else { errorNotification(t("errors.empty")); } diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index 062f2f9..2e705b7 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -70311,7 +70311,7 @@ ] }, "TCAP": { - "address": "0x4799639D4cdD9eCd21c0605cC2F8aa3c14B59724", + "address": "0x10Da9F7b73F98702A2705D0130365d19B7c08557", "abi": [ { "inputs": [ From 8f5258ff1fc63f8f4f660cf6d228f3da28497c64 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 1 Mar 2022 19:59:02 -0600 Subject: [PATCH 041/278] added pagination --- .eslintrc | 3 +- src/components/Vault/Monitoring/index.tsx | 352 +++++++++++++++++---- src/components/Vault/Monitoring/types.tsx | 79 +++++ src/components/Vault/Monitoring/vaults.tsx | 38 +-- src/utils/constants.tsx | 2 +- src/utils/utils.tsx | 15 + 6 files changed, 393 insertions(+), 96 deletions(-) create mode 100644 src/components/Vault/Monitoring/types.tsx diff --git a/.eslintrc b/.eslintrc index 06c418a..e53d468 100644 --- a/.eslintrc +++ b/.eslintrc @@ -77,6 +77,7 @@ "props": false } ], + "no-array-constructor": "off", "no-console": 0, "import/prefer-default-export": 0, "import": 0, @@ -154,7 +155,7 @@ "custom": "enforce", "exceptions": [ "Container" - ], + ] } ], "react/jsx-no-bind": 0 diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 48a786c..34e0d48 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -1,4 +1,5 @@ import React, { useContext, useEffect, useState } from "react"; +import { ethers, BigNumber } from "ethers"; import ButtonGroup from "react-bootstrap/esm/ButtonGroup"; import Card from "react-bootstrap/esm/Card"; import Col from "react-bootstrap/Col"; @@ -6,42 +7,115 @@ import Dropdown from "react-bootstrap/Dropdown"; import Pagination from "react-bootstrap/Pagination"; import ToggleButton from "react-bootstrap/esm/ToggleButton"; import "../../../styles/vault-monitoring.scss"; -import { useQuery, gql, NetworkStatus } from "@apollo/client"; +import { useQuery, gql } from "@apollo/client"; import NetworkContext from "../../../state/NetworkContext"; import OraclesContext from "../../../state/OraclesContext"; import SignerContext from "../../../state/SignerContext"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; -import { ReactComponent as DAIIcon } from "../../../assets/images/graph/DAI.svg"; +import { getRatio2, isInLayer1, isOptimism, toUSD, validOracles } from "../../../utils/utils"; import { Vaults } from "./vaults"; -import { vaultsType } from "../data"; -import { isInLayer1, isOptimism, isPolygon, validOracles } from "../../../utils/utils"; +import { + capitalize, + CollateralIcon, + DropdownItemType, + OraclePricesType, + PaginationType, + VaultsType, +} from "./types"; + +const pagDefault = { + previous: 0, + current: 0, + next: 0, + pages: 0, + itemsPerPage: 20, + itemsCount: 0, + lastId: "", +}; export const Monitoring = () => { const currentNetwork = useContext(NetworkContext); const oracles = useContext(OraclesContext); const signer = useContext(SignerContext); - const [vaults, setVaults] = useState>([]); + const [currentAddress, setCurrentAddress] = useState(""); + const [oraclePrices, setOraclePrices] = useState(); + const [vaults, setVaults] = useState>([]); + const [pagination, setPagination] = useState(pagDefault); + const [pricesUpdated, setPricesUpdated] = useState(false); + const [owner, setOwner] = useState(""); const [radioValue, setRadioValue] = useState("1"); + const [tokenSymbol, setTokenSymbol] = useState("all"); + const [currentStatus, setCurrentStatus] = useState("all"); const radios = [ { name: "All Vaults", value: "1" }, { name: "My Vaults", value: "2" }, ]; - const vaultsQuery = gql` - query allVaults { - vaults(first: 100) { - id - vaultId - owner - collateral - debt - currentRatio - tokenSymbol + const statusList = [ + { key: "all", name: "All" }, + { key: "empty", name: "Empty" }, + { key: "ready", name: "Ready" }, + { key: "active", name: "Active" }, + { key: "liquidation", name: "Liquidation" }, + ]; + + const buildFilters = () => { + const weiLimit = "100000000"; + let filter = ""; + let ownerFilter = ""; + let vaultFilter = ""; + let statusFilter = ""; + if (radioValue === "2" && owner !== "") { + ownerFilter = `owner: "${owner}"`; + } + if (tokenSymbol !== "all") { + vaultFilter = `tokenSymbol: "${tokenSymbol.toUpperCase()}"`; + } + if (currentStatus !== "all") { + if (currentStatus === "empty") { + statusFilter = `collateral_lt: "${weiLimit}"`; } + if (currentStatus === "ready") { + statusFilter = `collateral_gte: "${weiLimit}", debt_lt: "${weiLimit}"`; + } + } + + filter = ownerFilter; + if (vaultFilter !== "") { + filter = filter === "" ? `${vaultFilter}` : filter.concat(`, ${vaultFilter}`); + } + if (statusFilter !== "") { + filter = filter === "" ? `${statusFilter}` : filter.concat(`, ${statusFilter}`); } + if (filter !== "") { + filter = `, where: { ${filter} }`; + } + + return filter; + }; + + const str = + "query allVaults {" + + `vaults(first: 20 ${buildFilters()}) {` + + "id " + + "vaultId " + + "owner " + + "collateral " + + "debt " + + "currentRatio " + + "tokenSymbol " + + "} " + + "}"; + + const vaultsQuery = gql` + ${str} `; const loadPrices = async () => { if (signer && oracles && validOracles(currentNetwork.chainId || 1, oracles)) { + if (signer.signer) { + const address = await signer.signer.getAddress(); + setCurrentAddress(address); + } const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); @@ -64,23 +138,18 @@ export const Monitoring = () => { ethcalls.push(snxOraclePriceCall); ethcalls.push(uniOraclePriceCall); } - let tcapOraclePrice; - let daiOraclePrice; - let wethOraclePrice; - let aaveOraclePrice; - let linkOraclePrice; - let snxOraclePrice; - let uniOraclePrice; + let tcapOraclePrice = BigNumber.from(0); + let wethOraclePrice = BigNumber.from(0); + let daiOraclePrice = BigNumber.from(0); + let aaveOraclePrice = BigNumber.from(0); + let linkOraclePrice = BigNumber.from(0); + let uniOraclePrice = BigNumber.from(0); + let snxOraclePrice = BigNumber.from(0); if (isInLayer1(currentNetwork.chainId)) { // @ts-ignore - [ - tcapOraclePrice, - daiOraclePrice, - wethOraclePrice, - aaveOraclePrice, - linkOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); + [tcapOraclePrice, daiOraclePrice, wethOraclePrice, aaveOraclePrice, linkOraclePrice] = + await signer.ethcallProvider?.all(ethcalls); } else if (isOptimism(currentNetwork.chainId)) { // @ts-ignore [ @@ -92,47 +161,201 @@ export const Monitoring = () => { uniOraclePrice, ] = await signer.ethcallProvider?.all(ethcalls); } + + setOraclePrices({ + tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice.mul(10000000000)), + wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), + daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), + aaveOraclePrice: ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)), + linkOraclePrice: ethers.utils.formatEther(linkOraclePrice.mul(10000000000)), + uniOraclePrice: ethers.utils.formatEther(uniOraclePrice.mul(10000000000)), + snxOraclePrice: ethers.utils.formatEther(snxOraclePrice.mul(10000000000)), + maticOraclePrice: "0", + wbtcOraclePrice: "0", + }); + setPricesUpdated(true); } }; - useEffect(() => { - loadPrices(); - }, []); + useEffect( + () => { + if (!pricesUpdated) { + loadPrices(); + } + }, + // eslint-disable-next-line + [oracles, currentNetwork.chainId] + ); - /* const loadVaults = (vaultsData: any) => { - vautltsData.map((v, index) => { + const getCollateralPrice = (symbol: string) => { + let price = "0"; + switch (symbol) { + case "ETH": + price = oraclePrices?.wethOraclePrice || "0"; + break; + case "DAI": + price = oraclePrices?.daiOraclePrice || "0"; + break; + case "AAVE": + price = oraclePrices?.aaveOraclePrice || "0"; + break; + case "LINK": + price = oraclePrices?.linkOraclePrice || "0"; + break; + case "UNI": + price = oraclePrices?.uniOraclePrice || "0"; + break; + case "SNX": + price = oraclePrices?.snxOraclePrice || "0"; + break; + case "MATIC": + price = oraclePrices?.maticOraclePrice || "0"; + break; + case "WBTC": + price = oraclePrices?.wbtcOraclePrice || "0"; + break; + default: + break; + } + return price; + }; + const loadVaults = async (vaultsData: any) => { + const vData = new Array(); + // @ts-ignore + vaultsData.vaults.forEach((v) => { + const collateral = ethers.utils.formatEther(v.collateral); + const debt = ethers.utils.formatEther(v.debt); + const collateralPrice = getCollateralPrice(v.tokenSymbol); + const collateralUSD = toUSD(collateral, collateralPrice); + const debtUSD = toUSD(debt, collateralPrice); + const ratio = getRatio2( + collateral, + collateralPrice, + debt, + oraclePrices?.tcapOraclePrice || "1" + ); + let status = "liquidation"; + if (collateralUSD === 0) { + status = "empty"; + } else if (collateralUSD > 0 && debtUSD === 0) { + status = "ready"; + } else if (ratio >= 150) { + status = "active"; + } + vData.push({ + id: v.id, + collateralSymbol: v.tokenSymbol, + collateralValue: collateral, + collateralUsd: collateralUSD.toFixed(2), + debt, + debtUsd: debtUSD.toFixed(2), + ratio, + minRatio: "", + status, + }); }); - } */ + setVaults(vData); + const lastVaultId = vData[vData.length - 1].id; + const itemsCount = pagination.itemsCount + vData.length; + const pages = Math.ceil(itemsCount / pagination.itemsPerPage); + const pag = { + previous: 0, + current: 1, + next: 2, + pages, + itemsPerPage: pagination.itemsPerPage, + itemsCount, + lastId: lastVaultId, + }; + setPagination(pag); + }; - const { data, error, refetch, networkStatus } = useQuery(vaultsQuery, { + const { data, error } = useQuery(vaultsQuery, { fetchPolicy: "no-cache", notifyOnNetworkStatusChange: true, onError: () => { console.log(error); }, onCompleted: () => { - // loadVaults(data); + loadVaults(data); }, }); + const tokensSymbols = (): Array => { + const symbols = [{ key: "all", name: "All" }]; + if (isInLayer1(currentNetwork.chainId)) { + symbols.push({ key: "eth", name: "ETH" }); + symbols.push({ key: "weth", name: "WETH" }); + symbols.push({ key: "dai", name: "DAI" }); + symbols.push({ key: "aave", name: "AAVE" }); + symbols.push({ key: "link", name: "LINK" }); + } else if (isOptimism(currentNetwork.chainId)) { + symbols.push({ key: "eth", name: "ETH" }); + symbols.push({ key: "dai", name: "DAI" }); + symbols.push({ key: "link", name: "LINK" }); + symbols.push({ key: "uni", name: "UNI" }); + symbols.push({ key: "snx", name: "SNX" }); + } else { + symbols.push({ key: "matic", name: "MATIC" }); + symbols.push({ key: "dai", name: "DAI" }); + } + + return symbols; + }; + + const handleRadioBtnChange = (value: string) => { + setRadioValue(value); + if (value === "1") { + setOwner(""); + } else { + setOwner(currentAddress); + } + }; + + const handleStatusChange = (newStatus: string) => { + setCurrentStatus(newStatus); + }; + + const handleTokenChange = (newToken: string) => { + setTokenSymbol(newToken); + }; + + const VaultPages = () => { + const midPage = Math.floor(pagination.pages / 2); + return ( + <> + {1} + + {midPage - 2} + {midPage - 1} + midPage + {midPage + 1} + {midPage + 2} + + + {pagination.pages} + + + ); + }; + const VaultPagination = () => { - console.log("AA"); + const pag = Array.from(Array(10).keys()); + const activePag = pagination.current; return ( - {1} - - - {10} - {11} - {12} - {13} - {14} - - - {20} + {pagination.pages >= 10 ? ( + + ) : ( + pag.map((item) => ( + + {item + 1} + + )) + )} @@ -174,34 +397,35 @@ export const Monitoring = () => {
Collateral:
- + handleTokenChange(eventKey || "ALL")}>
- DAI + {tokenSymbol.toUpperCase()}
- ETH - WETH - DAI - AAVE - LINK + {tokensSymbols().map((item) => ( + + {item.name} + + ))}
Status:
- + handleStatusChange(eventKey || "ALL")}>
- All + {capitalize(currentStatus)}
- Empty - Ready - Active - Liquidation + {statusList.map((item) => ( + + {item.name} + + ))}
@@ -216,7 +440,7 @@ export const Monitoring = () => { name="radio" value={radio.value} checked={radioValue === radio.value} - onChange={(e) => setRadioValue(e.currentTarget.value)} + onChange={(e) => handleRadioBtnChange(e.currentTarget.value)} > {radio.name} @@ -226,7 +450,7 @@ export const Monitoring = () => { - + {pagination.pages > 0 && }
diff --git a/src/components/Vault/Monitoring/types.tsx b/src/components/Vault/Monitoring/types.tsx new file mode 100644 index 0000000..bf6c1d6 --- /dev/null +++ b/src/components/Vault/Monitoring/types.tsx @@ -0,0 +1,79 @@ +import React from "react"; +import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; +import { ReactComponent as DAIIcon } from "../../../assets/images/graph/DAI.svg"; +import { ReactComponent as AAVEIcon } from "../../../assets/images/graph/aave.svg"; +import { ReactComponent as LINKIcon } from "../../../assets/images/graph/chainlink.svg"; +import { ReactComponent as UNIIcon } from "../../../assets/images/graph/uni.svg"; +import { ReactComponent as SNXIcon } from "../../../assets/images/graph/snx.svg"; +import { ReactComponent as MATICIcon } from "../../../assets/images/graph/polygon.svg"; +import { ReactComponent as WBTCIcon } from "../../../assets/images/graph/wbtc.svg"; + +export type PaginationType = { + previous: number; + current: number; + next: number; + pages: number; + itemsPerPage: number; + itemsCount: number; + lastId: string; +}; + +export type OraclePricesType = { + tcapOraclePrice: string; + wethOraclePrice: string; + daiOraclePrice: string; + aaveOraclePrice: string; + linkOraclePrice: string; + uniOraclePrice: string; + snxOraclePrice: string; + maticOraclePrice: string; + wbtcOraclePrice: string; +}; + +export type VaultsType = { + id: string; + collateralSymbol: string; + collateralValue: string; + collateralUsd: string; + debt: string; + debtUsd: string; + ratio: number; + minRatio: string; + status: string; +}; + +export type DropdownItemType = { + key: string; + name: string; +}; + +type iconProps = { + name: string; +}; + +export const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); + +export const CollateralIcon = ({ name }: iconProps) => { + switch (name) { + case "eth": + return ; + case "weth": + return ; + case "dai": + return ; + case "aave": + return ; + case "link": + return ; + case "uni": + return ; + case "snx": + return ; + case "matic": + return ; + case "wbtc": + return ; + default: + return <>; + } +}; diff --git a/src/components/Vault/Monitoring/vaults.tsx b/src/components/Vault/Monitoring/vaults.tsx index 5fae521..37db21a 100644 --- a/src/components/Vault/Monitoring/vaults.tsx +++ b/src/components/Vault/Monitoring/vaults.tsx @@ -1,36 +1,14 @@ import React from "react"; import Table from "react-bootstrap/Table"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; -import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; -import { ReactComponent as DAIIcon } from "../../../assets/images/graph/DAI.svg"; -import { ReactComponent as AAVEIcon } from "../../../assets/images/graph/aave.svg"; -import { ReactComponent as LINKIcon } from "../../../assets/images/graph/chainlink.svg"; -import { vaultsType } from "../data"; +import { capitalize, CollateralIcon, VaultsType } from "./types"; type dataType = { - vaults: Array; -}; -type iconProps = { - name: string; + vaults: Array; }; export const Vaults = ({ vaults }: dataType) => { - const CollateralIcon = ({ name }: iconProps) => { - console.log("AA"); - switch (name) { - case "eth": - return ; - case "dai": - return ; - case "aave": - return ; - default: - return ; - } - }; - - const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); - + console.log("a"); return ( @@ -59,13 +37,13 @@ export const Vaults = ({ vaults }: dataType) => { diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 1fbd184..062d798 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -72,7 +72,7 @@ export const API_ENDPOINT = "https://api.cryptex.finance"; export const GRAPHQL_ENDPOINT = { mainnet: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo-2", - rinkeby: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-rinkeby-two", + rinkeby: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo-2", optimism: "https://api.thegraph.com/subgraphs/name/cryptexfinance/cryptex-optimism", okovan: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo", polygon: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-polygon", diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 9bed998..a2aa657 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -142,6 +142,21 @@ export const getRatio = async ( return ratio; }; +export const getRatio2 = ( + collateral: string, + collateralPrice: string, + debt: string, + tcapPrice: string +) => { + const c = parseFloat(collateral); + const cp = parseFloat(collateralPrice); + const d = parseFloat(debt); + const tp = parseFloat(tcapPrice); + if (d === 0 || tp === 0) return 0; + const ratio = (c * cp * 100) / (d * tp); + return ratio; +}; + export const getSafeMint = async ( ratio: string, collateral: string, From 683e6ff827b4c12b51c9fffd844c40adc8551bf7 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 3 Mar 2022 19:22:32 -0600 Subject: [PATCH 042/278] added total values --- src/components/Vault/Monitoring/index.tsx | 360 ++++++++++++++------- src/components/Vault/Monitoring/types.tsx | 62 ++-- src/components/Vault/Monitoring/vaults.tsx | 39 ++- src/styles/vault-monitoring.scss | 3 + src/utils/utils.tsx | 23 +- 5 files changed, 319 insertions(+), 168 deletions(-) diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 34e0d48..1426887 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -4,43 +4,66 @@ import ButtonGroup from "react-bootstrap/esm/ButtonGroup"; import Card from "react-bootstrap/esm/Card"; import Col from "react-bootstrap/Col"; import Dropdown from "react-bootstrap/Dropdown"; -import Pagination from "react-bootstrap/Pagination"; import ToggleButton from "react-bootstrap/esm/ToggleButton"; import "../../../styles/vault-monitoring.scss"; import { useQuery, gql } from "@apollo/client"; import NetworkContext from "../../../state/NetworkContext"; import OraclesContext from "../../../state/OraclesContext"; import SignerContext from "../../../state/SignerContext"; +import vaultsContext from "../../../state/VaultsContext"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; -import { getRatio2, isInLayer1, isOptimism, toUSD, validOracles } from "../../../utils/utils"; -import { Vaults } from "./vaults"; import { - capitalize, - CollateralIcon, + getRatio2, + isInLayer1, + isOptimism, + toUSD, + validOracles, + validVaults, +} from "../../../utils/utils"; +import { Vaults } from "./Vaults"; +import { VaultPagination } from "./Pagination"; +import Loading from "../../Loading"; +import { DropdownItemType, OraclePricesType, PaginationType, + VaultsRatioType, VaultsType, + VaultsTotalsType, } from "./types"; +import { capitalize, CollateralIcon, numberFormatStr } from "./common"; const pagDefault = { previous: 0, current: 0, next: 0, pages: 0, - itemsPerPage: 20, + itemsPerPage: 10, itemsCount: 0, - lastId: "", + lastId: "0", +}; + +const totalsDefault = { + vaults: 0, + collateral: "0", + collateralUSD: "0", + debt: "0", + debtUSD: "0", }; export const Monitoring = () => { const currentNetwork = useContext(NetworkContext); const oracles = useContext(OraclesContext); + const vaults = useContext(vaultsContext); const signer = useContext(SignerContext); + const [skipQuery, setSkipQuery] = useState(false); const [currentAddress, setCurrentAddress] = useState(""); const [oraclePrices, setOraclePrices] = useState(); - const [vaults, setVaults] = useState>([]); + const [vaultsRatio, setVaultsRatio] = useState(); + const [vaultsTotals, setVaultsTotals] = useState(totalsDefault); + const [vaultList, setVaultList] = useState>([]); const [pagination, setPagination] = useState(pagDefault); + const [loadMore, setLoadMore] = useState(false); const [pricesUpdated, setPricesUpdated] = useState(false); const [owner, setOwner] = useState(""); const [radioValue, setRadioValue] = useState("1"); @@ -65,7 +88,7 @@ export const Monitoring = () => { let vaultFilter = ""; let statusFilter = ""; if (radioValue === "2" && owner !== "") { - ownerFilter = `owner: "${owner}"`; + ownerFilter = `, owner: "${owner}"`; } if (tokenSymbol !== "all") { vaultFilter = `tokenSymbol: "${tokenSymbol.toUpperCase()}"`; @@ -81,21 +104,24 @@ export const Monitoring = () => { filter = ownerFilter; if (vaultFilter !== "") { - filter = filter === "" ? `${vaultFilter}` : filter.concat(`, ${vaultFilter}`); + filter = filter.concat(`, ${vaultFilter}`); } if (statusFilter !== "") { - filter = filter === "" ? `${statusFilter}` : filter.concat(`, ${statusFilter}`); + filter = filter.concat(`, ${statusFilter}`); } if (filter !== "") { - filter = `, where: { ${filter} }`; + if (loadMore) { + filter = `, where: { blockTS_gt: "${pagination.lastId}" ${filter} }`; + } else { + filter = `, where: { blockTS_gt: "0" ${filter} }`; + } } - return filter; }; const str = "query allVaults {" + - `vaults(first: 20 ${buildFilters()}) {` + + `vaults(first: 1000, orderBy: blockTS ${buildFilters()}) {` + "id " + "vaultId " + "owner " + @@ -103,6 +129,7 @@ export const Monitoring = () => { "debt " + "currentRatio " + "tokenSymbol " + + "blockTS " + "} " + "}"; @@ -143,8 +170,8 @@ export const Monitoring = () => { let daiOraclePrice = BigNumber.from(0); let aaveOraclePrice = BigNumber.from(0); let linkOraclePrice = BigNumber.from(0); - let uniOraclePrice = BigNumber.from(0); let snxOraclePrice = BigNumber.from(0); + let uniOraclePrice = BigNumber.from(0); if (isInLayer1(currentNetwork.chainId)) { // @ts-ignore @@ -163,7 +190,7 @@ export const Monitoring = () => { } setOraclePrices({ - tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice.mul(10000000000)), + tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), aaveOraclePrice: ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)), @@ -177,15 +204,55 @@ export const Monitoring = () => { } }; - useEffect( - () => { - if (!pricesUpdated) { - loadPrices(); + const loadRatios = async () => { + if (signer && vaults && validVaults(currentNetwork.chainId || 1, vaults)) { + const wethRatioCall = await vaults.wethVaultRead?.ratio(); + const daiRatioCall = await vaults.daiVaultRead?.ratio(); + const ethcalls = [wethRatioCall, daiRatioCall]; + + if (isInLayer1(currentNetwork.chainId)) { + const aaveRatioCall = await vaults.aaveVaultRead?.ratio(); + const linkRatioCall = await vaults.linkVaultRead?.ratio(); + ethcalls.push(aaveRatioCall); + ethcalls.push(linkRatioCall); } - }, - // eslint-disable-next-line - [oracles, currentNetwork.chainId] - ); + if (isOptimism(currentNetwork.chainId)) { + const linkRatioCall = await vaults.linkVaultRead?.ratio(); + const snxRatioCall = await vaults.snxVaultRead?.ratio(); + const uniRatioCall = await vaults.uniVaultRead?.ratio(); + ethcalls.push(linkRatioCall); + ethcalls.push(snxRatioCall); + ethcalls.push(uniRatioCall); + } + let ethRatio = 0; + let daiRatio = 0; + let aaveRatio = 0; + let linkRatio = 0; + let snxRatio = 0; + let uniRatio = 0; + + if (isInLayer1(currentNetwork.chainId)) { + // @ts-ignore + [ethRatio, daiRatio, aaveRatio, linkRatio] = await signer.ethcallProvider?.all(ethcalls); + } else if (isOptimism(currentNetwork.chainId)) { + // @ts-ignore + [ethRatio, daiRatio, linkRatio, snxRatio, uniRatio] = await signer.ethcallProvider?.all( + ethcalls + ); + } + setVaultsRatio({ + ethRatio, + wethRatio: ethRatio, + daiRatio, + aaveRatio, + linkRatio, + uniRatio, + snxRatio, + maticRatio: 0, + wbtcRatio: 0, + }); + } + }; const getCollateralPrice = (symbol: string) => { let price = "0"; @@ -193,6 +260,9 @@ export const Monitoring = () => { case "ETH": price = oraclePrices?.wethOraclePrice || "0"; break; + case "WETH": + price = oraclePrices?.wethOraclePrice || "0"; + break; case "DAI": price = oraclePrices?.daiOraclePrice || "0"; break; @@ -220,15 +290,56 @@ export const Monitoring = () => { return price; }; + const getMinRatio = (symbol: string) => { + let minRatio = 200; + switch (symbol) { + case "ETH": + minRatio = vaultsRatio?.ethRatio || 200; + break; + case "WETH": + minRatio = vaultsRatio?.ethRatio || 200; + break; + case "DAI": + minRatio = vaultsRatio?.daiRatio || 200; + break; + case "AAVE": + minRatio = vaultsRatio?.aaveRatio || 200; + break; + case "LINK": + minRatio = vaultsRatio?.linkRatio || 200; + break; + case "UNI": + minRatio = vaultsRatio?.uniRatio || 200; + break; + case "SNX": + minRatio = vaultsRatio?.snxRatio || 200; + break; + case "MATIC": + minRatio = vaultsRatio?.maticRatio || 200; + break; + case "WBTC": + minRatio = vaultsRatio?.wbtcRatio || 200; + break; + default: + break; + } + return minRatio; + }; + const loadVaults = async (vaultsData: any) => { const vData = new Array(); + const totals = { ...totalsDefault }; + + setSkipQuery(true); + setLoadMore(false); // @ts-ignore vaultsData.vaults.forEach((v) => { const collateral = ethers.utils.formatEther(v.collateral); const debt = ethers.utils.formatEther(v.debt); const collateralPrice = getCollateralPrice(v.tokenSymbol); const collateralUSD = toUSD(collateral, collateralPrice); - const debtUSD = toUSD(debt, collateralPrice); + const debtUSD = toUSD(debt, oraclePrices?.tcapOraclePrice || "0"); + const minRatio = getMinRatio(v.tokenSymbol); const ratio = getRatio2( collateral, collateralPrice, @@ -240,48 +351,86 @@ export const Monitoring = () => { status = "empty"; } else if (collateralUSD > 0 && debtUSD === 0) { status = "ready"; - } else if (ratio >= 150) { + } else if (ratio >= minRatio) { status = "active"; } - vData.push({ - id: v.id, - collateralSymbol: v.tokenSymbol, - collateralValue: collateral, - collateralUsd: collateralUSD.toFixed(2), - debt, - debtUsd: debtUSD.toFixed(2), - ratio, - minRatio: "", - status, - }); + + let addVault = true; + if (currentStatus === "active" || currentStatus === "liquidation") { + addVault = currentStatus === status; + } + + if (addVault) { + vData.push({ + id: v.id, + collateralSymbol: v.tokenSymbol, + collateralValue: collateral, + collateralUsd: collateralUSD.toFixed(2), + debt, + debtUsd: debtUSD.toFixed(2), + ratio, + minRatio: "", + status, + blockTS: v.blockTS, + }); + + totals.vaults += 1; + totals.collateral = (parseFloat(totals.collateral) + parseFloat(collateral)).toFixed(4); + totals.collateralUSD = (parseFloat(totals.collateralUSD) + collateralUSD).toFixed(2); + totals.debt = (parseFloat(totals.debt) + parseFloat(debt)).toFixed(4); + totals.debtUSD = (parseFloat(totals.debtUSD) + debtUSD).toFixed(2); + } }); - setVaults(vData); - const lastVaultId = vData[vData.length - 1].id; - const itemsCount = pagination.itemsCount + vData.length; - const pages = Math.ceil(itemsCount / pagination.itemsPerPage); - const pag = { - previous: 0, - current: 1, - next: 2, - pages, - itemsPerPage: pagination.itemsPerPage, - itemsCount, - lastId: lastVaultId, - }; - setPagination(pag); + setVaultList(vData); + setVaultsTotals(totals); + // Set pagination ddata + if (vData.length > 0) { + console.log("--- Len -----"); + console.log(vData.length); + const lastVaultId = vData[vData.length - 1].blockTS; + const itemsCount = vData.length; + const pages = Math.ceil(itemsCount / pagination.itemsPerPage); + const pag = { + previous: 0, + current: 1, + next: 2, + pages, + itemsPerPage: pagination.itemsPerPage, + itemsCount, + lastId: lastVaultId, + }; + setPagination(pag); + } else { + setPagination(pagDefault); + } }; - const { data, error } = useQuery(vaultsQuery, { + const { loading, data, error } = useQuery(vaultsQuery, { fetchPolicy: "no-cache", notifyOnNetworkStatusChange: true, + skip: skipQuery, onError: () => { console.log(error); }, onCompleted: () => { + console.log("--- query ---"); loadVaults(data); }, }); + useEffect( + () => { + if (!pricesUpdated) { + loadPrices(); + loadRatios(); + } else { + loadVaults(data); + } + }, + // eslint-disable-next-line + [signer, currentNetwork.chainId] + ); + const tokensSymbols = (): Array => { const symbols = [{ key: "all", name: "All" }]; if (isInLayer1(currentNetwork.chainId)) { @@ -305,6 +454,7 @@ export const Monitoring = () => { }; const handleRadioBtnChange = (value: string) => { + setSkipQuery(false); setRadioValue(value); if (value === "1") { setOwner(""); @@ -314,52 +464,24 @@ export const Monitoring = () => { }; const handleStatusChange = (newStatus: string) => { + setSkipQuery(false); setCurrentStatus(newStatus); }; const handleTokenChange = (newToken: string) => { + setSkipQuery(false); setTokenSymbol(newToken); }; - const VaultPages = () => { - const midPage = Math.floor(pagination.pages / 2); - return ( - <> - {1} - - {midPage - 2} - {midPage - 1} - midPage - {midPage + 1} - {midPage + 2} - - - {pagination.pages} - - - ); - }; - - const VaultPagination = () => { - const pag = Array.from(Array(10).keys()); - const activePag = pagination.current; - return ( - - - - {pagination.pages >= 10 ? ( - - ) : ( - pag.map((item) => ( - - {item + 1} - - )) - )} - - - - ); + const onPageSelected = (pageNumber: number) => { + const nextPage = pageNumber === pagination.pages ? 0 : pageNumber + 1; + const newPagination = { + ...pagination, + previous: pageNumber === 1 ? 0 : pageNumber - 1, + current: pageNumber, + next: nextPage, + }; + setPagination(newPagination); }; return ( @@ -372,22 +494,22 @@ export const Monitoring = () => {
Vaults
- 1,200 + {vaultsTotals.vaults}
Collateral (USD)
- $2,580,200.55 + ${numberFormatStr(vaultsTotals.collateralUSD, 2)}
Debt
- 5,210.55 + {numberFormatStr(vaultsTotals.debt, 4)}
Debt (USD)
- $988,180.81 + ${numberFormatStr(vaultsTotals.debtUSD, 2)} @@ -429,28 +551,36 @@ export const Monitoring = () => { -
- - {radios.map((radio, idx) => ( - handleRadioBtnChange(e.currentTarget.value)} - > - {radio.name} - - ))} - -
+ {currentAddress !== "" && ( +
+ + {radios.map((radio, idx) => ( + handleRadioBtnChange(e.currentTarget.value)} + > + {radio.name} + + ))} + +
+ )} - + {loading ? ( + + ) : ( + + )} - {pagination.pages > 0 && } + {pagination.pages > 0 && !loading && ( + + )} diff --git a/src/components/Vault/Monitoring/types.tsx b/src/components/Vault/Monitoring/types.tsx index bf6c1d6..2629261 100644 --- a/src/components/Vault/Monitoring/types.tsx +++ b/src/components/Vault/Monitoring/types.tsx @@ -1,13 +1,3 @@ -import React from "react"; -import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; -import { ReactComponent as DAIIcon } from "../../../assets/images/graph/DAI.svg"; -import { ReactComponent as AAVEIcon } from "../../../assets/images/graph/aave.svg"; -import { ReactComponent as LINKIcon } from "../../../assets/images/graph/chainlink.svg"; -import { ReactComponent as UNIIcon } from "../../../assets/images/graph/uni.svg"; -import { ReactComponent as SNXIcon } from "../../../assets/images/graph/snx.svg"; -import { ReactComponent as MATICIcon } from "../../../assets/images/graph/polygon.svg"; -import { ReactComponent as WBTCIcon } from "../../../assets/images/graph/wbtc.svg"; - export type PaginationType = { previous: number; current: number; @@ -30,6 +20,18 @@ export type OraclePricesType = { wbtcOraclePrice: string; }; +export type VaultsRatioType = { + ethRatio: number; + wethRatio: number; + daiRatio: number; + aaveRatio: number; + linkRatio: number; + uniRatio: number; + snxRatio: number; + maticRatio: number; + wbtcRatio: number; +}; + export type VaultsType = { id: string; collateralSymbol: string; @@ -40,40 +42,18 @@ export type VaultsType = { ratio: number; minRatio: string; status: string; + blockTS: string; }; -export type DropdownItemType = { - key: string; - name: string; +export type VaultsTotalsType = { + vaults: number; + collateral: string; + collateralUSD: string; + debt: string; + debtUSD: string; }; -type iconProps = { +export type DropdownItemType = { + key: string; name: string; }; - -export const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); - -export const CollateralIcon = ({ name }: iconProps) => { - switch (name) { - case "eth": - return ; - case "weth": - return ; - case "dai": - return ; - case "aave": - return ; - case "link": - return ; - case "uni": - return ; - case "snx": - return ; - case "matic": - return ; - case "wbtc": - return ; - default: - return <>; - } -}; diff --git a/src/components/Vault/Monitoring/vaults.tsx b/src/components/Vault/Monitoring/vaults.tsx index 37db21a..170a3b1 100644 --- a/src/components/Vault/Monitoring/vaults.tsx +++ b/src/components/Vault/Monitoring/vaults.tsx @@ -1,14 +1,18 @@ import React from "react"; import Table from "react-bootstrap/Table"; +import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; +import Tooltip from "react-bootstrap/esm/Tooltip"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; -import { capitalize, CollateralIcon, VaultsType } from "./types"; +import { PaginationType, VaultsType } from "./types"; +import { capitalize, CollateralIcon, numberFormatStr } from "./common"; type dataType = { vaults: Array; + pagination: PaginationType; }; -export const Vaults = ({ vaults }: dataType) => { - console.log("a"); +export const Vaults = ({ vaults, pagination }: dataType) => { + console.log("vaults ---"); return (
- {v.collateral_value} - + {v.collateralValue} +
- ${v.collateral_usd} + ${v.collateralUsd}
@@ -75,14 +53,14 @@ export const Vaults = ({ vaults }: dataType) => {
- ${v.debt_usd} + ${v.debtUsd}
{v.ratio} - {v.ratio === "N/A" ? "" : "%"} + {v.ratio === 0 ? "" : "%"}
@@ -27,9 +31,9 @@ export const Vaults = ({ vaults }: dataType) => { {vaults.map((v, index) => { - console.log("enter"); + const itemPage = Math.ceil((index + 1) / pagination.itemsPerPage); return ( - + - -
Vaults
- {vaultsTotals.vaults} - - -
Collateral (USD)
- ${numberFormatStr(vaultsTotals.collateralUSD, 2)} - - -
-
Debt
- -
- {numberFormatStr(vaultsTotals.debt, 4)} - - -
Debt (USD)
- ${numberFormatStr(vaultsTotals.debtUSD, 2)} - - - - - - - -
-
Collateral:
- handleTokenChange(eventKey || "ALL")}> - -
- {tokenSymbol.toUpperCase()} -
-
- - {tokensSymbols().map((item) => ( - - {item.name} - - ))} - -
-
-
-
Status:
- handleStatusChange(eventKey || "ALL")}> - -
- {capitalize(currentStatus)} + + + + +
Totals
+
+ +
+ +
Vaults
+ {vaultsTotals.vaults} + + +
Collateral (USD)
+ ${numberFormatStr(vaultsTotals.collateralUSD, 2)} + + +
+
Debt
+
- - - {statusList.map((item) => ( - - {item.name} - - ))} - - - - {currentAddress !== "" && ( -
- - {radios.map((radio, idx) => ( - {numberFormatStr(vaultsTotals.debt, 4)} + +
+
Debt (USD)
+ ${numberFormatStr(vaultsTotals.debtUSD, 2)} + + + + + + + +
+
Collateral:
+ handleTokenChange(eventKey || "ALL")}> + handleRadioBtnChange(e.currentTarget.value)} + id="dropdown-filters" + className="text-left" > - {radio.name} - - ))} - -
- )} - - {loading ? ( - - ) : ( - - )} - - {pagination.pages > 0 && !loading && ( - - )} - - - +
+ + {tokenSymbol.toUpperCase()} +
+ + + {tokensSymbols().map((item) => ( + + {item.name} + + ))} + + + +
+
Status:
+ handleStatusChange(eventKey || "ALL")}> + +
+ {capitalize(currentStatus)} +
+
+ + {statusList.map((item) => ( + + {item.name} + + ))} + +
+
+ {currentAddress !== "" && ( +
+ + {radios.map((radio, idx) => ( + handleRadioBtnChange(e.currentTarget.value)} + > + {radio.name} + + ))} + +
+ )} + + {loading || !pricesUpdated ? ( + + ) : ( + + )} +
+ {pagination.pages > 0 && !loading && ( + + )} + + + + + ); }; diff --git a/src/components/Vault/Monitoring/vaults.tsx b/src/components/Vault/Monitoring/vaults.tsx index 170a3b1..c48f1c4 100644 --- a/src/components/Vault/Monitoring/vaults.tsx +++ b/src/components/Vault/Monitoring/vaults.tsx @@ -1,90 +1,121 @@ -import React from "react"; +import React, { useState } from "react"; +import Button from "react-bootstrap/esm/Button"; import Table from "react-bootstrap/Table"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; +import Liquidate from "./Liquidate"; import { PaginationType, VaultsType } from "./types"; import { capitalize, CollateralIcon, numberFormatStr } from "./common"; type dataType = { + currentAddress: string; vaults: Array; pagination: PaginationType; }; -export const Vaults = ({ vaults, pagination }: dataType) => { - console.log("vaults ---"); +export const Vaults = ({ currentAddress, vaults, pagination }: dataType) => { + const [showLiquidate, setShowLiquidate] = useState(false); + const [vaultId, setVaultId] = useState(""); + const [vaultType, setVaultType] = useState(""); + + const liquidateVault = (id: string, type: string) => { + setVaultId(id); + setVaultType(type); + setShowLiquidate(true); + }; + return ( -
{capitalize(v.status)} @@ -37,29 +41,42 @@ export const Vaults = ({ vaults }: dataType) => {
- {v.collateralValue} - + + {v.collateralValue} + + } + > + <> + {numberFormatStr(v.collateralValue, 4)} + + +
- ${v.collateralUsd} + ${numberFormatStr(v.collateralUsd, 2)}
- {v.debt} + {numberFormatStr(v.debt, 4)}
- ${v.debtUsd} + ${numberFormatStr(v.debtUsd, 2)}
- {v.ratio} + {v.ratio.toFixed(0)} {v.ratio === 0 ? "" : "%"}
diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index a230347..f734e99 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -133,6 +133,9 @@ div { display: flex; } + tr.hide { + display: none; + } td { border-top: 0.5px solid #a440f2; } diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index a2aa657..ca714ac 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -5,6 +5,7 @@ import { toast } from "react-toastify"; import toasty from "../assets/images/toasty.png"; import { FEATURES, NETWORKS } from "./constants"; import { OraclesContext } from "../state/OraclesContext"; +import { VaultsContext } from "../state/VaultsContext"; export const makeShortAddress = (address: string) => { const shortAddress = `${address.substr(0, 6).toString()}...${address @@ -325,7 +326,7 @@ export const validOracles = (chainId: number, oracles: OraclesContext): boolean !isUndefined(oracles.tcapOracleRead); if (isInLayer1(chainId)) { - valid = valid && !isUndefined(oracles.aaveOracle) && !isUndefined(oracles.linkOracle); + valid = valid && !isUndefined(oracles.aaveOracleRead) && !isUndefined(oracles.linkOracleRead); } if (isOptimism(chainId)) { valid = @@ -340,3 +341,23 @@ export const validOracles = (chainId: number, oracles: OraclesContext): boolean } return valid; }; + +export const validVaults = (chainId: number, vaults: VaultsContext): boolean => { + let valid = !isUndefined(vaults.wethVaultRead) && !isUndefined(vaults.daiVaultRead); + + if (isInLayer1(chainId)) { + valid = valid && !isUndefined(vaults.aaveVaultRead) && !isUndefined(vaults.linkVaultRead); + } + if (isOptimism(chainId)) { + valid = + valid && + !isUndefined(vaults.linkVaultRead) && + !isUndefined(vaults.snxVaultRead) && + !isUndefined(vaults.uniVaultRead); + } + + if (chainId === NETWORKS.polygon.chainId) { + valid = valid && !isUndefined(vaults.maticVaultRead) && !isUndefined(vaults.wbtcVaultRead); + } + return valid; +}; From 7d8788907fd6df695f94201a65fad64aa6c0b39a Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sun, 6 Mar 2022 22:13:13 -0600 Subject: [PATCH 043/278] finish monitoring tool --- src/components/Sidebar.tsx | 1 - src/components/Vault/Monitoring/Liquidate.tsx | 165 +++++++++++++ .../Vault/Monitoring/Pagination.tsx | 88 +++++++ src/components/Vault/Monitoring/common.tsx | 49 ++++ src/components/Vault/Monitoring/index.tsx | 223 +++++++++--------- src/components/Vault/Monitoring/vaults.tsx | 181 ++++++++------ src/styles/app.scss | 5 + src/styles/vault-monitoring.scss | 15 +- 8 files changed, 544 insertions(+), 183 deletions(-) create mode 100644 src/components/Vault/Monitoring/Liquidate.tsx create mode 100644 src/components/Vault/Monitoring/Pagination.tsx create mode 100644 src/components/Vault/Monitoring/common.tsx diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index ebfb865..9734dad 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -114,7 +114,6 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { { setActive("/vault-monitoring"); }} diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx new file mode 100644 index 0000000..1a327ca --- /dev/null +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -0,0 +1,165 @@ +import React, { useContext, useEffect, useState } from "react"; +import { Button, Form } from "react-bootstrap"; +import { ethers, BigNumber } from "ethers"; +import Modal from "react-bootstrap/esm/Modal"; +import "../../../styles/modal.scss"; +import SignerContext from "../../../state/SignerContext"; +import VaultContext from "../../../state/VaultsContext"; +import { errorNotification, notifyUser } from "../../../utils/utils"; + +type props = { + show: boolean; + currentAddress: string; + vaultId: string; + vaultType: string; + onHide: () => void; +}; + +const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide }: props) => { + const signer = useContext(SignerContext); + const vaults = useContext(VaultContext); + const [currentVault, setCurrentVault] = useState(); + const [requiredTcap, setRequiredTcap] = useState("0"); + const [maxTcap, setMaxTcap] = useState("0"); + const [canLiquidate, setCanLiquidate] = useState(true); + + useEffect(() => { + async function load() { + if (currentAddress !== "" && vaults) { + let cVault = vaults.wethVault; + let cVaultRead = vaults.wethVaultRead; + switch (vaultType) { + case "DAI": + cVault = vaults.daiVault; + cVaultRead = vaults.daiVaultRead; + break; + case "AAVE": + cVault = vaults.aaveVault; + cVaultRead = vaults.aaveVaultRead; + break; + case "LINK": + cVault = vaults.linkVault; + cVaultRead = vaults.linkVaultRead; + break; + case "SNX": + cVault = vaults.snxVault; + cVaultRead = vaults.snxVaultRead; + break; + case "UNI": + cVault = vaults.uniVault; + cVaultRead = vaults.uniVaultRead; + break; + case "MATIC": + cVault = vaults.maticVault; + cVaultRead = vaults.maticVaultRead; + break; + case "WBTC": + cVault = vaults.wbtcVault; + cVaultRead = vaults.wbtcVaultRead; + break; + default: + cVault = vaults.wethVault; + cVaultRead = vaults.wethVaultRead; + break; + } + if (vaultId !== "" && cVault && cVaultRead) { + setCurrentVault(cVault); + const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); + // @ts-ignore + const [reqTcap] = await signer.ethcallProvider?.all([reqTcapCall]); + const reqTcapText = ethers.utils.formatEther(reqTcap); + setRequiredTcap(reqTcapText); + } + } + } + load(); + // eslint-disable-next-line + }, [currentAddress, vaultId]); + + const onChangeMaxTcap = (event: React.ChangeEvent) => { + setMaxTcap(event.target.value); + }; + + const minTcap = async (e: React.MouseEvent) => { + e.preventDefault(); + setMaxTcap(requiredTcap); + }; + + const liquidate = async (event: React.MouseEvent) => { + event.preventDefault(); + if (currentAddress && canLiquidate && currentVault) { + setCanLiquidate(false); + if (maxTcap && parseFloat(maxTcap) > 0) { + if (parseFloat(maxTcap) >= parseFloat(requiredTcap)) { + try { + const tx = await currentVault.liquidateVault( + BigNumber.from(vaultId), + ethers.utils.parseEther(maxTcap) + ); + notifyUser(tx); + setMaxTcap(""); + onHide(); + } catch (error) { + errorNotification("Not enough CTX balance."); + } + } else { + errorNotification("Tcap amount is less than required"); + } + } else { + errorNotification("Field can't be empty"); + } + setCanLiquidate(true); + } + }; + + return ( + { + setMaxTcap(""); + onHide(); + }} + > + + Liquidate Vault + + +
+ + + <> + Amount of TCAP + + + MIN + + + + + + + + + + + + ); +}; + +export default Liquidate; diff --git a/src/components/Vault/Monitoring/Pagination.tsx b/src/components/Vault/Monitoring/Pagination.tsx new file mode 100644 index 0000000..0afebe3 --- /dev/null +++ b/src/components/Vault/Monitoring/Pagination.tsx @@ -0,0 +1,88 @@ +import React from "react"; +import Pagination from "react-bootstrap/Pagination"; +import { PaginationType } from "./types"; + +type props = { + pagination: PaginationType; + onPageSelected: (pageNumber: number) => void; +}; + +export const VaultPagination = ({ pagination, onPageSelected }: props) => { + const pag = Array.from(Array(pagination.pages).keys()); + const activePag = pagination.current; + + const VaultPages = () => { + const midPages = Array.from(Array(5).keys()); + const midPage = Math.floor(pagination.pages / 2); + midPages[0] = midPage - 2; + midPages[1] = midPage - 1; + midPages[2] = midPage; + midPages[3] = midPage + 1; + midPages[4] = midPage + 2; + + return ( + <> + {1} + {pagination.current >= 3 && pagination.current < midPages[0] && } + {pagination.current > 1 && pagination.current < midPages[0] && ( + {pagination.current} + )} + + {midPages.map((item) => ( + onPageSelected(item)} + > + {item} + + ))} + + {pagination.current < pagination.pages && pagination.current > midPages[4] && ( + {pagination.current} + )} + {pagination.current < pagination.pages - 1 && pagination.current > midPages[4] && ( + + )} + + {pagination.pages} + + + ); + }; + + return ( + + {pagination.pages >= 10 && ( + onPageSelected(1)} disabled={pagination.previous === 0} /> + )} + onPageSelected(pagination.previous)} + disabled={pagination.previous === 0} + /> + {pagination.pages >= 10 ? ( + + ) : ( + pag.map((item) => ( + onPageSelected(item + 1)} + > + {item + 1} + + )) + )} + onPageSelected(pagination.next)} + disabled={pagination.current === pagination.pages} + /> + {pagination.pages >= 10 && ( + onPageSelected(pagination.pages)} + disabled={pagination.next === 0} + /> + )} + + ); +}; diff --git a/src/components/Vault/Monitoring/common.tsx b/src/components/Vault/Monitoring/common.tsx new file mode 100644 index 0000000..5d56cc1 --- /dev/null +++ b/src/components/Vault/Monitoring/common.tsx @@ -0,0 +1,49 @@ +import React from "react"; +import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; +import { ReactComponent as DAIIcon } from "../../../assets/images/graph/DAI.svg"; +import { ReactComponent as AAVEIcon } from "../../../assets/images/graph/aave.svg"; +import { ReactComponent as LINKIcon } from "../../../assets/images/graph/chainlink.svg"; +import { ReactComponent as UNIIcon } from "../../../assets/images/graph/uni.svg"; +import { ReactComponent as SNXIcon } from "../../../assets/images/graph/snx.svg"; +import { ReactComponent as MATICIcon } from "../../../assets/images/graph/polygon.svg"; +import { ReactComponent as WBTCIcon } from "../../../assets/images/graph/wbtc.svg"; + +type iconProps = { + name: string; +}; + +export const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); + +export const CollateralIcon = ({ name }: iconProps) => { + switch (name) { + case "eth": + return ; + case "weth": + return ; + case "dai": + return ; + case "aave": + return ; + case "link": + return ; + case "uni": + return ; + case "snx": + return ; + case "matic": + return ; + case "wbtc": + return ; + default: + return <>; + } +}; + +export const numberFormat = new Intl.NumberFormat(); + +export const numberFormatStr = (value: string, decimals: number | undefined) => { + if (decimals) { + return numberFormat.format(parseFloat(parseFloat(value).toFixed(decimals))); + } + return numberFormat.format(parseFloat(value)); +}; diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 1426887..5dc7f6c 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -4,7 +4,9 @@ import ButtonGroup from "react-bootstrap/esm/ButtonGroup"; import Card from "react-bootstrap/esm/Card"; import Col from "react-bootstrap/Col"; import Dropdown from "react-bootstrap/Dropdown"; +import Row from "react-bootstrap/esm/Row"; import ToggleButton from "react-bootstrap/esm/ToggleButton"; +import Spinner from "react-bootstrap/Spinner"; import "../../../styles/vault-monitoring.scss"; import { useQuery, gql } from "@apollo/client"; import NetworkContext from "../../../state/NetworkContext"; @@ -16,13 +18,13 @@ import { getRatio2, isInLayer1, isOptimism, + isUndefined, toUSD, validOracles, validVaults, } from "../../../utils/utils"; import { Vaults } from "./Vaults"; import { VaultPagination } from "./Pagination"; -import Loading from "../../Loading"; import { DropdownItemType, OraclePricesType, @@ -362,7 +364,7 @@ export const Monitoring = () => { if (addVault) { vData.push({ - id: v.id, + id: v.vaultId, collateralSymbol: v.tokenSymbol, collateralValue: collateral, collateralUsd: collateralUSD.toFixed(2), @@ -385,8 +387,6 @@ export const Monitoring = () => { setVaultsTotals(totals); // Set pagination ddata if (vData.length > 0) { - console.log("--- Len -----"); - console.log(vData.length); const lastVaultId = vData[vData.length - 1].blockTS; const itemsCount = vData.length; const pages = Math.ceil(itemsCount / pagination.itemsPerPage); @@ -413,8 +413,9 @@ export const Monitoring = () => { console.log(error); }, onCompleted: () => { - console.log("--- query ---"); - loadVaults(data); + if (pricesUpdated) { + loadVaults(data); + } }, }); @@ -423,19 +424,18 @@ export const Monitoring = () => { if (!pricesUpdated) { loadPrices(); loadRatios(); - } else { + } else if (!isUndefined(data)) { loadVaults(data); } }, // eslint-disable-next-line - [signer, currentNetwork.chainId] + [signer, currentNetwork.chainId, pricesUpdated] ); const tokensSymbols = (): Array => { const symbols = [{ key: "all", name: "All" }]; if (isInLayer1(currentNetwork.chainId)) { - symbols.push({ key: "eth", name: "ETH" }); - symbols.push({ key: "weth", name: "WETH" }); + symbols.push({ key: "weth", name: "ETH" }); symbols.push({ key: "dai", name: "DAI" }); symbols.push({ key: "aave", name: "AAVE" }); symbols.push({ key: "link", name: "LINK" }); @@ -486,104 +486,117 @@ export const Monitoring = () => { return (
- - -
Totals
-
- -
- - - - - - - - - - - - {vaults.map((v, index) => { - const itemPage = Math.ceil((index + 1) / pagination.itemsPerPage); - return ( - - - - - - - - - ); - })} - -
StatusCollateralCollateral (USD) -
- Debt -
-
Debt (USD)Ratio
-
- {capitalize(v.status)} -
-
-
- - {v.collateralValue} - - } - > - <> - {numberFormatStr(v.collateralValue, 4)} - - - -
-
-
- ${numberFormatStr(v.collateralUsd, 2)} -
-
-
- {numberFormatStr(v.debt, 4)} -
-
-
- ${numberFormatStr(v.debtUsd, 2)} -
-
-
- - {v.ratio.toFixed(0)} - {v.ratio === 0 ? "" : "%"} - -
-
+ <> + + + + + + + + + + + + + {vaults.map((v, index) => { + const itemPage = Math.ceil((index + 1) / pagination.itemsPerPage); + return ( + + + + + + + + + ); + })} + +
StatusCollateralCollateral (USD) +
+ Debt +
+
Debt (USD)Ratio
+
+ {v.status === "liquidation" ? ( + + ) : ( + {capitalize(v.status)} + )} +
+
+
+ + {v.collateralValue} + + } + > + <> + {numberFormatStr(v.collateralValue, 4)} + + + +
+
+
+ ${numberFormatStr(v.collateralUsd, 2)} +
+
+
+ {numberFormatStr(v.debt, 4)} +
+
+
+ ${numberFormatStr(v.debtUsd, 2)} +
+
+
+ + {v.ratio.toFixed(0)} + {v.ratio === 0 ? "" : "%"} + +
+
+ { + setVaultId(""); + setVaultType(""); + setShowLiquidate(false); + }} + /> + ); }; diff --git a/src/styles/app.scss b/src/styles/app.scss index 04390e3..503168e 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -311,6 +311,11 @@ form { } } +.spinner { + margin: 5rem 50%; + color: $highlight !important; +} + #WEB3_CONNECT_MODAL_ID { .web3modal-provider-container { transition: background-color 0s ease-in-out 0s; diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index f734e99..4f38377 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -4,6 +4,9 @@ .vault-monitoring { padding: 1rem 3rem; + .row { + display: block; + } .card { padding: 1.5rem 2.8125rem; @@ -95,7 +98,6 @@ display: none; } } - .vaults { margin-top: 1.8rem !important; margin-bottom: 0.2rem; @@ -167,6 +169,10 @@ -webkit-animation: fire 2s infinite alternate; animation: fire 2s infinite alternate; color: #fff !important; + button { + background: transparent; + border: 0.8px solid #f28040; + } } .empty { text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; @@ -185,7 +191,6 @@ } } } - .pag-container{ display: flex; justify-content: center; @@ -243,4 +248,10 @@ .card-body { padding: 1.25rem 0rem; } + + @media (max-width: 600px) { + .row { + display: flex; + } + } } \ No newline at end of file From f4584e620d2033012bd1d7bd4acd8d5008398d45 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sun, 6 Mar 2022 22:18:01 -0600 Subject: [PATCH 044/278] change graph endpoint --- src/utils/constants.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 062d798..1fbd184 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -72,7 +72,7 @@ export const API_ENDPOINT = "https://api.cryptex.finance"; export const GRAPHQL_ENDPOINT = { mainnet: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo-2", - rinkeby: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo-2", + rinkeby: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-rinkeby-two", optimism: "https://api.thegraph.com/subgraphs/name/cryptexfinance/cryptex-optimism", okovan: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo", polygon: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-polygon", From 549b82460275bd2b0a5775ff1e6ee9e9865984b6 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sun, 6 Mar 2022 22:48:44 -0600 Subject: [PATCH 045/278] filter decimals --- src/components/Vault/Monitoring/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 5dc7f6c..519d89a 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -349,9 +349,9 @@ export const Monitoring = () => { oraclePrices?.tcapOraclePrice || "1" ); let status = "liquidation"; - if (collateralUSD === 0) { + if (parseFloat(collateral) < 0.0000001) { status = "empty"; - } else if (collateralUSD > 0 && debtUSD === 0) { + } else if (parseFloat(collateral) >= 0.0000001 && parseFloat(debt) < 0.0000001) { status = "ready"; } else if (ratio >= minRatio) { status = "active"; From 35c53841a1f9420315ed81a765e14f4cf7863b71 Mon Sep 17 00:00:00 2001 From: Jorge Destephen Lavaire Date: Sun, 6 Mar 2022 22:55:43 -0600 Subject: [PATCH 046/278] Update Liquidate.tsx --- src/components/Vault/Monitoring/Liquidate.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index 1a327ca..60def3e 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -100,7 +100,7 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide }: props) setMaxTcap(""); onHide(); } catch (error) { - errorNotification("Not enough CTX balance."); + errorNotification("Burn fee less than required."); } } else { errorNotification("Tcap amount is less than required"); From 4516f0c1bcde98a4a5500046aa56dec6ac63f8a9 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sun, 6 Mar 2022 23:53:33 -0600 Subject: [PATCH 047/278] fix liquidating vault --- src/components/Vault/Monitoring/Liquidate.tsx | 35 ++++++++++++++++--- src/components/Vault/Monitoring/index.tsx | 11 +++++- src/components/Vault/Monitoring/vaults.tsx | 4 ++- src/styles/modal.scss | 4 +++ 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index 1a327ca..6f61b21 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -2,10 +2,13 @@ import React, { useContext, useEffect, useState } from "react"; import { Button, Form } from "react-bootstrap"; import { ethers, BigNumber } from "ethers"; import Modal from "react-bootstrap/esm/Modal"; +import NumberFormat from "react-number-format"; import "../../../styles/modal.scss"; +import NetworkContext from "../../../state/NetworkContext"; import SignerContext from "../../../state/SignerContext"; import VaultContext from "../../../state/VaultsContext"; import { errorNotification, notifyUser } from "../../../utils/utils"; +import { NETWORKS } from "../../../utils/constants"; type props = { show: boolean; @@ -13,14 +16,17 @@ type props = { vaultId: string; vaultType: string; onHide: () => void; + refresh: () => void; }; -const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide }: props) => { +const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh }: props) => { + const currentNetwork = useContext(NetworkContext); const signer = useContext(SignerContext); const vaults = useContext(VaultContext); const [currentVault, setCurrentVault] = useState(); const [requiredTcap, setRequiredTcap] = useState("0"); const [maxTcap, setMaxTcap] = useState("0"); + const [liquidationFee, setLiquidationFee] = useState("0"); const [canLiquidate, setCanLiquidate] = useState(true); useEffect(() => { @@ -68,7 +74,12 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide }: props) // @ts-ignore const [reqTcap] = await signer.ethcallProvider?.all([reqTcapCall]); const reqTcapText = ethers.utils.formatEther(reqTcap); + + const currentLiqFee = await cVault?.getFee(reqTcap); + const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); setRequiredTcap(reqTcapText); + setLiquidationFee(ethFee.toString()); } } } @@ -92,15 +103,20 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide }: props) if (maxTcap && parseFloat(maxTcap) > 0) { if (parseFloat(maxTcap) >= parseFloat(requiredTcap)) { try { + const currentLiqFee = await currentVault?.getFee(ethers.utils.parseEther(requiredTcap)); + const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setLiquidationFee(ethFee); const tx = await currentVault.liquidateVault( BigNumber.from(vaultId), - ethers.utils.parseEther(maxTcap) + ethers.utils.parseEther(maxTcap), + { value: increasedFee } ); - notifyUser(tx); + notifyUser(tx, refresh); setMaxTcap(""); onHide(); } catch (error) { - errorNotification("Not enough CTX balance."); + errorNotification("Burn fee less than required."); } } else { errorNotification("Tcap amount is less than required"); @@ -144,6 +160,17 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide }: props) value={maxTcap} onChange={onChangeMaxTcap} /> + + Liquidation Fee:{" "} + {" "} + {currentNetwork.chainId === NETWORKS.polygon.chainId ? "MATIC" : "ETH"} + diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 519d89a..58e45d4 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -405,7 +405,7 @@ export const Monitoring = () => { } }; - const { loading, data, error } = useQuery(vaultsQuery, { + const { loading, data, refetch, error } = useQuery(vaultsQuery, { fetchPolicy: "no-cache", notifyOnNetworkStatusChange: true, skip: skipQuery, @@ -484,6 +484,14 @@ export const Monitoring = () => { setPagination(newPagination); }; + const refresh = async () => { + try { + await refetch(); + } catch (error) { + // catch error in case the vault screen is changed + } + }; + return (
@@ -586,6 +594,7 @@ export const Monitoring = () => { currentAddress={currentAddress} vaults={vaultList} pagination={pagination} + refresh={() => refresh()} /> )} diff --git a/src/components/Vault/Monitoring/vaults.tsx b/src/components/Vault/Monitoring/vaults.tsx index c48f1c4..91dbac7 100644 --- a/src/components/Vault/Monitoring/vaults.tsx +++ b/src/components/Vault/Monitoring/vaults.tsx @@ -12,9 +12,10 @@ type dataType = { currentAddress: string; vaults: Array; pagination: PaginationType; + refresh: () => void; }; -export const Vaults = ({ currentAddress, vaults, pagination }: dataType) => { +export const Vaults = ({ currentAddress, vaults, pagination, refresh }: dataType) => { const [showLiquidate, setShowLiquidate] = useState(false); const [vaultId, setVaultId] = useState(""); const [vaultType, setVaultType] = useState(""); @@ -115,6 +116,7 @@ export const Vaults = ({ currentAddress, vaults, pagination }: dataType) => { setVaultType(""); setShowLiquidate(false); }} + refresh={() => refresh()} /> ); diff --git a/src/styles/modal.scss b/src/styles/modal.scss index fda39d9..03ea6a2 100644 --- a/src/styles/modal.scss +++ b/src/styles/modal.scss @@ -99,6 +99,10 @@ text-align: left; font-size: 0.8rem; } + .text-muted.liquidation-fee { + color: #9ca5ad !important; + font-size: 0.9rem; + } input[type="text"].neon-green { border-color: $green !important; From 4dbbf79e83ca6590e0eb8e43c37bcb0726542d69 Mon Sep 17 00:00:00 2001 From: Jorge Destephen Lavaire Date: Mon, 7 Mar 2022 00:00:08 -0600 Subject: [PATCH 048/278] Rename vaults.tsx to Vaults.tsx --- src/components/Vault/Monitoring/{vaults.tsx => Vaults.tsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/components/Vault/Monitoring/{vaults.tsx => Vaults.tsx} (100%) diff --git a/src/components/Vault/Monitoring/vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx similarity index 100% rename from src/components/Vault/Monitoring/vaults.tsx rename to src/components/Vault/Monitoring/Vaults.tsx From 805a56210fc2e972924f4598c622877ddffd1481 Mon Sep 17 00:00:00 2001 From: Jorge Destephen Lavaire Date: Mon, 7 Mar 2022 14:10:30 -0600 Subject: [PATCH 049/278] Rename WBTC.svg to wbtc.svg --- src/assets/images/graph/{WBTC.svg => wbtc.svg} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/assets/images/graph/{WBTC.svg => wbtc.svg} (100%) diff --git a/src/assets/images/graph/WBTC.svg b/src/assets/images/graph/wbtc.svg similarity index 100% rename from src/assets/images/graph/WBTC.svg rename to src/assets/images/graph/wbtc.svg From 98baa5cd6da9cff18420b81812d981bd981dd524 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 7 Mar 2022 19:41:59 -0600 Subject: [PATCH 050/278] fixed mobile design --- .../images/welcome/vault-monitoring.svg | 3 + src/components/Sidebar.tsx | 6 +- src/components/Vault/Monitoring/Liquidate.tsx | 46 ++-- .../Vault/Monitoring/Pagination.tsx | 5 +- src/components/Vault/Monitoring/common.tsx | 16 +- src/components/Vault/Monitoring/index.tsx | 206 +++++++++++------- src/components/Vault/Monitoring/vaults.tsx | 70 +++--- src/styles/app.scss | 6 + src/styles/modal.scss | 8 +- src/styles/vault-monitoring.scss | 62 ++++-- src/utils/utils.tsx | 2 +- 11 files changed, 286 insertions(+), 144 deletions(-) create mode 100644 src/assets/images/welcome/vault-monitoring.svg diff --git a/src/assets/images/welcome/vault-monitoring.svg b/src/assets/images/welcome/vault-monitoring.svg new file mode 100644 index 0000000..7c0a871 --- /dev/null +++ b/src/assets/images/welcome/vault-monitoring.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 9734dad..a88656e 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -9,6 +9,7 @@ import { ReactComponent as Logo } from "../assets/images/favicon.svg"; import { ReactComponent as MenuLogo } from "../assets/images/menu.svg"; import { ReactComponent as DashboardIcon } from "../assets/images/welcome/dashboard.svg"; import { ReactComponent as VaultIcon } from "../assets/images/welcome/vault.svg"; +import { ReactComponent as VaultMonitoringIcon } from "../assets/images/welcome/vault-monitoring.svg"; import { ReactComponent as PoolsIcon } from "../assets/images/welcome/pool.svg"; import { ReactComponent as LogoutIcon } from "../assets/images/welcome/logout.svg"; import { ReactComponent as GraphIcon } from "../assets/images/welcome/graph.svg"; @@ -114,11 +115,12 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { { - setActive("/vault-monitoring"); + setActive("vault-monitoring"); }} > - + {isInLayer1(currentNetwork.chainId) && ( diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index 6f61b21..b539dec 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -26,6 +26,7 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } const [currentVault, setCurrentVault] = useState(); const [requiredTcap, setRequiredTcap] = useState("0"); const [maxTcap, setMaxTcap] = useState("0"); + const [reward, setReward] = useState("0"); const [liquidationFee, setLiquidationFee] = useState("0"); const [canLiquidate, setCanLiquidate] = useState(true); @@ -71,14 +72,20 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } if (vaultId !== "" && cVault && cVaultRead) { setCurrentVault(cVault); const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); + const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); // @ts-ignore - const [reqTcap] = await signer.ethcallProvider?.all([reqTcapCall]); + const [reqTcap, liqReward] = await signer.ethcallProvider?.all([ + reqTcapCall, + liqRewardCall, + ]); const reqTcapText = ethers.utils.formatEther(reqTcap); + const liqRewardText = ethers.utils.formatEther(liqReward); const currentLiqFee = await cVault?.getFee(reqTcap); const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); setRequiredTcap(reqTcapText); + setReward(liqRewardText); setLiquidationFee(ethFee.toString()); } } @@ -150,7 +157,7 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } Amount of TCAP - MIN + MIN REQUIRED - - Liquidation Fee:{" "} - {" "} - {currentNetwork.chainId === NETWORKS.polygon.chainId ? "MATIC" : "ETH"} - +
+ + Reward:{" "} + {" "} + {vaultType === "WETH" ? "ETH" : vaultType} + + + Burn Fee:{" "} + {" "} + {currentNetwork.chainId === NETWORKS.polygon.chainId ? "MATIC" : "ETH"} + +
diff --git a/src/components/Vault/Monitoring/Pagination.tsx b/src/components/Vault/Monitoring/Pagination.tsx index 0afebe3..29a8e72 100644 --- a/src/components/Vault/Monitoring/Pagination.tsx +++ b/src/components/Vault/Monitoring/Pagination.tsx @@ -44,7 +44,10 @@ export const VaultPagination = ({ pagination, onPageSelected }: props) => { {pagination.current < pagination.pages - 1 && pagination.current > midPages[4] && ( )} - + onPageSelected(pagination.pages)} + > {pagination.pages} diff --git a/src/components/Vault/Monitoring/common.tsx b/src/components/Vault/Monitoring/common.tsx index 5d56cc1..9b807fb 100644 --- a/src/components/Vault/Monitoring/common.tsx +++ b/src/components/Vault/Monitoring/common.tsx @@ -39,11 +39,17 @@ export const CollateralIcon = ({ name }: iconProps) => { } }; -export const numberFormat = new Intl.NumberFormat(); - -export const numberFormatStr = (value: string, decimals: number | undefined) => { - if (decimals) { - return numberFormat.format(parseFloat(parseFloat(value).toFixed(decimals))); +export const numberFormatStr = ( + value: string, + minDecimals: number | undefined, + maxDecimals: number | undefined +) => { + const numberFormat = new Intl.NumberFormat([], { + minimumFractionDigits: minDecimals, + maximumFractionDigits: maxDecimals, + }); + if (minDecimals) { + return numberFormat.format(parseFloat(parseFloat(value).toFixed(maxDecimals))); } return numberFormat.format(parseFloat(value)); }; diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 58e45d4..877ec77 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -75,6 +75,14 @@ export const Monitoring = () => { { name: "All Vaults", value: "1" }, { name: "My Vaults", value: "2" }, ]; + const viewsList = [ + { key: "5", name: "5" }, + { key: "10", name: "10" }, + { key: "15", name: "15" }, + { key: "20", name: "20" }, + { key: "25", name: "25" }, + { key: "30", name: "30" }, + ]; const statusList = [ { key: "all", name: "All" }, { key: "empty", name: "Empty" }, @@ -328,6 +336,26 @@ export const Monitoring = () => { return minRatio; }; + const confPagination = (vData: Array, itemsPerPage: number) => { + if (vData.length > 0) { + const lastVaultId = vData[vData.length - 1].blockTS; + const itemsCount = vData.length; + const pages = Math.ceil(itemsCount / itemsPerPage); + const pag = { + previous: 0, + current: 1, + next: 2, + pages, + itemsPerPage, + itemsCount, + lastId: lastVaultId, + }; + setPagination(pag); + } else { + setPagination(pagDefault); + } + }; + const loadVaults = async (vaultsData: any) => { const vData = new Array(); const totals = { ...totalsDefault }; @@ -371,7 +399,7 @@ export const Monitoring = () => { debt, debtUsd: debtUSD.toFixed(2), ratio, - minRatio: "", + minRatio: minRatio.toString(), status, blockTS: v.blockTS, }); @@ -385,24 +413,8 @@ export const Monitoring = () => { }); setVaultList(vData); setVaultsTotals(totals); - // Set pagination ddata - if (vData.length > 0) { - const lastVaultId = vData[vData.length - 1].blockTS; - const itemsCount = vData.length; - const pages = Math.ceil(itemsCount / pagination.itemsPerPage); - const pag = { - previous: 0, - current: 1, - next: 2, - pages, - itemsPerPage: pagination.itemsPerPage, - itemsCount, - lastId: lastVaultId, - }; - setPagination(pag); - } else { - setPagination(pagDefault); - } + // Set pagination data + confPagination(vData, pagination.itemsPerPage); }; const { loading, data, refetch, error } = useQuery(vaultsQuery, { @@ -453,6 +465,11 @@ export const Monitoring = () => { return symbols; }; + const handleItemsViewChange = (number: string) => { + setSkipQuery(true); + confPagination(vaultList, parseInt(number)); + }; + const handleRadioBtnChange = (value: string) => { setSkipQuery(false); setRadioValue(value); @@ -508,84 +525,115 @@ export const Monitoring = () => {
Collateral (USD)
- ${numberFormatStr(vaultsTotals.collateralUSD, 2)} + + ${numberFormatStr(vaultsTotals.collateralUSD, 2, 2)} +
Debt
- {numberFormatStr(vaultsTotals.debt, 4)} + {numberFormatStr(vaultsTotals.debt, 4, 4)}
Debt (USD)
- ${numberFormatStr(vaultsTotals.debtUSD, 2)} + ${numberFormatStr(vaultsTotals.debtUSD, 2, 2)} - -
-
Collateral:
- handleTokenChange(eventKey || "ALL")}> - -
- - {tokenSymbol.toUpperCase()} -
-
- - {tokensSymbols().map((item) => ( - - {item.name} - - ))} - -
-
-
-
Status:
- handleStatusChange(eventKey || "ALL")}> - -
- {capitalize(currentStatus)} -
-
- - {statusList.map((item) => ( - - {item.name} - - ))} - -
+ +
+
+
View:
+ handleItemsViewChange(eventKey || "15")}> + +
+ {pagination.itemsPerPage} +
+
+ + {viewsList.map((item) => ( + + {item.name} + + ))} + +
+
- {currentAddress !== "" && ( +
- - {radios.map((radio, idx) => ( - handleRadioBtnChange(e.currentTarget.value)} - > - {radio.name} - - ))} - +
Collateral:
+ handleTokenChange(eventKey || "ALL")}> + +
+ + {tokenSymbol.toUpperCase()} +
+
+ + {tokensSymbols().map((item) => ( + + {item.name} + + ))} + +
- )} +
+
Status:
+ handleStatusChange(eventKey || "ALL")}> + +
+ {capitalize(currentStatus)} +
+
+ + {statusList.map((item) => ( + + {item.name} + + ))} + +
+
+ {currentAddress !== "" && ( +
+ + {radios.map((radio, idx) => ( + handleRadioBtnChange(e.currentTarget.value)} + > + {radio.name} + + ))} + +
+ )} +
{loading || !pricesUpdated ? ( diff --git a/src/components/Vault/Monitoring/vaults.tsx b/src/components/Vault/Monitoring/vaults.tsx index 91dbac7..63eddc2 100644 --- a/src/components/Vault/Monitoring/vaults.tsx +++ b/src/components/Vault/Monitoring/vaults.tsx @@ -50,7 +50,7 @@ export const Vaults = ({ currentAddress, vaults, pagination, refresh }: dataType
- {v.status === "liquidation" ? ( + {v.status === "liquidation" && currentAddress !== "" ? ( @@ -60,45 +60,65 @@ export const Vaults = ({ currentAddress, vaults, pagination, refresh }: dataType
-
- - {v.collateralValue} - - } - > - <> - {numberFormatStr(v.collateralValue, 4)} - - - -
+ + {numberFormatStr(v.collateralValue, 4, 12)} + + } + > +
+ {numberFormatStr(v.collateralValue, 4, 4)} + +
+
- ${numberFormatStr(v.collateralUsd, 2)} + ${numberFormatStr(v.collateralUsd, 2, 2)}
- {numberFormatStr(v.debt, 4)} + + {numberFormatStr(v.debt, 4, 12)} + + } + > + {numberFormatStr(v.debt, 4, 4)} +
- ${numberFormatStr(v.debtUsd, 2)} + ${numberFormatStr(v.debtUsd, 2, 2)}
- - {v.ratio.toFixed(0)} - {v.ratio === 0 ? "" : "%"} - + + Min Ratio: {v.minRatio}% + + } + > + + {v.ratio.toFixed(0)} + {v.ratio === 0 ? "" : "%"} + +
diff --git a/src/styles/app.scss b/src/styles/app.scss index 503168e..97d6275 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -264,6 +264,12 @@ html, padding: 0.8rem; } +.vaults-tooltip > .tooltip-inner { + width: auto; + text-align: right; + padding: 0.9rem; +} + form { .field-error { color: $orange; diff --git a/src/styles/modal.scss b/src/styles/modal.scss index 03ea6a2..e68bba7 100644 --- a/src/styles/modal.scss +++ b/src/styles/modal.scss @@ -99,10 +99,16 @@ text-align: left; font-size: 0.8rem; } - .text-muted.liquidation-fee { + .text-muted.liquidation-fee, + .text-muted.liquidation-reward { color: #9ca5ad !important; font-size: 0.9rem; } + .liquidation-data { + display: flex; + margin-top: 5px; + justify-content: space-between; + } input[type="text"].neon-green { border-color: $green !important; diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 4f38377..7febe26 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -6,29 +6,19 @@ .row { display: block; + margin-top: 2rem; } .card { padding: 1.5rem 2.8125rem; - - .filters { + width: 100%; + .actions { display: flex; - flex-direction: row; - justify-content: flex-end; - padding: 0px; - - div[class*="col-"] { - padding: 0px; - } .dd-container { display: flex; align-items: center; margin-left: 1rem; } - .titles { - color: $white; - margin-bottom: 0px; - } .dropdown { padding-left: 0.5rem; .dropdown-toggle { @@ -94,8 +84,40 @@ background-color: $neon-highlight; } } - input[type="radio"] { - display: none; + .filters { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding: 0px; + width: 100%; + input[type="radio"] { + display: none; + } + } + .items-view { + .dd-container { + margin-left: 0rem; + } + .dropdown { + .dropdown-toggle { + height: 2.1rem; + width: 80px; + } + .dropdown-toggle::after { + margin-left: 50%; + } + .dropdown-menu { + width: 120px; + min-width: 120px; + } + } + } + div[class*="col-"] { + padding: 0px; + } + .titles { + color: $white; + margin-bottom: 0px; } } .vaults { @@ -147,6 +169,7 @@ align-items: center; span { flex: 2; + margin-right: -15px; } svg { flex: 1; @@ -248,10 +271,15 @@ .card-body { padding: 1.25rem 0rem; } - - @media (max-width: 600px) { + @media (max-width: 800px) { .row { display: flex; + margin-top: 1rem; + } + .card { + .items-view { + display: flex; + } } } } \ No newline at end of file diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index ca714ac..1168fdc 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -121,7 +121,7 @@ export const notifyUser = async (tx: ethers.ContractTransaction, fn: any = () => notificationBody = "All set, please wait for another confirmation"; sendNotification(notificationTitle, notificationBody, 3000, fn, 1000, "success"); // In case the graph isn't updated on the first transaction, try to update on second transaction. - await tx.wait(2); + await tx.wait(3); fn(); } catch (error) { // catch error when vault screen changes in the middle of an update From b8ebad4748688932a069af9151c796db2faf4494 Mon Sep 17 00:00:00 2001 From: Jorge Destephen Lavaire Date: Mon, 7 Mar 2022 22:58:26 -0600 Subject: [PATCH 051/278] Rename vaults.tsx to Vaults.tsx --- src/components/Vault/Monitoring/{vaults.tsx => Vaults.tsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/components/Vault/Monitoring/{vaults.tsx => Vaults.tsx} (100%) diff --git a/src/components/Vault/Monitoring/vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx similarity index 100% rename from src/components/Vault/Monitoring/vaults.tsx rename to src/components/Vault/Monitoring/Vaults.tsx From 03f41b12faf68ca8b3a3be9d2c7724bf870f9245 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 7 Mar 2022 23:08:27 -0600 Subject: [PATCH 052/278] refresh vaults after liquidation --- src/components/Vault/Monitoring/Liquidate.tsx | 1 + src/components/Vault/Monitoring/index.tsx | 126 +++++++++++++----- src/components/Vault/Monitoring/vaults.tsx | 11 +- src/utils/utils.tsx | 2 +- 4 files changed, 99 insertions(+), 41 deletions(-) diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index b539dec..8b1fdca 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -120,6 +120,7 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } { value: increasedFee } ); notifyUser(tx, refresh); + refresh(); setMaxTcap(""); onHide(); } catch (error) { diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 877ec77..c0978f0 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -67,10 +67,11 @@ export const Monitoring = () => { const [pagination, setPagination] = useState(pagDefault); const [loadMore, setLoadMore] = useState(false); const [pricesUpdated, setPricesUpdated] = useState(false); - const [owner, setOwner] = useState(""); + const [ownerAddress, setOwnerAddress] = useState(""); const [radioValue, setRadioValue] = useState("1"); const [tokenSymbol, setTokenSymbol] = useState("all"); const [currentStatus, setCurrentStatus] = useState("all"); + const [renderTable, setRenderTable] = useState(false); const radios = [ { name: "All Vaults", value: "1" }, { name: "My Vaults", value: "2" }, @@ -97,8 +98,8 @@ export const Monitoring = () => { let ownerFilter = ""; let vaultFilter = ""; let statusFilter = ""; - if (radioValue === "2" && owner !== "") { - ownerFilter = `, owner: "${owner}"`; + if (radioValue === "2" && ownerAddress !== "") { + ownerFilter = `, owner: "${ownerAddress}"`; } if (tokenSymbol !== "all") { vaultFilter = `tokenSymbol: "${tokenSymbol.toUpperCase()}"`; @@ -356,6 +357,35 @@ export const Monitoring = () => { } }; + const calculateVaultData = ( + collateralWei: ethers.BigNumberish, + debtWei: ethers.BigNumberish, + symbol: string + ) => { + const collateralText = ethers.utils.formatEther(collateralWei); + const debtText = ethers.utils.formatEther(debtWei); + const collateralPrice = getCollateralPrice(symbol); + const collateralUSD = toUSD(collateralText, collateralPrice); + const debtUSD = toUSD(debtText, oraclePrices?.tcapOraclePrice || "0"); + const minRatio = getMinRatio(symbol); + const ratio = getRatio2( + collateralText, + collateralPrice, + debtText, + oraclePrices?.tcapOraclePrice || "1" + ); + + let status = "liquidation"; + if (parseFloat(collateralText) < 0.0000001) { + status = "empty"; + } else if (parseFloat(collateralText) >= 0.0000001 && parseFloat(debtText) < 0.0000001) { + status = "ready"; + } else if (ratio >= minRatio) { + status = "active"; + } + return { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status }; + }; + const loadVaults = async (vaultsData: any) => { const vData = new Array(); const totals = { ...totalsDefault }; @@ -364,26 +394,8 @@ export const Monitoring = () => { setLoadMore(false); // @ts-ignore vaultsData.vaults.forEach((v) => { - const collateral = ethers.utils.formatEther(v.collateral); - const debt = ethers.utils.formatEther(v.debt); - const collateralPrice = getCollateralPrice(v.tokenSymbol); - const collateralUSD = toUSD(collateral, collateralPrice); - const debtUSD = toUSD(debt, oraclePrices?.tcapOraclePrice || "0"); - const minRatio = getMinRatio(v.tokenSymbol); - const ratio = getRatio2( - collateral, - collateralPrice, - debt, - oraclePrices?.tcapOraclePrice || "1" - ); - let status = "liquidation"; - if (parseFloat(collateral) < 0.0000001) { - status = "empty"; - } else if (parseFloat(collateral) >= 0.0000001 && parseFloat(debt) < 0.0000001) { - status = "ready"; - } else if (ratio >= minRatio) { - status = "active"; - } + const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = + calculateVaultData(v.collateral, v.debt, v.tokenSymbol); let addVault = true; if (currentStatus === "active" || currentStatus === "liquidation") { @@ -394,9 +406,9 @@ export const Monitoring = () => { vData.push({ id: v.vaultId, collateralSymbol: v.tokenSymbol, - collateralValue: collateral, + collateralValue: collateralText, collateralUsd: collateralUSD.toFixed(2), - debt, + debt: debtText, debtUsd: debtUSD.toFixed(2), ratio, minRatio: minRatio.toString(), @@ -405,9 +417,9 @@ export const Monitoring = () => { }); totals.vaults += 1; - totals.collateral = (parseFloat(totals.collateral) + parseFloat(collateral)).toFixed(4); + totals.collateral = (parseFloat(totals.collateral) + parseFloat(collateralText)).toFixed(4); totals.collateralUSD = (parseFloat(totals.collateralUSD) + collateralUSD).toFixed(2); - totals.debt = (parseFloat(totals.debt) + parseFloat(debt)).toFixed(4); + totals.debt = (parseFloat(totals.debt) + parseFloat(debtText)).toFixed(4); totals.debtUSD = (parseFloat(totals.debtUSD) + debtUSD).toFixed(2); } }); @@ -417,7 +429,7 @@ export const Monitoring = () => { confPagination(vData, pagination.itemsPerPage); }; - const { loading, data, refetch, error } = useQuery(vaultsQuery, { + const { loading, data, error } = useQuery(vaultsQuery, { fetchPolicy: "no-cache", notifyOnNetworkStatusChange: true, skip: skipQuery, @@ -474,9 +486,9 @@ export const Monitoring = () => { setSkipQuery(false); setRadioValue(value); if (value === "1") { - setOwner(""); + setOwnerAddress(""); } else { - setOwner(currentAddress); + setOwnerAddress(currentAddress); } }; @@ -501,12 +513,54 @@ export const Monitoring = () => { setPagination(newPagination); }; - const refresh = async () => { - try { - await refetch(); - } catch (error) { - // catch error in case the vault screen is changed + const updateLiquidatedVault = async (index: number, symbol: string) => { + let currentVault = vaults?.wethVault; + switch (symbol) { + case "DAI": + currentVault = vaults?.daiVault; + break; + case "AAVE": + currentVault = vaults?.aaveVault; + break; + case "LINK": + currentVault = vaults?.linkVault; + break; + case "UNI": + currentVault = vaults?.uniVault; + break; + case "SNX": + currentVault = vaults?.snxVault; + break; + case "MATIC": + currentVault = vaults?.maticVault; + break; + case "WBTC": + currentVault = vaults?.wbtcVault; + break; + default: + break; } + const [vaultId, collateral, , debt] = await currentVault?.getVault( + BigNumber.from(vaultList[index].id) + ); + const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = + calculateVaultData(collateral, debt, symbol); + const allVaults = vaultList; + const v = { + id: vaultId, + collateralSymbol: symbol, + collateralValue: collateralText, + collateralUsd: collateralUSD.toFixed(2), + debt: debtText, + debtUsd: debtUSD.toFixed(2), + ratio, + minRatio: minRatio.toString(), + status, + blockTS: vaultList[index].blockTS, + }; + allVaults[index] = v; + setVaultList(allVaults); + setRenderTable(!renderTable); }; return ( @@ -642,7 +696,7 @@ export const Monitoring = () => { currentAddress={currentAddress} vaults={vaultList} pagination={pagination} - refresh={() => refresh()} + refresh={updateLiquidatedVault} /> )} diff --git a/src/components/Vault/Monitoring/vaults.tsx b/src/components/Vault/Monitoring/vaults.tsx index 63eddc2..377dfb0 100644 --- a/src/components/Vault/Monitoring/vaults.tsx +++ b/src/components/Vault/Monitoring/vaults.tsx @@ -12,16 +12,18 @@ type dataType = { currentAddress: string; vaults: Array; pagination: PaginationType; - refresh: () => void; + refresh: (index: number, symbol: string) => void; }; export const Vaults = ({ currentAddress, vaults, pagination, refresh }: dataType) => { const [showLiquidate, setShowLiquidate] = useState(false); + const [vaultIndex, setVaultIndex] = useState(-1); const [vaultId, setVaultId] = useState(""); const [vaultType, setVaultType] = useState(""); - const liquidateVault = (id: string, type: string) => { + const liquidateVault = (index: number, id: string, type: string) => { setVaultId(id); + setVaultIndex(index); setVaultType(type); setShowLiquidate(true); }; @@ -51,7 +53,7 @@ export const Vaults = ({ currentAddress, vaults, pagination, refresh }: dataType
{v.status === "liquidation" && currentAddress !== "" ? ( - ) : ( @@ -134,9 +136,10 @@ export const Vaults = ({ currentAddress, vaults, pagination, refresh }: dataType onHide={() => { setVaultId(""); setVaultType(""); + setVaultIndex(-1); setShowLiquidate(false); }} - refresh={() => refresh()} + refresh={() => refresh(vaultIndex, vaultType)} /> ); diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 1168fdc..ca714ac 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -121,7 +121,7 @@ export const notifyUser = async (tx: ethers.ContractTransaction, fn: any = () => notificationBody = "All set, please wait for another confirmation"; sendNotification(notificationTitle, notificationBody, 3000, fn, 1000, "success"); // In case the graph isn't updated on the first transaction, try to update on second transaction. - await tx.wait(3); + await tx.wait(2); fn(); } catch (error) { // catch error when vault screen changes in the middle of an update From be82453bfabfee7f3b6d72acc79e1eefb84e9878 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 7 Mar 2022 23:12:12 -0600 Subject: [PATCH 053/278] status on update --- src/components/Vault/Monitoring/index.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 6e145f2..c0978f0 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -545,7 +545,6 @@ export const Monitoring = () => { ); const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = calculateVaultData(collateral, debt, symbol); - console.log(status); const allVaults = vaultList; const v = { id: vaultId, @@ -556,7 +555,7 @@ export const Monitoring = () => { debtUsd: debtUSD.toFixed(2), ratio, minRatio: minRatio.toString(), - status: "active", + status, blockTS: vaultList[index].blockTS, }; allVaults[index] = v; From fae575da23e01ea53e5c5c566bbef53c83ede2e8 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 8 Mar 2022 16:48:43 -0600 Subject: [PATCH 054/278] change import --- src/components/Vault/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Vault/index.tsx b/src/components/Vault/index.tsx index e1cac8e..075fd4b 100644 --- a/src/components/Vault/index.tsx +++ b/src/components/Vault/index.tsx @@ -1,3 +1,3 @@ -export * from "./Vault"; +export * from "./vault"; export * from "./Monitoring/index"; From 4074135a71974fe7b71b3e4d5c0f69cb1a85938e Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 8 Mar 2022 16:50:09 -0600 Subject: [PATCH 055/278] fixed monitoring import --- src/components/Vault/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Vault/index.tsx b/src/components/Vault/index.tsx index 075fd4b..e1cac8e 100644 --- a/src/components/Vault/index.tsx +++ b/src/components/Vault/index.tsx @@ -1,3 +1,3 @@ -export * from "./vault"; +export * from "./Vault"; export * from "./Monitoring/index"; From d6eeaa63ed57950b10059e49d6abcfe2eec1936f Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 8 Mar 2022 18:47:22 -0600 Subject: [PATCH 056/278] load polygon prices --- src/components/Vault/Monitoring/index.tsx | 44 ++++++++++++++++++----- src/utils/utils.tsx | 25 ++++++++----- 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index c0978f0..89d31a3 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -18,6 +18,7 @@ import { getRatio2, isInLayer1, isOptimism, + isPolygon, isUndefined, toUSD, validOracles, @@ -176,6 +177,12 @@ export const Monitoring = () => { ethcalls.push(snxOraclePriceCall); ethcalls.push(uniOraclePriceCall); } + if (isPolygon(currentNetwork.chainId)) { + const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + ethcalls.push(maticOraclePriceCall); + ethcalls.push(wbtcOraclePriceCall); + } let tcapOraclePrice = BigNumber.from(0); let wethOraclePrice = BigNumber.from(0); let daiOraclePrice = BigNumber.from(0); @@ -183,6 +190,8 @@ export const Monitoring = () => { let linkOraclePrice = BigNumber.from(0); let snxOraclePrice = BigNumber.from(0); let uniOraclePrice = BigNumber.from(0); + let maticOraclePrice = BigNumber.from(0); + let wbtcOraclePrice = BigNumber.from(0); if (isInLayer1(currentNetwork.chainId)) { // @ts-ignore @@ -198,6 +207,10 @@ export const Monitoring = () => { snxOraclePrice, uniOraclePrice, ] = await signer.ethcallProvider?.all(ethcalls); + } else if (isPolygon(currentNetwork.chainId)) { + // @ts-ignore + [tcapOraclePrice, daiOraclePrice, maticOraclePrice, wbtcOraclePrice] = + await signer.ethcallProvider?.all(ethcalls); } setOraclePrices({ @@ -208,8 +221,8 @@ export const Monitoring = () => { linkOraclePrice: ethers.utils.formatEther(linkOraclePrice.mul(10000000000)), uniOraclePrice: ethers.utils.formatEther(uniOraclePrice.mul(10000000000)), snxOraclePrice: ethers.utils.formatEther(snxOraclePrice.mul(10000000000)), - maticOraclePrice: "0", - wbtcOraclePrice: "0", + maticOraclePrice: ethers.utils.formatEther(maticOraclePrice.mul(10000000000)), + wbtcOraclePrice: ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)), }); setPricesUpdated(true); } @@ -217,39 +230,53 @@ export const Monitoring = () => { const loadRatios = async () => { if (signer && vaults && validVaults(currentNetwork.chainId || 1, vaults)) { - const wethRatioCall = await vaults.wethVaultRead?.ratio(); const daiRatioCall = await vaults.daiVaultRead?.ratio(); - const ethcalls = [wethRatioCall, daiRatioCall]; + const ethcalls = [daiRatioCall]; if (isInLayer1(currentNetwork.chainId)) { + const wethRatioCall = await vaults.wethVaultRead?.ratio(); const aaveRatioCall = await vaults.aaveVaultRead?.ratio(); const linkRatioCall = await vaults.linkVaultRead?.ratio(); + ethcalls.push(wethRatioCall); ethcalls.push(aaveRatioCall); ethcalls.push(linkRatioCall); } if (isOptimism(currentNetwork.chainId)) { + const wethRatioCall = await vaults.wethVaultRead?.ratio(); const linkRatioCall = await vaults.linkVaultRead?.ratio(); const snxRatioCall = await vaults.snxVaultRead?.ratio(); const uniRatioCall = await vaults.uniVaultRead?.ratio(); + ethcalls.push(wethRatioCall); ethcalls.push(linkRatioCall); ethcalls.push(snxRatioCall); ethcalls.push(uniRatioCall); } + if (isPolygon(currentNetwork.chainId)) { + const maticRatioCall = await vaults.maticVaultRead?.ratio(); + const wbtcRatioCall = await vaults.wbtcVaultRead?.ratio(); + ethcalls.push(maticRatioCall); + ethcalls.push(wbtcRatioCall); + } let ethRatio = 0; let daiRatio = 0; let aaveRatio = 0; let linkRatio = 0; let snxRatio = 0; let uniRatio = 0; + let maticRatio = 0; + let wbtcRatio = 0; if (isInLayer1(currentNetwork.chainId)) { // @ts-ignore - [ethRatio, daiRatio, aaveRatio, linkRatio] = await signer.ethcallProvider?.all(ethcalls); + [daiRatio, ethRatio, aaveRatio, linkRatio] = await signer.ethcallProvider?.all(ethcalls); } else if (isOptimism(currentNetwork.chainId)) { // @ts-ignore - [ethRatio, daiRatio, linkRatio, snxRatio, uniRatio] = await signer.ethcallProvider?.all( + [daiRatio, ethRatio, linkRatio, snxRatio, uniRatio] = await signer.ethcallProvider?.all( ethcalls ); + } else if (isPolygon(currentNetwork.chainId)) { + // @ts-ignore + [daiRatio, maticRatio, wbtcRatio] = await signer.ethcallProvider?.all(ethcalls); } setVaultsRatio({ ethRatio, @@ -259,8 +286,8 @@ export const Monitoring = () => { linkRatio, uniRatio, snxRatio, - maticRatio: 0, - wbtcRatio: 0, + maticRatio, + wbtcRatio, }); } }; @@ -472,6 +499,7 @@ export const Monitoring = () => { } else { symbols.push({ key: "matic", name: "MATIC" }); symbols.push({ key: "dai", name: "DAI" }); + symbols.push({ key: "wbtc", name: "WBTC" }); } return symbols; diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 6cb21e9..99e6e44 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -334,43 +334,50 @@ export const getDefaultProvider = (chainId: number | undefined, name: string | u }; export const validOracles = (chainId: number, oracles: OraclesContext): boolean => { - let valid = - !isUndefined(oracles.wethOracleRead) && - !isUndefined(oracles.daiOracleRead) && - !isUndefined(oracles.tcapOracleRead); + let valid = !isUndefined(oracles.daiOracleRead) && !isUndefined(oracles.tcapOracleRead); if (isInLayer1(chainId)) { - valid = valid && !isUndefined(oracles.aaveOracleRead) && !isUndefined(oracles.linkOracleRead); + valid = + valid && + !isUndefined(oracles.wethOracleRead) && + !isUndefined(oracles.aaveOracleRead) && + !isUndefined(oracles.linkOracleRead); } if (isOptimism(chainId)) { valid = valid && + !isUndefined(oracles.wethOracleRead) && !isUndefined(oracles.linkOracleRead) && !isUndefined(oracles.snxOracleRead) && !isUndefined(oracles.uniOracleRead); } - if (chainId === NETWORKS.polygon.chainId) { + if (isPolygon(chainId)) { valid = valid && !isUndefined(oracles.maticOracle) && !isUndefined(oracles.maticOracleRead); } return valid; }; export const validVaults = (chainId: number, vaults: VaultsContext): boolean => { - let valid = !isUndefined(vaults.wethVaultRead) && !isUndefined(vaults.daiVaultRead); + let valid = !isUndefined(vaults.daiVaultRead); if (isInLayer1(chainId)) { - valid = valid && !isUndefined(vaults.aaveVaultRead) && !isUndefined(vaults.linkVaultRead); + valid = + valid && + !isUndefined(vaults.wethVaultRead) && + !isUndefined(vaults.aaveVaultRead) && + !isUndefined(vaults.linkVaultRead); } if (isOptimism(chainId)) { valid = valid && + !isUndefined(vaults.wethVaultRead) && !isUndefined(vaults.linkVaultRead) && !isUndefined(vaults.snxVaultRead) && !isUndefined(vaults.uniVaultRead); } - if (chainId === NETWORKS.polygon.chainId) { + if (isPolygon(chainId)) { valid = valid && !isUndefined(vaults.maticVaultRead) && !isUndefined(vaults.wbtcVaultRead); } return valid; From 075b8b9ba570dbf4a05bcfe259121211876dbebd Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 10 Mar 2022 13:40:38 -0600 Subject: [PATCH 057/278] add wbt vault to rinkeby --- src/App.tsx | 88 +- src/components/Graph.tsx | 61 +- src/components/Vault/Details.tsx | 2 +- src/contracts/cryptex.json | 6390 ++++++++++++------------------ src/utils/utils.tsx | 3 +- 5 files changed, 2713 insertions(+), 3831 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 62178f8..9ce6e88 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -147,11 +147,23 @@ const App = () => { currentSigner ); vaults.setCurrentAAVEVault(currentAAVEVault); + const currentWBTCVault = new ethers.Contract( + contracts.WBTCVaultHandler.address, + contracts.WBTCVaultHandler.abi, + currentSigner + ); + vaults.setCurrentWBTCVault(currentWBTCVault); + const currentAVEEVaultRead = new Contract( contracts.AaveVaultHandler.address, contracts.AaveVaultHandler.abi ); vaults.setCurrentAAVEVaultRead(currentAVEEVaultRead); + const currentWBTCVaultRead = new Contract( + contracts.WBTCVaultHandler.address, + contracts.WBTCVaultHandler.abi + ); + vaults.setCurrentWBTCVaultRead(currentWBTCVaultRead); // Tokens const currentAAVEToken = new ethers.Contract( @@ -160,9 +172,17 @@ const App = () => { currentSigner ); tokens.setCurrentAAVEToken(currentAAVEToken); + const currentWBTCToken = new ethers.Contract( + contracts.WBTC.address, + contracts.WBTC.abi, + currentSigner + ); + tokens.setCurrentWBTCToken(currentWBTCToken); const currentAAVETokenRead = new Contract(contracts.AAVE.address, contracts.AAVE.abi); tokens.setCurrentAAVETokenRead(currentAAVETokenRead); + const currentWBTCTokenRead = new Contract(contracts.WBTC.address, contracts.WBTC.abi); + tokens.setCurrentWBTCTokenRead(currentWBTCTokenRead); // Set Rewards const currentWETHReward = new ethers.Contract( @@ -212,20 +232,21 @@ const App = () => { ); rewards.setCurrentWETHPoolRewardRead(currentWETHPoolRewardRead); - const currentCTXPoolReward = new ethers.Contract( - // @ts-ignore - contracts.CTXLiquidityReward.address, // @ts-ignore - contracts.CTXLiquidityReward.abi, - currentSigner - ); - rewards.setCurrentCTXPoolReward(currentCTXPoolReward); - - const currentCTXPoolRewardRead = new Contract( // @ts-ignore - contracts.CTXLiquidityReward.address, // @ts-ignore - contracts.CTXLiquidityReward.abi - ); - rewards.setCurrentCTXPoolRewardRead(currentCTXPoolRewardRead); + if (chainId === NETWORKS.mainnet.chainId) { + const currentCTXPoolReward = new ethers.Contract( + // @ts-ignore + contracts.CTXLiquidityReward.address, // @ts-ignore + contracts.CTXLiquidityReward.abi, + currentSigner + ); + rewards.setCurrentCTXPoolReward(currentCTXPoolReward); + const currentCTXPoolRewardRead = new Contract( // @ts-ignore + contracts.CTXLiquidityReward.address, // @ts-ignore + contracts.CTXLiquidityReward.abi + ); + rewards.setCurrentCTXPoolRewardRead(currentCTXPoolRewardRead); + } // Oracles const currentAAVEOracle = new ethers.Contract( contracts.AaveOracle.address, @@ -233,25 +254,42 @@ const App = () => { currentSigner ); oracles.setCurrentAAVEOracle(currentAAVEOracle); + const currentWBTCOracle = new ethers.Contract( + contracts.WBTCOracle.address, + contracts.WBTCOracle.abi, + currentSigner + ); + oracles.setCurrentWBTCOracle(currentWBTCOracle); + const currentAAVEOracleRead = new Contract( contracts.AaveOracle.address, contracts.AaveOracle.abi ); oracles.setCurrentAAVEOracleRead(currentAAVEOracleRead); - - // Set Governance - const currentDelegatorFactory = new ethers.Contract( - contracts.DelegatorFactory.address, - contracts.DelegatorFactory.abi, - currentSigner - ); - governance.setCurrentDelegatorFactory(currentDelegatorFactory); - const currentDelegatorFactoryRead = new Contract( - contracts.DelegatorFactory.address, - contracts.DelegatorFactory.abi + const currentWBTCOracleRead = new Contract( + contracts.WBTCOracle.address, + contracts.WBTCOracle.abi ); - governance.setCurrentDelegatorFactoryRead(currentDelegatorFactoryRead); + oracles.setCurrentWBTCOracleRead(currentWBTCOracleRead); + // Set Governance + if (chainId === NETWORKS.mainnet.chainId) { + const currentDelegatorFactory = new ethers.Contract( + // @ts-ignore + contracts.DelegatorFactory.address, + // @ts-ignore + contracts.DelegatorFactory.abi, + currentSigner + ); + governance.setCurrentDelegatorFactory(currentDelegatorFactory); + const currentDelegatorFactoryRead = new Contract( + // @ts-ignore + contracts.DelegatorFactory.address, + // @ts-ignore + contracts.DelegatorFactory.abi + ); + governance.setCurrentDelegatorFactoryRead(currentDelegatorFactoryRead); + } // TODO:remove this once other pools work if (ethPoolAddress && ctxPoolAddress) { const currentWETHPoolToken = new ethers.Contract( diff --git a/src/components/Graph.tsx b/src/components/Graph.tsx index 2dd5b78..6b12a20 100644 --- a/src/components/Graph.tsx +++ b/src/components/Graph.tsx @@ -97,10 +97,12 @@ const Graph = () => { const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); ethcalls.push(wethOraclePriceCall); ethcalls.push(aaveOraclePriceCall); ethcalls.push(linkOraclePriceCall); + ethcalls.push(wbtcOraclePriceCall); ethcalls.push(reservesCtxPoolCall); } if (isOptimism(currentNetwork.chainId)) { @@ -137,6 +139,7 @@ const Graph = () => { wethOraclePrice, aaveOraclePrice, linkOraclePrice, + wbtcOraclePrice, reservesCtxPool, ] = await signer.ethcallProvider?.all(ethcalls); } else if (isOptimism(currentNetwork.chainId)) { @@ -205,6 +208,7 @@ const Graph = () => { if (cAddress === contracts.MATICVaultHandler.address.toLowerCase()) { currentMATICStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); } + } else if (isInLayer1(currentNetwork.chainId) || isPolygon(currentNetwork.chainId)) { // @ts-ignore if (cAddress === contracts.WBTCVaultHandler.address.toLowerCase()) { currentWBTCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); @@ -268,6 +272,7 @@ const Graph = () => { ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); aaveUSD = ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)); linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); + wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); } if (isOptimism(currentNetwork.chainId)) { ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); @@ -454,34 +459,34 @@ const Graph = () => { )} {isPolygon(currentNetwork.chainId) && ( - <> - - -

{t("graph.staked-matic")}

-
- {" "} - MATIC -
-
- - -

Total Staked in WBTC

-
- {" "} - WBTC -
-
- + + +

{t("graph.staked-matic")}

+
+ {" "} + MATIC +
+
+ )} + {!isOptimism(currentNetwork.chainId) && ( + + +

Total Staked in WBTC

+
+ {" "} + WBTC +
+
)}
diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index 0fc49b3..934cbf2 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -955,7 +955,7 @@ const Details = ({ address, t }: props) => { useEffect(() => { async function load() { - let vOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; + let vOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK", "WBTC"]; if (isOptimism(currentNetwork.chainId)) { vOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; } diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index 2e705b7..dfe9965 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -1785,7 +1785,7 @@ } ] }, - "BTCOracle": { + "WBTCOracle": { "address": "0x07Ef20895ceF20855D29ACeDCa35E6f96AF4fF49", "abi": [ { @@ -11250,29 +11250,38 @@ } ] }, - "WBTCRewardHandler": { - "address": "0x1A14F9367Db41400BE5d38a0bC48d4Cc2e4B7157", + "WBTC": { + "address": "0x200534AA6A1c47102C09232347373499B983D6EF", "abi": [ { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_owner", + "name": "owner", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "_rewardsToken", + "name": "spender", "type": "address" }, { - "internalType": "address", - "name": "_vault", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "Approval", + "type": "event" }, { "anonymous": false, @@ -11280,244 +11289,218 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "to", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "OwnershipTransferred", + "name": "Transfer", "type": "event" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", "type": "address" } ], - "name": "Paused", - "type": "event" + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "token", + "name": "spender", "type": "address" }, { - "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], - "name": "Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "approve", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "reward", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "RewardAdded", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "user", + "name": "account", "type": "address" - }, + } + ], + "name": "balanceOf", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "", "type": "uint256" } ], - "name": "RewardPaid", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, + "internalType": "address", + "name": "_account", + "type": "address" + }, + { "internalType": "uint256", - "name": "newDuration", + "name": "_amount", "type": "uint256" } ], - "name": "RewardsDurationUpdated", - "type": "event" + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, + "inputs": [], + "name": "decimals", + "outputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], - "name": "RoleAdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, "internalType": "address", - "name": "account", + "name": "spender", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" } ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, + "name": "decreaseAllowance", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "RoleRevoked", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "user", + "name": "spender", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "addedValue", "type": "uint256" } ], - "name": "Staked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "increaseAllowance", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "user", + "name": "_account", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "Withdrawn", - "type": "event" + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "name", "outputs": [ { - "internalType": "bytes32", + "internalType": "string", "name": "", - "type": "bytes32" + "type": "string" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "symbol", + "outputs": [ { - "internalType": "address", - "name": "_account", - "type": "address" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "balanceOf", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -11532,203 +11515,536 @@ "inputs": [ { "internalType": "address", - "name": "_account", + "name": "recipient", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "earned", + "name": "transfer", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_staker", + "name": "sender", "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "exit", - "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "WBTCRewardHandler": { + "address": "0x1A14F9367Db41400BE5d38a0bC48d4Cc2e4B7157", + "abi": [ { - "inputs": [], - "name": "getReward", - "outputs": [], + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { - "inputs": [], - "name": "getRewardForDuration", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "_staker", + "name": "account", "type": "address" } ], - "name": "getRewardFromVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "getRoleAdmin", - "outputs": [ + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardAdded", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "index", + "name": "reward", "type": "uint256" } ], - "name": "getRoleMember", - "outputs": [ + "name": "RewardPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardsDurationUpdated", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { + "indexed": true, "internalType": "address", "name": "account", "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { + "indexed": true, "internalType": "address", "name": "account", "type": "address" - } - ], - "name": "hasRole", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Staked", + "type": "event" }, { - "inputs": [], - "name": "lastUpdateTime", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Unpaused", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_a", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "earned", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_staker", + "type": "address" + } + ], + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getRewardForDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_staker", + "type": "address" + } + ], + "name": "getRewardFromVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_a", + "type": "uint256" }, { "internalType": "uint256", @@ -17353,7 +17669,7 @@ } ] }, - "BTCOracle": { + "WBTCOracle": { "address": "0x6941264Cb2cB98F62d6014C6edcB24740e4592dE", "abi": [ { @@ -17589,8 +17905,8 @@ } ] }, - "CTXLiquidityReward": { - "address": "0xdC4cDd5dB9EE777EFD891690dc283638CB3A5f94", + "WBTCRewardHandler": { + "address": "0x386e8b1eDe61BDaAB9EFE5d999145fDDbd10A64C", "abi": [ { "inputs": [ @@ -17606,18 +17922,8 @@ }, { "internalType": "address", - "name": "_stakingToken", + "name": "_vault", "type": "address" - }, - { - "internalType": "uint256", - "name": "_vestingEnd", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_vestingRatio", - "type": "uint256" } ], "stateMutability": "nonpayable", @@ -17877,13 +18183,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "claimVest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -17904,7 +18203,13 @@ "type": "function" }, { - "inputs": [], + "inputs": [ + { + "internalType": "address", + "name": "_staker", + "type": "address" + } + ], "name": "exit", "outputs": [], "stateMutability": "nonpayable", @@ -17930,6 +18235,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "_staker", + "type": "address" + } + ], + "name": "getRewardFromVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -18296,6 +18614,11 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "_staker", + "type": "address" + }, { "internalType": "uint256", "name": "_amount", @@ -18307,19 +18630,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "stakingToken", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "totalSupply", @@ -18365,46 +18675,14 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "vestingAmounts", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "vestingEnd", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], - "name": "vestingRatio", + "name": "vault", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -18412,6 +18690,11 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "_staker", + "type": "address" + }, { "internalType": "uint256", "name": "_amount", @@ -18425,24 +18708,69 @@ } ] }, - "BTCRewardHandler": { - "address": "0x386e8b1eDe61BDaAB9EFE5d999145fDDbd10A64C", + "WBTCVaultHandler": { + "address": "0x1b9cd5A9acC56405806D0E4618616f761001eB62", "abi": [ { "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, { "internalType": "address", - "name": "_owner", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", "type": "address" }, { "internalType": "address", - "name": "_rewardsToken", + "name": "_collateralAddress", "type": "address" }, { "internalType": "address", - "name": "_vault", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", "type": "address" } ], @@ -18455,62 +18783,67 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "Paused", + "name": "CollateralAdded", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "token", + "name": "_owner", "type": "address" }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "Recovered", + "name": "CollateralRemoved", "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_burnFee", "type": "uint256" } ], - "name": "RewardAdded", + "name": "NewBurnFee", "type": "event" }, { @@ -18519,30 +18852,36 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "RewardPaid", + "name": "NewLiquidationPenalty", "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { "indexed": false, "internalType": "uint256", - "name": "newDuration", + "name": "_ratio", "type": "uint256" } ], - "name": "RewardsDurationUpdated", + "name": "NewRatio", "type": "event" }, { @@ -18550,59 +18889,129 @@ "inputs": [ { "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" + "internalType": "address", + "name": "_owner", + "type": "address" }, { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" } ], - "name": "RoleAdminChanged", + "name": "NewTreasury", "type": "event" }, { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "indexed": true, "internalType": "address", - "name": "account", + "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "sender", + "name": "newOwner", "type": "address" } ], - "name": "RoleGranted", + "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "indexed": true, @@ -18626,17 +19035,48 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", "type": "address" }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "Staked", + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", "type": "event" }, { @@ -18658,17 +19098,48 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", "type": "uint256" } ], - "name": "Withdrawn", + "name": "VaultLiquidated", "type": "event" }, { @@ -18685,14 +19156,21 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ { - "internalType": "address", - "name": "_account", + "internalType": "contract ChainlinkOracle", + "name": "", "type": "address" } ], - "name": "balanceOf", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -18704,14 +19182,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "earned", + "inputs": [], + "name": "MIN_RATIO", "outputs": [ { "internalType": "uint256", @@ -18723,33 +19195,26 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "internalType": "uint256", + "name": "price", + "type": "uint256" } ], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "getRewardForDuration", + "name": "TCAPToken", "outputs": [ { - "internalType": "uint256", + "internalType": "contract TCAP", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -18758,12 +19223,12 @@ { "inputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "getRewardFromVault", + "name": "addCollateral", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -18771,39 +19236,35 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "getRoleAdmin", + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", + "inputs": [], + "name": "collateralContract", "outputs": [ { - "internalType": "address", + "internalType": "contract IERC20", "name": "", "type": "address" } @@ -18812,18 +19273,25 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" } ], - "name": "getRoleMemberCount", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_value", "type": "uint256" } ], @@ -18831,54 +19299,38 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", + "inputs": [], + "name": "createVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", + "inputs": [], + "name": "divisor", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "lastTimeRewardApplicable", + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "fee", "type": "uint256" } ], @@ -18886,12 +19338,18 @@ "type": "function" }, { - "inputs": [], - "name": "lastUpdateTime", + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "price", "type": "uint256" } ], @@ -18901,43 +19359,36 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_a", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_b", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "min", + "name": "getRoleAdmin", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "uint256", - "name": "_reward", + "name": "index", "type": "uint256" } ], - "name": "notifyRewardAmount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", + "name": "getRoleMember", "outputs": [ { "internalType": "address", @@ -18949,21 +19400,14 @@ "type": "function" }, { - "inputs": [], - "name": "paused", - "outputs": [ + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "periodFinish", + "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", @@ -18976,27 +19420,55 @@ }, { "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, { "internalType": "address", - "name": "_tokenAddress", + "name": "", "type": "address" }, { "internalType": "uint256", - "name": "_tokenAmount", + "name": "", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { @@ -19012,7 +19484,7 @@ "type": "address" } ], - "name": "renounceRole", + "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -19030,40 +19502,38 @@ "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerToken", + "name": "hasRole", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "rewardPerTokenStored", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", "type": "uint256" } ], - "stateMutability": "view", + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "rewardRate", + "name": "liquidationPenalty", "outputs": [ { "internalType": "uint256", @@ -19077,25 +19547,38 @@ { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" } ], - "name": "rewards", + "name": "liquidationReward", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "rewardCollateral", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], - "name": "rewardsDuration", + "name": "oracleDigits", "outputs": [ { "internalType": "uint256", @@ -19108,10 +19591,10 @@ }, { "inputs": [], - "name": "rewardsToken", + "name": "owner", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "address", "name": "", "type": "address" } @@ -19120,39 +19603,28 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_rewardsDuration", - "type": "uint256" - } - ], - "name": "setRewardsDuration", + "inputs": [], + "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_staker", - "type": "address" - }, + "inputs": [], + "name": "paused", + "outputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "stake", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "totalSupply", + "name": "ratio", "outputs": [ { "internalType": "uint256", @@ -19167,386 +19639,346 @@ "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "_tokenAddress", "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" } ], - "name": "transferOwnership", + "name": "recoverERC20", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userRewardPerTokenPaid", - "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "vault", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "withdraw", + "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "BTCVaultHandler": { - "address": "0x5070ceb13f372b2F3496c643f87D23c01f106367", - "abi": [ + }, { "inputs": [ - { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_divisor", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - }, { "internalType": "uint256", - "name": "_burnFee", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "requiredCollateral", + "outputs": [ { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "collateral", "type": "uint256" - }, - { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardHandler", - "type": "address" - }, - { - "internalType": "address", - "name": "_treasury", - "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_vaultId", "type": "uint256" - }, + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], - "name": "CollateralAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "CollateralRemoved", - "type": "event" + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "rewardHandler", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", + "internalType": "contract IRewardHandler", + "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "indexed": false, "internalType": "uint256", "name": "_burnFee", "type": "uint256" } ], - "name": "NewBurnFee", - "type": "event" + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "NewLiquidationPenalty", - "type": "event" + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", "name": "_ratio", "type": "uint256" } ], - "name": "NewRatio", - "type": "event" + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, "internalType": "address", - "name": "_tresury", + "name": "_treasury", "type": "address" } ], - "name": "NewTreasury", - "type": "event" + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "treasury", + "outputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "Paused", - "type": "event" + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "_token", + "name": "", "type": "address" - }, + } + ], + "name": "userToVault", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" }, { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" }, { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], - "name": "RoleAdminChanged", - "type": "event" - }, + "stateMutability": "view", + "type": "function" + } + ] + }, + "Ctx": { + "address": "0xAa715DbD2ED909B7B7727dC864F3B78276D14A19", + "abi": [ { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "sender", + "name": "minter_", "type": "address" + }, + { + "internalType": "uint256", + "name": "mintingAllowedAfter_", + "type": "uint256" } ], - "name": "RoleGranted", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "indexed": true, "internalType": "address", - "name": "account", + "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "sender", + "name": "spender", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "RoleRevoked", + "name": "Approval", "type": "event" }, { @@ -19555,23 +19987,23 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "delegator", "type": "address" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "address", + "name": "fromDelegate", + "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "toDelegate", + "type": "address" } ], - "name": "TokensBurned", + "name": "DelegateChanged", "type": "event" }, { @@ -19580,23 +20012,23 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "delegate", "type": "address" }, { - "indexed": true, + "indexed": false, "internalType": "uint256", - "name": "_id", + "name": "previousBalance", "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "newBalance", "type": "uint256" } ], - "name": "TokensMinted", + "name": "DelegateVotesChanged", "type": "event" }, { @@ -19605,30 +20037,17 @@ { "indexed": false, "internalType": "address", - "name": "account", + "name": "minter", "type": "address" - } - ], - "name": "Unpaused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "_owner", + "name": "newMinter", "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" } ], - "name": "VaultCreated", + "name": "MinterChanged", "type": "event" }, { @@ -19636,35 +20055,29 @@ "inputs": [ { "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "from", + "type": "address" }, { "indexed": true, "internalType": "address", - "name": "_liquidator", + "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_reward", + "name": "amount", "type": "uint256" } ], - "name": "VaultLiquidated", + "name": "Transfer", "type": "event" }, { "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "DELEGATION_TYPEHASH", "outputs": [ { "internalType": "bytes32", @@ -19677,12 +20090,12 @@ }, { "inputs": [], - "name": "ETHPriceOracle", + "name": "DOMAIN_TYPEHASH", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", @@ -19690,20 +20103,31 @@ }, { "inputs": [], - "name": "MAX_FEE", + "name": "PERMIT_TYPEHASH", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "MIN_RATIO", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", "outputs": [ { "internalType": "uint256", @@ -19715,60 +20139,38 @@ "type": "function" }, { - "inputs": [], - "name": "TCAPPrice", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "price", + "name": "rawAmount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TCAPToken", + "name": "approve", "outputs": [ { - "internalType": "contract TCAP", + "internalType": "bool", "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "type": "bool" } ], - "name": "addCollateral", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "burnFee", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -19780,39 +20182,29 @@ "type": "function" }, { - "inputs": [], - "name": "collateralContract", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20", + "internalType": "address", "name": "", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "collateralPriceOracle", - "outputs": [ + }, { - "internalType": "contract ChainlinkOracle", + "internalType": "uint32", "name": "", - "type": "address" + "type": "uint32" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "counter", + "name": "checkpoints", "outputs": [ { - "internalType": "uint256", - "name": "_value", - "type": "uint256" + "internalType": "uint32", + "name": "fromBlock", + "type": "uint32" + }, + { + "internalType": "uint96", + "name": "votes", + "type": "uint96" } ], "stateMutability": "view", @@ -19820,19 +20212,12 @@ }, { "inputs": [], - "name": "createVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "divisor", + "name": "decimals", "outputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "", - "type": "uint256" + "type": "uint8" } ], "stateMutability": "view", @@ -19840,75 +20225,88 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "_amount", + "name": "subtractedValue", "type": "uint256" } ], - "name": "getFee", + "name": "decreaseAllowance", "outputs": [ { - "internalType": "uint256", - "name": "fee", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "internalType": "address", + "name": "delegatee", "type": "address" } ], - "name": "getOraclePrice", - "outputs": [ - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, { "internalType": "bytes32", - "name": "role", + "name": "r", "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ + }, { "internalType": "bytes32", - "name": "", + "name": "s", "type": "bytes32" } ], - "stateMutability": "view", + "name": "delegateBySig", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "getRoleMember", + "name": "delegates", "outputs": [ { "internalType": "address", @@ -19922,17 +20320,17 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "getRoleMemberCount", + "name": "getCurrentVotes", "outputs": [ { - "internalType": "uint256", + "internalType": "uint96", "name": "", - "type": "uint256" + "type": "uint96" } ], "stateMutability": "view", @@ -19940,33 +20338,23 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, { "internalType": "uint256", - "name": "_id", + "name": "blockNumber", "type": "uint256" } ], - "name": "getVault", + "name": "getPriorVotes", "outputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", + "internalType": "uint96", "name": "", - "type": "uint256" + "type": "uint96" } ], "stateMutability": "view", @@ -19974,91 +20362,106 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "_vaultId", + "name": "addedValue", "type": "uint256" } ], - "name": "getVaultRatio", + "name": "increaseAllowance", "outputs": [ { - "internalType": "uint256", - "name": "currentRatio", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "inputs": [], + "name": "minimumTimeBetweenMints", + "outputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint32", + "name": "", + "type": "uint32" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "dst", "type": "address" + }, + { + "internalType": "uint256", + "name": "rawAmount", + "type": "uint256" } ], - "name": "hasRole", + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "mintCap", "outputs": [ { - "internalType": "bool", + "internalType": "uint8", "name": "", - "type": "bool" + "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "minter", + "outputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mintingAllowedAfter", + "outputs": [ { "internalType": "uint256", - "name": "_maxTCAP", + "name": "", "type": "uint256" } ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "liquidationPenalty", + "name": "name", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], "stateMutability": "view", @@ -20067,16 +20470,16 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "liquidationReward", + "name": "nonces", "outputs": [ { "internalType": "uint256", - "name": "rewardCollateral", + "name": "", "type": "uint256" } ], @@ -20086,57 +20489,86 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "oracleDigits", + "name": "numCheckpoints", "outputs": [ { - "internalType": "uint256", + "internalType": "uint32", "name": "", - "type": "uint256" + "type": "uint32" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "rawAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" } ], - "stateMutability": "view", + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "pause", + "inputs": [ + { + "internalType": "address", + "name": "minter_", + "type": "address" + } + ], + "name": "setMinter", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "paused", + "name": "symbol", "outputs": [ { - "internalType": "bool", + "internalType": "string", "name": "", - "type": "bool" + "type": "string" } ], "stateMutability": "view", @@ -20144,7 +20576,7 @@ }, { "inputs": [], - "name": "ratio", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -20159,90 +20591,133 @@ "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "dst", "type": "address" }, { "internalType": "uint256", - "name": "_tokenAmount", + "name": "rawAmount", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "internalType": "address", + "name": "dst", + "type": "address" + }, { "internalType": "uint256", - "name": "_amount", + "name": "rawAmount", "type": "uint256" } ], - "name": "removeCollateral", - "outputs": [], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "DAI": { + "address": "0x118a4238E4086FAE2621D0336C0E6cdC1257BE82", + "abi": [ { "inputs": [], - "name": "renounceOwnership", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "account", + "name": "spender", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Approval", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "requiredCollateral", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "collateral", + "name": "value", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Transfer", + "type": "event" }, { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" } ], - "name": "requiredLiquidationTCAP", + "name": "allowance", "outputs": [ { "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" } ], @@ -20251,96 +20726,92 @@ }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardHandler", + "name": "approve", "outputs": [ { - "internalType": "contract IRewardHandler", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "balanceOf", + "outputs": [ { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, { "internalType": "uint256", - "name": "_ratio", + "name": "_amount", "type": "uint256" } ], - "name": "setRatio", + "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "decimals", + "outputs": [ { - "internalType": "address", - "name": "_treasury", - "type": "address" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], - "name": "setTreasury", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" } ], - "name": "supportsInterface", + "name": "decreaseAllowance", "outputs": [ { "internalType": "bool", @@ -20348,43 +20819,59 @@ "type": "bool" } ], - "stateMutability": "pure", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "tcapOracle", + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "_account", "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "transferOwnership", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "treasury", + "name": "name", "outputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", @@ -20392,20 +20879,20 @@ }, { "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "symbol", + "outputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], - "name": "userToVault", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -20418,59 +20905,68 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "name": "vaults", + "name": "transfer", "outputs": [ { - "internalType": "uint256", - "name": "Id", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" }, { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" + "internalType": "address", + "name": "recipient", + "type": "address" }, { "internalType": "uint256", - "name": "Debt", + "name": "amount", "type": "uint256" - }, + } + ], + "name": "transferFrom", + "outputs": [ { - "internalType": "address", - "name": "Owner", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" } ] }, - "Ctx": { - "address": "0xAa715DbD2ED909B7B7727dC864F3B78276D14A19", + "DAIOracle": { + "address": "0xb50365a53EB0d8f214FFD0Cc0F2936BD877B3e17", "abi": [ { "inputs": [ { "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "address", - "name": "minter_", + "name": "_aggregator", "type": "address" - }, - { - "internalType": "uint256", - "name": "mintingAllowedAfter_", - "type": "uint256" } ], "stateMutability": "nonpayable", @@ -20482,127 +20978,60 @@ { "indexed": true, "internalType": "address", - "name": "owner", + "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "spender", + "name": "newOwner", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "Approval", + "name": "OwnershipTransferred", "type": "event" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "fromDelegate", - "type": "address" - }, + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "toDelegate", - "type": "address" + "internalType": "int256", + "name": "", + "type": "int256" } ], - "name": "DelegateChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "getLatestRound", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "delegate", - "type": "address" + "internalType": "uint80", + "name": "", + "type": "uint80" }, { - "indexed": false, - "internalType": "uint256", - "name": "previousBalance", - "type": "uint256" + "internalType": "int256", + "name": "", + "type": "int256" }, { - "indexed": false, "internalType": "uint256", - "name": "newBalance", + "name": "", "type": "uint256" - } - ], - "name": "DelegateVotesChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newMinter", - "type": "address" - } - ], - "name": "MinterChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [], - "name": "DELEGATION_TYPEHASH", - "outputs": [ + }, { - "internalType": "bytes32", + "internalType": "uint80", "name": "", - "type": "bytes32" + "type": "uint80" } ], "stateMutability": "view", @@ -20610,25 +21039,31 @@ }, { "inputs": [], - "name": "DOMAIN_TYPEHASH", + "name": "getLatestTimestamp", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "PERMIT_TYPEHASH", + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", "outputs": [ { - "internalType": "bytes32", + "internalType": "int256", "name": "", - "type": "bytes32" + "type": "int256" } ], "stateMutability": "view", @@ -20637,17 +21072,12 @@ { "inputs": [ { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "allowance", + "name": "getPreviousTimestamp", "outputs": [ { "internalType": "uint256", @@ -20661,70 +21091,37 @@ { "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "rawAmount", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "approve", + "name": "getRound", "outputs": [ { - "internalType": "bool", + "internalType": "uint80", "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "type": "uint80" + }, { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", "name": "", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" }, { - "internalType": "uint32", + "internalType": "uint256", "name": "", - "type": "uint32" - } - ], - "name": "checkpoints", - "outputs": [ - { - "internalType": "uint32", - "name": "fromBlock", - "type": "uint32" + "type": "uint256" }, { - "internalType": "uint96", - "name": "votes", - "type": "uint96" + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", @@ -20732,31 +21129,46 @@ }, { "inputs": [], - "name": "decimals", + "name": "owner", "outputs": [ { - "internalType": "uint8", + "internalType": "address", "name": "", - "type": "uint8" + "type": "address" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { "internalType": "address", - "name": "spender", + "name": "_aggregator", "type": "address" - }, + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" } ], - "name": "decreaseAllowance", + "name": "supportsInterface", "outputs": [ { "internalType": "bool", @@ -20764,224 +21176,278 @@ "type": "bool" } ], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "delegatee", + "name": "newOwner", "type": "address" } ], - "name": "delegate", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "DAIRewardHandler": { + "address": "0x423eDDfAA00fE22945739070BB911AcBF1fDf4D4", + "abi": [ { "inputs": [ { "internalType": "address", - "name": "delegatee", + "name": "_owner", "type": "address" }, { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expiry", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" + "internalType": "address", + "name": "_rewardsToken", + "type": "address" }, { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" + "internalType": "address", + "name": "_vault", + "type": "address" } ], - "name": "delegateBySig", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "previousOwner", "type": "address" - } - ], - "name": "delegates", - "outputs": [ + }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, + "name": "OwnershipTransferred", + "type": "event" + }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], - "name": "getCurrentVotes", - "outputs": [ - { - "internalType": "uint96", - "name": "", - "type": "uint96" - } - ], - "stateMutability": "view", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "account", + "name": "token", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "blockNumber", + "name": "amount", "type": "uint256" } ], - "name": "getPriorVotes", - "outputs": [ + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "uint96", - "name": "", - "type": "uint96" + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardAdded", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "user", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "addedValue", + "name": "reward", "type": "uint256" } ], - "name": "increaseAllowance", - "outputs": [ + "name": "RewardPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "RewardsDurationUpdated", + "type": "event" }, { - "inputs": [], - "name": "minimumTimeBetweenMints", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint32", - "name": "", - "type": "uint32" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", - "name": "dst", + "name": "account", "type": "address" }, { - "internalType": "uint256", - "name": "rawAmount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { - "inputs": [], - "name": "mintCap", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint8", - "name": "", - "type": "uint8" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { - "inputs": [], - "name": "minter", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Unpaused", + "type": "event" }, { - "inputs": [], - "name": "mintingAllowedAfter", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Withdrawn", + "type": "event" }, { "inputs": [], - "name": "name", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "string", + "internalType": "bytes32", "name": "", - "type": "string" + "type": "bytes32" } ], "stateMutability": "view", @@ -20991,11 +21457,11 @@ "inputs": [ { "internalType": "address", - "name": "", + "name": "_account", "type": "address" } ], - "name": "nonces", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -21010,16 +21476,16 @@ "inputs": [ { "internalType": "address", - "name": "", + "name": "_account", "type": "address" } ], - "name": "numCheckpoints", + "name": "earned", "outputs": [ { - "internalType": "uint32", + "internalType": "uint256", "name": "", - "type": "uint32" + "type": "uint256" } ], "stateMutability": "view", @@ -21029,74 +21495,25 @@ "inputs": [ { "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", + "name": "_staker", "type": "address" - }, - { - "internalType": "uint256", - "name": "rawAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" } ], - "name": "permit", + "name": "exit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "minter_", - "type": "address" - } - ], - "name": "setMinter", + "inputs": [], + "name": "getReward", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", + "name": "getRewardForDuration", "outputs": [ { "internalType": "uint256", @@ -21111,129 +21528,67 @@ "inputs": [ { "internalType": "address", - "name": "dst", + "name": "_staker", "type": "address" - }, - { - "internalType": "uint256", - "name": "rawAmount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" } ], + "name": "getRewardFromVault", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "internalType": "address", - "name": "dst", - "type": "address" - }, - { - "internalType": "uint256", - "name": "rawAmount", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "transferFrom", + "name": "getRoleAdmin", "outputs": [ { - "internalType": "bool", + "internalType": "bytes32", "name": "", - "type": "bool" + "type": "bytes32" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "DAI": { - "address": "0x118a4238E4086FAE2621D0336C0E6cdC1257BE82", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "index", "type": "uint256" } ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, + "name": "getRoleMember", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "to", + "name": "", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" } ], - "name": "Transfer", - "type": "event" + "stateMutability": "view", + "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "allowance", + "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", @@ -21247,72 +21602,66 @@ { "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "account", + "type": "address" } ], + "name": "grantRole", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", "name": "account", "type": "address" } ], - "name": "balanceOf", + "name": "hasRole", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "decimals", + "name": "lastUpdateTime", "outputs": [ { - "internalType": "uint8", + "internalType": "uint256", "name": "", - "type": "uint8" + "type": "uint256" } ], "stateMutability": "view", @@ -21320,78 +21669,49 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, { "internalType": "uint256", - "name": "subtractedValue", + "name": "_a", "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" }, { "internalType": "uint256", - "name": "addedValue", + "name": "_b", "type": "uint256" } ], - "name": "increaseAllowance", + "name": "min", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, { "internalType": "uint256", - "name": "_amount", + "name": "_reward", "type": "uint256" } ], - "name": "mint", + "name": "notifyRewardAmount", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "name", + "name": "owner", "outputs": [ { - "internalType": "string", + "internalType": "address", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", @@ -21399,12 +21719,12 @@ }, { "inputs": [], - "name": "symbol", + "name": "paused", "outputs": [ { - "internalType": "string", + "internalType": "bool", "name": "", - "type": "string" + "type": "bool" } ], "stateMutability": "view", @@ -21412,7 +21732,7 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "periodFinish", "outputs": [ { "internalType": "uint256", @@ -21427,98 +21747,71 @@ "inputs": [ { "internalType": "address", - "name": "recipient", + "name": "_tokenAddress", "type": "address" }, { "internalType": "uint256", - "name": "amount", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "name": "recoverERC20", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "inputs": [], + "name": "renounceOwnership", + "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "DAIOracle": { - "address": "0xb50365a53EB0d8f214FFD0Cc0F2936BD877B3e17", - "abi": [ + }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "_aggregator", + "name": "account", "type": "address" } ], + "name": "renounceRole", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { "inputs": [], - "name": "getLatestAnswer", + "name": "rewardPerToken", "outputs": [ { - "internalType": "int256", + "internalType": "uint256", "name": "", - "type": "int256" + "type": "uint256" } ], "stateMutability": "view", @@ -21526,32 +21819,12 @@ }, { "inputs": [], - "name": "getLatestRound", + "name": "rewardPerTokenStored", "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, { "internalType": "uint256", "name": "", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], "stateMutability": "view", @@ -21559,7 +21832,7 @@ }, { "inputs": [], - "name": "getLatestTimestamp", + "name": "rewardRate", "outputs": [ { "internalType": "uint256", @@ -21573,31 +21846,12 @@ { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousAnswer", - "outputs": [ - { - "internalType": "int256", + "internalType": "address", "name": "", - "type": "int256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "type": "address" } ], - "name": "getPreviousTimestamp", + "name": "rewards", "outputs": [ { "internalType": "uint256", @@ -21609,39 +21863,13 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", + "inputs": [], + "name": "rewardsDuration", "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, { "internalType": "uint256", "name": "", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], "stateMutability": "view", @@ -21649,10 +21877,10 @@ }, { "inputs": [], - "name": "owner", + "name": "rewardsToken", "outputs": [ { - "internalType": "address", + "internalType": "contract IERC20", "name": "", "type": "address" } @@ -21661,8 +21889,14 @@ "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", + "inputs": [ + { + "internalType": "uint256", + "name": "_rewardsDuration", + "type": "uint256" + } + ], + "name": "setRewardsDuration", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -21671,32 +21905,31 @@ "inputs": [ { "internalType": "address", - "name": "_aggregator", + "name": "_staker", "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "setReferenceContract", + "name": "stake", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", + "inputs": [], + "name": "totalSupply", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -21711,96 +21944,127 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "DAIRewardHandler": { - "address": "0x423eDDfAA00fE22945739070BB911AcBF1fDf4D4", - "abi": [ + }, { "inputs": [ { "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardsToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_vault", + "name": "", "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "name": "userRewardPerTokenPaid", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "vault", + "outputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "Paused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "token", + "name": "_staker", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "reward", + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "DAIVaultHandler": { + "address": "0x7fF4580aD66a3C0F62DDa843674A3811ac062211", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" } ], - "name": "RewardAdded", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, @@ -21808,30 +22072,48 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", "type": "address" }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_amount", "type": "uint256" } ], - "name": "RewardPaid", + "name": "CollateralAdded", "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", - "name": "newDuration", + "name": "_amount", "type": "uint256" } ], - "name": "RewardsDurationUpdated", + "name": "CollateralRemoved", "type": "event" }, { @@ -21839,49 +22121,37 @@ "inputs": [ { "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" + "internalType": "address", + "name": "_owner", + "type": "address" }, { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" } ], - "name": "RoleAdminChanged", + "name": "NewBurnFee", "type": "event" }, { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "name": "RoleGranted", + "name": "NewLiquidationPenalty", "type": "event" }, { @@ -21889,24 +22159,37 @@ "inputs": [ { "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "_owner", + "type": "address" }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" }, { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "sender", + "name": "_tresury", "type": "address" } ], - "name": "RoleRevoked", + "name": "NewTreasury", "type": "event" }, { @@ -21915,17 +22198,17 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "previousOwner", "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "Staked", + "name": "OwnershipTransferred", "type": "event" }, { @@ -21938,298 +22221,235 @@ "type": "address" } ], - "name": "Unpaused", + "name": "Paused", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "user", + "name": "_token", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "Withdrawn", + "name": "Recovered", "type": "event" }, { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "bytes32", - "name": "", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "account", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "account", "type": "address" - } - ], - "name": "earned", - "outputs": [ + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_staker", + "name": "_owner", "type": "address" - } - ], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getRewardForDuration", - "outputs": [ + }, { + "indexed": true, "internalType": "uint256", - "name": "", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "TokensBurned", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_staker", + "name": "_owner", "type": "address" - } - ], - "name": "getRewardFromVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" }, { + "indexed": true, "internalType": "uint256", - "name": "index", + "name": "_id", "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "TokensMinted", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { + "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unpaused", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { + "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastUpdateTime", - "outputs": [ + }, { + "indexed": true, "internalType": "uint256", - "name": "", + "name": "_id", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "VaultCreated", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "uint256", - "name": "_a", + "name": "_vaultId", "type": "uint256" }, { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "_b", + "name": "_liquidationCollateral", "type": "uint256" - } - ], - "name": "min", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_reward", "type": "uint256" } ], - "stateMutability": "pure", - "type": "function" + "name": "VaultLiquidated", + "type": "event" }, { - "inputs": [ + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ { - "internalType": "uint256", - "name": "_reward", - "type": "uint256" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "notifyRewardAmount", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "ETHPriceOracle", "outputs": [ { - "internalType": "address", + "internalType": "contract ChainlinkOracle", "name": "", "type": "address" } @@ -22239,12 +22459,12 @@ }, { "inputs": [], - "name": "paused", + "name": "MAX_FEE", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", @@ -22252,7 +22472,7 @@ }, { "inputs": [], - "name": "periodFinish", + "name": "MIN_RATIO", "outputs": [ { "internalType": "uint256", @@ -22264,1671 +22484,161 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_tokenAddress", - "type": "address" - }, + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { "internalType": "uint256", - "name": "_tokenAmount", + "name": "price", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerToken", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerTokenStored", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardRate", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "rewards", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardsDuration", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardsToken", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_rewardsDuration", - "type": "uint256" - } - ], - "name": "setRewardsDuration", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_staker", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "stake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userRewardPerTokenPaid", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "vault", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_staker", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "DAIVaultHandler": { - "address": "0x7fF4580aD66a3C0F62DDa843674A3811ac062211", - "abi": [ - { - "inputs": [ - { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_divisor", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardHandler", - "type": "address" - }, - { - "internalType": "address", - "name": "_treasury", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "CollateralAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "CollateralRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - } - ], - "name": "NewBurnFee", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" - } - ], - "name": "NewLiquidationPenalty", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - } - ], - "name": "NewRatio", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_tresury", - "type": "address" - } - ], - "name": "NewTreasury", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "_token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "TokensBurned", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "TokensMinted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Unpaused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - } - ], - "name": "VaultCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "_liquidator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_reward", - "type": "uint256" - } - ], - "name": "VaultLiquidated", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ETHPriceOracle", - "outputs": [ - { - "internalType": "contract ChainlinkOracle", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_FEE", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_RATIO", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TCAPPrice", - "outputs": [ - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TCAPToken", - "outputs": [ - { - "internalType": "contract TCAP", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "addCollateral", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "burnFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "collateralContract", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "collateralPriceOracle", - "outputs": [ - { - "internalType": "contract ChainlinkOracle", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "counter", - "outputs": [ - { - "internalType": "uint256", - "name": "_value", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "createVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "divisor", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "getFee", - "outputs": [ - { - "internalType": "uint256", - "name": "fee", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", - "type": "address" - } - ], - "name": "getOraclePrice", - "outputs": [ - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_id", - "type": "uint256" - } - ], - "name": "getVault", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "getVaultRatio", - "outputs": [ - { - "internalType": "uint256", - "name": "currentRatio", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_maxTCAP", - "type": "uint256" - } - ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "liquidationPenalty", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "liquidationReward", - "outputs": [ - { - "internalType": "uint256", - "name": "rewardCollateral", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "oracleDigits", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ratio", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_tokenAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_tokenAmount", - "type": "uint256" - } - ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "removeCollateral", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "requiredCollateral", - "outputs": [ - { - "internalType": "uint256", - "name": "collateral", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "requiredLiquidationTCAP", - "outputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardHandler", - "outputs": [ - { - "internalType": "contract IRewardHandler", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - } - ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" - } - ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - } - ], - "name": "setRatio", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_treasury", - "type": "address" - } - ], - "name": "setTreasury", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "tcapOracle", - "outputs": [ - { - "internalType": "contract ChainlinkOracle", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "treasury", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userToVault", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "vaults", - "outputs": [ - { - "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Debt", - "type": "uint256" - }, - { - "internalType": "address", - "name": "Owner", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ] - }, - "DelegatorFactory": { - "address": "0x0aafdB19021a3a87A510dD4db7dce62318b49Cd1", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "stakingToken_", - "type": "address" - }, - { - "internalType": "address", - "name": "rewardsToken_", - "type": "address" - }, - { - "internalType": "uint256", - "name": "waitTime_", - "type": "uint256" - }, - { - "internalType": "address", - "name": "timelock_", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "delegatee", - "type": "address" - } - ], - "name": "DelegatorCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_amount", "type": "uint256" } ], - "name": "RewardAdded", - "type": "event" + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_amount", "type": "uint256" } ], - "name": "RewardPaid", - "type": "event" + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "burnFee", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "newDuration", + "name": "", "type": "uint256" } ], - "name": "RewardsDurationUpdated", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "collateralContract", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "delegator", + "internalType": "contract IERC20", + "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "delegatee", + "internalType": "contract ChainlinkOracle", + "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_value", "type": "uint256" } ], - "name": "Staked", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "waitTime", + "name": "", "type": "uint256" } ], - "name": "WaitTimeUpdated", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "delegator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "delegatee", - "type": "address" - }, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "fee", "type": "uint256" } ], - "name": "Withdrawn", - "type": "event" + "stateMutability": "view", + "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "account_", + "internalType": "contract ChainlinkOracle", + "name": "_oracle", "type": "address" } ], - "name": "balanceOf", + "name": "getOraclePrice", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "price", "type": "uint256" } ], @@ -23938,25 +22648,36 @@ { "inputs": [ { - "internalType": "address", - "name": "delegatee_", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "createDelegator", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" } ], - "name": "delegateeToDelegator", + "name": "getRoleMember", "outputs": [ { "internalType": "address", @@ -23970,17 +22691,17 @@ { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "delegatorToDelegatee", + "name": "getRoleMemberCount", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -23989,17 +22710,32 @@ { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" } ], - "name": "delegators", + "name": "getVault", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" } ], "stateMutability": "view", @@ -24008,16 +22744,16 @@ { "inputs": [ { - "internalType": "address", - "name": "account_", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" } ], - "name": "earned", + "name": "getVaultRatio", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "currentRatio", "type": "uint256" } ], @@ -24025,41 +22761,68 @@ "type": "function" }, { - "inputs": [], - "name": "getReward", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "getRewardForDuration", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", "type": "uint256" } ], - "stateMutability": "view", + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "lastUpdateTime", + "name": "liquidationPenalty", "outputs": [ { "internalType": "uint256", @@ -24074,47 +22837,42 @@ "inputs": [ { "internalType": "uint256", - "name": "a_", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "b_", + "name": "_vaultId", "type": "uint256" } ], - "name": "min", + "name": "liquidationReward", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "rewardCollateral", "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "reward_", + "name": "_amount", "type": "uint256" } ], - "name": "notifyRewardAmount", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "oracleDigits", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -24122,12 +22880,12 @@ }, { "inputs": [], - "name": "periodFinish", + "name": "owner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -24135,19 +22893,19 @@ }, { "inputs": [], - "name": "renounceOwnership", + "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "rewardPerToken", + "name": "paused", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", @@ -24155,7 +22913,7 @@ }, { "inputs": [], - "name": "rewardPerTokenStored", + "name": "ratio", "outputs": [ { "internalType": "uint256", @@ -24167,31 +22925,74 @@ "type": "function" }, { - "inputs": [], - "name": "rewardRate", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "_tokenAmount", "type": "uint256" } ], - "stateMutability": "view", + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "name": "rewards", + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "collateral", "type": "uint256" } ], @@ -24199,24 +23000,48 @@ "type": "function" }, { - "inputs": [], - "name": "rewardsDuration", + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], - "name": "rewardsToken", + "name": "rewardHandler", "outputs": [ { - "internalType": "address", + "internalType": "contract IRewardHandler", "name": "", "type": "address" } @@ -24228,29 +23053,24 @@ "inputs": [ { "internalType": "uint256", - "name": "rewardsDuration_", + "name": "_burnFee", "type": "uint256" } ], - "name": "setRewardsDuration", + "name": "setBurnFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "delegator_", - "type": "address" - }, { "internalType": "uint256", - "name": "amount_", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "stake", + "name": "setLiquidationPenalty", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -24258,48 +23078,56 @@ { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" } ], - "name": "stakerWaitTime", - "outputs": [ + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_treasury", + "type": "address" } ], - "stateMutability": "view", + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "stakingToken", + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "totalSupply", + "name": "tcapOracle", "outputs": [ { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -24319,14 +23147,21 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "treasury", + "outputs": [ { - "internalType": "uint256", - "name": "waitTime_", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "updateWaitTime", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -24339,7 +23174,7 @@ "type": "address" } ], - "name": "userRewardPerTokenPaid", + "name": "userToVault", "outputs": [ { "internalType": "uint256", @@ -24351,40 +23186,43 @@ "type": "function" }, { - "inputs": [], - "name": "waitTime", - "outputs": [ + "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "name": "vaults", + "outputs": [ { - "internalType": "address", - "name": "delegator_", - "type": "address" + "internalType": "uint256", + "name": "Id", + "type": "uint256" }, { "internalType": "uint256", - "name": "amount_", + "name": "Collateral", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" } ] }, "ETHLiquidityReward": { - "address": "0x06e4F32A5f3bD64C4c620644d107601368BfCb27", + "address": "0xDCDF84255652205debfc9c2603BF28F13597BD82", "abi": [ { "inputs": [ @@ -29280,7 +28118,7 @@ ] }, "WBTC": { - "address": "0x200534AA6A1c47102C09232347373499B983D6EF", + "address": "0x81A345e4627C614DaBA4E862A8c317023E935506", "abi": [ { "inputs": [], diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 99e6e44..a51082a 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -366,7 +366,8 @@ export const validVaults = (chainId: number, vaults: VaultsContext): boolean => valid && !isUndefined(vaults.wethVaultRead) && !isUndefined(vaults.aaveVaultRead) && - !isUndefined(vaults.linkVaultRead); + !isUndefined(vaults.linkVaultRead) && + !isUndefined(vaults.wbtcVaultRead); } if (isOptimism(chainId)) { valid = From e829dcaae050c5d15d3cfd746cf8d1ed612cf9fb Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 10 Mar 2022 17:14:01 -0600 Subject: [PATCH 058/278] adding usd values on liquidate form --- src/components/Vault/Monitoring/Liquidate.tsx | 94 ++++++++++++++----- src/styles/modal.scss | 12 ++- 2 files changed, 83 insertions(+), 23 deletions(-) diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index 8b1fdca..6b5e219 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -1,13 +1,15 @@ import React, { useContext, useEffect, useState } from "react"; import { Button, Form } from "react-bootstrap"; import { ethers, BigNumber } from "ethers"; +import InputGroup from "react-bootstrap/esm/InputGroup"; import Modal from "react-bootstrap/esm/Modal"; import NumberFormat from "react-number-format"; import "../../../styles/modal.scss"; import NetworkContext from "../../../state/NetworkContext"; import SignerContext from "../../../state/SignerContext"; import VaultContext from "../../../state/VaultsContext"; -import { errorNotification, notifyUser } from "../../../utils/utils"; +import OracleContext from "../../../state/OraclesContext"; +import { errorNotification, notifyUser, toUSD } from "../../../utils/utils"; import { NETWORKS } from "../../../utils/constants"; type props = { @@ -23,10 +25,14 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } const currentNetwork = useContext(NetworkContext); const signer = useContext(SignerContext); const vaults = useContext(VaultContext); + const oracles = useContext(OracleContext); const [currentVault, setCurrentVault] = useState(); + const [tcapPrice, setTcapPrice] = useState("0"); const [requiredTcap, setRequiredTcap] = useState("0"); const [maxTcap, setMaxTcap] = useState("0"); + const [maxTcapUSD, setMaxTcapUSD] = useState("0"); const [reward, setReward] = useState("0"); + const [rewardUSD, setRewardUSD] = useState("0"); const [liquidationFee, setLiquidationFee] = useState("0"); const [canLiquidate, setCanLiquidate] = useState(true); @@ -35,57 +41,75 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } if (currentAddress !== "" && vaults) { let cVault = vaults.wethVault; let cVaultRead = vaults.wethVaultRead; + let oracleRead = oracles.wethOracleRead; switch (vaultType) { case "DAI": cVault = vaults.daiVault; cVaultRead = vaults.daiVaultRead; + oracleRead = oracles.daiOracleRead; break; case "AAVE": cVault = vaults.aaveVault; cVaultRead = vaults.aaveVaultRead; + oracleRead = oracles.aaveOracleRead; break; case "LINK": cVault = vaults.linkVault; cVaultRead = vaults.linkVaultRead; + oracleRead = oracles.linkOracleRead; break; case "SNX": cVault = vaults.snxVault; cVaultRead = vaults.snxVaultRead; + oracleRead = oracles.snxOracleRead; break; case "UNI": cVault = vaults.uniVault; cVaultRead = vaults.uniVaultRead; + oracleRead = oracles.uniOracleRead; break; case "MATIC": cVault = vaults.maticVault; cVaultRead = vaults.maticVaultRead; + oracleRead = oracles.maticOracleRead; break; case "WBTC": cVault = vaults.wbtcVault; cVaultRead = vaults.wbtcVaultRead; + oracleRead = oracles.wbtcOracleRead; break; default: cVault = vaults.wethVault; cVaultRead = vaults.wethVaultRead; + oracleRead = oracles.wethOracleRead; break; } if (vaultId !== "" && cVault && cVaultRead) { setCurrentVault(cVault); + const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); + const oraclePriceCall = await oracleRead?.getLatestAnswer(); // @ts-ignore - const [reqTcap, liqReward] = await signer.ethcallProvider?.all([ - reqTcapCall, - liqRewardCall, - ]); + const [tcapOraclePrice, reqTcap, liqReward, collateralPrice] = + await signer.ethcallProvider?.all([ + tcapPriceCall, + reqTcapCall, + liqRewardCall, + oraclePriceCall, + ]); + const tcapPriceText = ethers.utils.formatEther(tcapOraclePrice); const reqTcapText = ethers.utils.formatEther(reqTcap); const liqRewardText = ethers.utils.formatEther(liqReward); - + const priceText = ethers.utils.formatEther(collateralPrice.mul(10000000000)); const currentLiqFee = await cVault?.getFee(reqTcap); const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); + + setTcapPrice(tcapPriceText); setRequiredTcap(reqTcapText); setReward(liqRewardText); + setRewardUSD(toUSD(liqRewardText, priceText).toFixed(2)); setLiquidationFee(ethFee.toString()); } } @@ -96,11 +120,13 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } const onChangeMaxTcap = (event: React.ChangeEvent) => { setMaxTcap(event.target.value); + setMaxTcapUSD(toUSD(event.target.value, tcapPrice).toFixed(2)); }; const minTcap = async (e: React.MouseEvent) => { e.preventDefault(); setMaxTcap(requiredTcap); + setMaxTcapUSD(toUSD(requiredTcap, tcapPrice).toFixed(2)); }; const liquidate = async (event: React.MouseEvent) => { @@ -161,25 +187,51 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } MIN REQUIRED - -
- - Reward:{" "} + + + {" "} - {vaultType === "WETH" ? "ETH" : vaultType} + prefix="$" + decimalScale={2} + /> + +
+ +
+ Reward:{" "} + {" "} + {vaultType === "WETH" ? "ETH" : vaultType} +
+
+ USD:{" "} + +
+
+ Burn Fee:{" "} Date: Sat, 12 Mar 2022 14:26:07 -0600 Subject: [PATCH 059/278] sorting, status explanation and usd reward --- src/assets/images/sort-down.svg | 1 + src/assets/images/sort-up.svg | 1 + src/assets/images/sort.svg | 1 + src/components/Vault/Monitoring/Liquidate.tsx | 4 +- src/components/Vault/Monitoring/common.tsx | 23 +++ src/components/Vault/Monitoring/index.tsx | 1 + src/components/Vault/Monitoring/vaults.tsx | 139 +++++++++++++++++- src/styles/app.scss | 19 ++- src/styles/modal.scss | 4 + src/styles/vault-monitoring.scss | 20 ++- 10 files changed, 203 insertions(+), 10 deletions(-) create mode 100644 src/assets/images/sort-down.svg create mode 100644 src/assets/images/sort-up.svg create mode 100644 src/assets/images/sort.svg diff --git a/src/assets/images/sort-down.svg b/src/assets/images/sort-down.svg new file mode 100644 index 0000000..0921ab7 --- /dev/null +++ b/src/assets/images/sort-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/sort-up.svg b/src/assets/images/sort-up.svg new file mode 100644 index 0000000..2c1361f --- /dev/null +++ b/src/assets/images/sort-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/sort.svg b/src/assets/images/sort.svg new file mode 100644 index 0000000..8d89467 --- /dev/null +++ b/src/assets/images/sort.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index 6b5e219..5e0a52a 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -220,9 +220,9 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } {vaultType === "WETH" ? "ETH" : vaultType}
- USD:{" "} + USD:{" "} + parseFloat(a.collateralValue) - parseFloat(b.collateralValue); + +export const sortCollateralDesc = (a: VaultsType, b: VaultsType) => + parseFloat(b.collateralValue) - parseFloat(a.collateralValue); + +export const sortCollateralUsdAsc = (a: VaultsType, b: VaultsType) => + parseFloat(a.collateralUsd) - parseFloat(b.collateralUsd); + +export const sortCollateralUsdDesc = (a: VaultsType, b: VaultsType) => + parseFloat(b.collateralUsd) - parseFloat(a.collateralUsd); + +export const sortDebtAsc = (a: VaultsType, b: VaultsType) => + parseFloat(a.collateralValue) - parseFloat(b.collateralValue); + +export const sortDebtDesc = (a: VaultsType, b: VaultsType) => + parseFloat(b.debt) - parseFloat(a.debt); + +export const sortRatioAsc = (a: VaultsType, b: VaultsType) => a.ratio - b.ratio; + +export const sortRatioDesc = (a: VaultsType, b: VaultsType) => b.ratio - a.ratio; diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index c0978f0..3134311 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -695,6 +695,7 @@ export const Monitoring = () => { ) => setVaultList(v)} pagination={pagination} refresh={updateLiquidatedVault} /> diff --git a/src/components/Vault/Monitoring/vaults.tsx b/src/components/Vault/Monitoring/vaults.tsx index 377dfb0..d793f74 100644 --- a/src/components/Vault/Monitoring/vaults.tsx +++ b/src/components/Vault/Monitoring/vaults.tsx @@ -4,22 +4,42 @@ import Table from "react-bootstrap/Table"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; +import { ReactComponent as SortIcon } from "../../../assets/images/sort.svg"; +import { ReactComponent as SortUpIcon } from "../../../assets/images/sort-up.svg"; +import { ReactComponent as SortDownIcon } from "../../../assets/images/sort-down.svg"; import Liquidate from "./Liquidate"; import { PaginationType, VaultsType } from "./types"; -import { capitalize, CollateralIcon, numberFormatStr } from "./common"; +import { + capitalize, + CollateralIcon, + numberFormatStr, + sortCollateralDesc, + sortCollateralAsc, + sortCollateralUsdDesc, + sortCollateralUsdAsc, + sortDebtDesc, + sortDebtAsc, + sortRatioDesc, + sortRatioAsc, +} from "./common"; type dataType = { currentAddress: string; vaults: Array; + setVaults: (v: Array) => void; pagination: PaginationType; refresh: (index: number, symbol: string) => void; }; -export const Vaults = ({ currentAddress, vaults, pagination, refresh }: dataType) => { +export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh }: dataType) => { const [showLiquidate, setShowLiquidate] = useState(false); const [vaultIndex, setVaultIndex] = useState(-1); const [vaultId, setVaultId] = useState(""); const [vaultType, setVaultType] = useState(""); + const [collateralSort, setCollateralSort] = useState(0); + const [collateralUsdSort, setCollateralUsdSort] = useState(0); + const [debtSort, setDebtSort] = useState(0); + const [ratioSort, setRatioSort] = useState(0); const liquidateVault = (index: number, id: string, type: string) => { setVaultId(id); @@ -28,21 +48,128 @@ export const Vaults = ({ currentAddress, vaults, pagination, refresh }: dataType setShowLiquidate(true); }; + const resetSortTypes = (current: number) => { + if (current !== 1) { + setCollateralSort(0); + } + if (current !== 2) { + setCollateralUsdSort(0); + } + if (current !== 3) { + setDebtSort(0); + } + if (current !== 4) { + setRatioSort(0); + } + }; + + const onSortCollateralClick = () => { + const sortType = collateralSort === 1 ? 2 : 1; + if (sortType === 1) { + setVaults(vaults.sort(sortCollateralDesc)); + } else { + setVaults(vaults.sort(sortCollateralAsc)); + } + setCollateralSort(sortType); + resetSortTypes(1); + }; + + const onSortCollateralUsdClick = () => { + const sortType = collateralUsdSort === 1 ? 2 : 1; + if (sortType === 1) { + setVaults(vaults.sort(sortCollateralUsdDesc)); + } else { + setVaults(vaults.sort(sortCollateralUsdAsc)); + } + setCollateralUsdSort(sortType); + resetSortTypes(2); + }; + + const onSortDebtClick = () => { + const sortType = debtSort === 1 ? 2 : 1; + if (sortType === 1) { + setVaults(vaults.sort(sortDebtDesc)); + } else { + setVaults(vaults.sort(sortDebtAsc)); + } + setDebtSort(sortType); + resetSortTypes(3); + }; + + const onSortRatioClick = () => { + const sortType = ratioSort === 1 ? 2 : 1; + if (sortType === 1) { + setVaults(vaults.sort(sortRatioDesc)); + } else { + setVaults(vaults.sort(sortRatioAsc)); + } + setRatioSort(sortType); + resetSortTypes(4); + }; + + const sortingIncon = (sortOrder: number) => { + if (sortOrder === 0) { + return ; + } + if (sortOrder === 1) { + return ; + } + return ; + }; + return ( <> - - - + + + - + diff --git a/src/styles/app.scss b/src/styles/app.scss index 97d6275..e465e14 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -263,7 +263,24 @@ html, text-align: left; padding: 0.8rem; } - +.vaults-status-tooltip > .tooltip-inner { + min-width: 400px; + width: 400px; + text-align: left; + padding: 0.9rem; + .empty { + text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; + } + .ready { + text-shadow: 0 0 4px #167226,0 0 10px #61c4b3,0 0 20px #167226,0 -10px 40px #167226; + } + .active { + text-shadow: 0 0 4px #e440f2,0 0 10px #e98ff1,0 0 20px #e440f2,0 -10px 40px #b626c4; + } + .liquidation { + text-shadow: 0 0 4px #c33,0 0 10px rgb(236, 97, 97),0 0 20px #c33,0 -10px 40px #c33; + } +} .vaults-tooltip > .tooltip-inner { width: auto; text-align: right; diff --git a/src/styles/modal.scss b/src/styles/modal.scss index 7d9b58b..96daedc 100644 --- a/src/styles/modal.scss +++ b/src/styles/modal.scss @@ -108,6 +108,10 @@ display: flex; margin-top: 5px; justify-content: space-between; + + .reward-usd { + padding-left: 25px; + } } input[type="text"].neon-green { diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 7febe26..4ac9341 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -129,6 +129,10 @@ text-align: right; font-size: 0.8rem; } + .btn { + margin-top: 0px; + padding: 0.3rem 0.6rem; + } thead { th { text-align: center; @@ -140,7 +144,7 @@ text-align: right; } .collateral { - padding-right: 60px; + padding-right: 40px; } .debt { display: flex; @@ -152,6 +156,20 @@ margin-right: 10px; } } + .sort { + background-color: transparent; + border: 0 solid transparent; + padding-right: 0px; + svg { + color: $white; + } + .asc { + margin-top: 5px; + } + .desc { + margin-top: -8px; + } + } } tbody { div { From 3f328c9fe8d23006a27b7b49ce2d85e1c2a2b7cc Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sat, 12 Mar 2022 15:04:58 -0600 Subject: [PATCH 060/278] clear usd tcap aftere close modal --- src/components/Vault/Monitoring/Liquidate.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index 5e0a52a..975b5d5 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -169,7 +169,8 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } aria-labelledby="contained-modal-title-vcenter" centered onHide={() => { - setMaxTcap(""); + setMaxTcap("0"); + setMaxTcapUSD("0"); onHide(); }} > From a47a225f6ed5d59aa44789f9caca3bf42fa08c35 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 14 Mar 2022 16:21:40 -0600 Subject: [PATCH 061/278] addeed validation when liquidating vault --- src/components/Vault/Details.tsx | 7 +++ src/components/Vault/Monitoring/Liquidate.tsx | 60 ++++++++++++------- 2 files changed, 45 insertions(+), 22 deletions(-) diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index 934cbf2..77d3210 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -83,6 +83,13 @@ const Details = ({ address, t }: props) => { currency = "MATIC"; } break; + case "wbtc": + currency = "WBTC"; + if (isOptimism(currentNetwork.chainId)) { + history?.push(`/vault/ETH`); + currency = "ETH"; + } + break; case "dai": currency = "DAI"; break; diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index 975b5d5..aef1111 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -7,8 +7,9 @@ import NumberFormat from "react-number-format"; import "../../../styles/modal.scss"; import NetworkContext from "../../../state/NetworkContext"; import SignerContext from "../../../state/SignerContext"; -import VaultContext from "../../../state/VaultsContext"; import OracleContext from "../../../state/OraclesContext"; +import TokensContext from "../../../state/TokensContext"; +import VaultContext from "../../../state/VaultsContext"; import { errorNotification, notifyUser, toUSD } from "../../../utils/utils"; import { NETWORKS } from "../../../utils/constants"; @@ -24,9 +25,11 @@ type props = { const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh }: props) => { const currentNetwork = useContext(NetworkContext); const signer = useContext(SignerContext); - const vaults = useContext(VaultContext); const oracles = useContext(OracleContext); + const vaults = useContext(VaultContext); + const tokens = useContext(TokensContext); const [currentVault, setCurrentVault] = useState(); + const [tcapBalance, setTcapBalance] = useState("0"); const [tcapPrice, setTcapPrice] = useState("0"); const [requiredTcap, setRequiredTcap] = useState("0"); const [maxTcap, setMaxTcap] = useState("0"); @@ -86,18 +89,21 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } } if (vaultId !== "" && cVault && cVaultRead) { setCurrentVault(cVault); + const tcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(currentAddress); const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); const oraclePriceCall = await oracleRead?.getLatestAnswer(); // @ts-ignore - const [tcapOraclePrice, reqTcap, liqReward, collateralPrice] = + const [balance, tcapOraclePrice, reqTcap, liqReward, collateralPrice] = await signer.ethcallProvider?.all([ + tcapBalanceCall, tcapPriceCall, reqTcapCall, liqRewardCall, oraclePriceCall, ]); + const tcapBalanceText = ethers.utils.formatEther(balance); const tcapPriceText = ethers.utils.formatEther(tcapOraclePrice); const reqTcapText = ethers.utils.formatEther(reqTcap); const liqRewardText = ethers.utils.formatEther(liqReward); @@ -106,6 +112,9 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); + console.log("---- Balance ----"); + console.log(tcapBalanceText); + setTcapBalance(tcapBalanceText); setTcapPrice(tcapPriceText); setRequiredTcap(reqTcapText); setReward(liqRewardText); @@ -133,27 +142,34 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } event.preventDefault(); if (currentAddress && canLiquidate && currentVault) { setCanLiquidate(false); - if (maxTcap && parseFloat(maxTcap) > 0) { - if (parseFloat(maxTcap) >= parseFloat(requiredTcap)) { - try { - const currentLiqFee = await currentVault?.getFee(ethers.utils.parseEther(requiredTcap)); - const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setLiquidationFee(ethFee); - const tx = await currentVault.liquidateVault( - BigNumber.from(vaultId), - ethers.utils.parseEther(maxTcap), - { value: increasedFee } - ); - notifyUser(tx, refresh); - refresh(); - setMaxTcap(""); - onHide(); - } catch (error) { - errorNotification("Burn fee less than required."); + const maxAmountTcap = parseFloat(maxTcap); + if (maxTcap && maxAmountTcap > 0) { + if (maxAmountTcap >= parseFloat(requiredTcap)) { + if (maxAmountTcap <= parseFloat(tcapBalance)) { + try { + const currentLiqFee = await currentVault?.getFee( + ethers.utils.parseEther(requiredTcap) + ); + const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setLiquidationFee(ethFee); + const tx = await currentVault.liquidateVault( + BigNumber.from(vaultId), + ethers.utils.parseEther(maxTcap), + { value: increasedFee } + ); + notifyUser(tx, refresh); + refresh(); + setMaxTcap(""); + onHide(); + } catch (error) { + errorNotification("Burn fee less than required."); + } + } else { + errorNotification("Not enough TCAP balance."); } } else { - errorNotification("Tcap amount is less than required"); + errorNotification("Tcap amount is less than required."); } } else { errorNotification("Field can't be empty"); From 351bb586cc42b2dd9635d60dba41941748d85590 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 14 Mar 2022 16:24:06 -0600 Subject: [PATCH 062/278] cleaning console.log lines --- src/components/Vault/Monitoring/Liquidate.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index aef1111..7546bb1 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -112,8 +112,6 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); - console.log("---- Balance ----"); - console.log(tcapBalanceText); setTcapBalance(tcapBalanceText); setTcapPrice(tcapPriceText); setRequiredTcap(reqTcapText); From ef645486ec1b7c519ecc238547a58725ab77def0 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 14 Mar 2022 16:46:58 -0600 Subject: [PATCH 063/278] French lang added --- public/locales/fr/translation.json | 250 ++++++++++++++--------------- src/components/Header.tsx | 1 + 2 files changed, 123 insertions(+), 128 deletions(-) diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 292eec2..e08f63f 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -1,170 +1,164 @@ { - "balance": "Balance", - "balance2": "Current Balance", - "choose-network": "Choose Network", - "claim": "Claim", - "claim-vest":"Claim Vest", - "click-copy": "Click to Copy", - "connect": "Connect Wallet", - "contract": "Contract", - "create": "Create", + "balance": "Solde", + "balance2": "Solde actuel", + "choose-network": "Choix de réseau", + "claim": "Collecter", + "click-copy": "Cliquer pour copier", + "connect": "Connecter son Wallet", + "contract": "Contrat", + "create": "Créer", "description": "Description", - "exit": "Exit", + "exit": "Quitter", "farm": "Farm", - "history": "History", - "inactive": "Inative", - "infinite-approve": "Infinite Approve", + "history": "Historique", + "inactive": "Inactif", + "infinite-approve": "Approuver à l'infini", "max": "MAX", "max-safe": "MAX SAFE", - "mint": "Mint", - "last": "Last", - "loading": "Loading", + "mint": "Produire", + "last": "Dernier", + "loading": "Chargement", "pool": "Pool", - "stake": "Stake", - "stake2": "Amount to Stake", - "staked": "Staked", + "stake": "Epargner", + "stake2": "Montant à épargner", + "staked": "Epargné", "token": "Token", "tokens": "Tokens", - "trade": "Trade", - "tran-sent": "⏰ Transaction Sent!", - "tran-confirmed": "✔️ Transaction Confirmed!", - "tran-wait": "Plz wait for the transaction confirmation.", - "tran-wait2": "All set, please wait for another confirmation", - "update": "Update", - "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "trade": "Trader", + "tran-sent": "⏰ Transaction envoyée!", + "tran-confirmed": "✔️ Transaction Confirmée!", + "tran-wait": "En attente d'une confirmation de la transaction.", + "tran-wait2": "Tout est prêt, en attente d'une seconde confirmation", + "update": "Actualiser", + "vault-warning": "⚠️ Soyez sûr d'avoir un collatéral au dessus du ratio minimum pour éviter que votre position soit liquidée.", "votes": "Votes", - "wait": "Please wait", - "warning": "This project is in beta. Use at your own risk.", + "wait": "Attendez s'il vous plait...", "welcome": { - "tcap": "Total Cryptocurrency Market Capitalization", - "tcap-token": "Total Cryptocurrency Market Capitalization Token", - "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", - "title1": "My Total Balance", - "subtitle1": "Connected Account", - "title2": "Use TCAP", - "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", - "title3": "Connect Your Account", - "subtitle3": "Mint TCAP, or check your balance connecting your account", - "tcap-balance": "TCAP Balance", - "ctx-balance": "CTX Balance" + "tcap": "Capitalisation boursière totale du marché des crypto-monnaies", + "tcap-token": "Le token de capitalisation boursière totale du marché crypto", + "tcap-info": "La capitalisation boursière totale du marché des crypto-monnaies est actualisée sur la blockchain à chaque mouvement de 1%", + "title1": "Mon solde total", + "subtitle1": "Compte connécté", + "title2": "Utiliser TCAP", + "subtitle2": "Trader TCAP sur SushiSwap ou créer de nouveaux tokens en utilisant le Coffre-fort", + "title3": "Connecter votre compte", + "subtitle3": "Produire du TCAP, ou verifier votre solde en connectant votre compte", + "tcap-balance": "Solde de TCAP", + "ctx-balance": "Solde de CTX" }, "vault": { - "warning": "", - "loading": "Loading Vault", - "title1": "The Vault", - "subtitle1": "Select your Collateral", - "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", - "approve": "Approve Vault", - "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", - "create": "Create Vault", - "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", - "balance-title": "{{vault}} Balance", - "ratio-title": "Vault Ratio", - "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "warning": "Attention", + "loading": "Chargement du Coffre-fort", + "title1": "Le Coffre-fort", + "subtitle1": "Séléctionner votre garantie collatéralisée/collatéral", + "no-connected": "Aucun Wallet connécté. Connectez votre Wallet pour créer un Coffre-fort, approuver votre collatéral et commencer à produire des tokens TCAP", + "approve": "Approuver Coffre-fort", + "approve-text": "Coffre-fort non approuvé. Approuvez votre collatéral pour commencer à produire des tokens TCAP.", + "create": "Créer Coffre-fort", + "create-text": "Aucun Coffre-fort créé. Créez un Coffre-fort et approuvez votre collatéral pour commencer à produire des tokens TCAP.", + "balance-title": "{{vault}} Solde", + "ratio-title": "Proportion de collatéral", + "ratio-warning": "Le ratio de collatéral doit être > {{minRatio}}% ou votre collatéral sera liquidé.", "collateral": { - "title": "Staked Collateral", - "add": "Add Collateral", - "remove": "Remove Collateral" + "title": "Collatéral Bloqué", + "add": "Ajouter du Collatéral", + "remove": "Enlever du Collatéral" }, "debt": { - "title": "Vault Debt", - "mint": "Mint TCAP", - "burn": "Burn TCAP", - "fee": "Burn Fee" + "title": "Dette du Coffre-fort", + "mint": "Créer du TCAP", + "burn": "Bruler du TCAP", + "fee": "Frais pour bruler" }, "status": { "na": "N/A", - "safe": "safe", - "warning": "warning", - "danger": "danger", - "error": "error" + "safe": "Position Sans Danger/En sécurité", + "warning": "Avertissement/Alerte", + "danger": "Position en Danger", + "error": "Erreur" }, "errors": { - "no-collateral": "Not enough collateral on vault", - "burn-too-high": "Burn value too high", - "burn-balance-low": "Burn value is greater than your balance." + "no-collateral": "Pas assez de collatéral dans le Coffre-fort", + "burn-too-high": "La valeur à bruler est trop élevée" } }, "pools": { "pools": "Pools", - "enabled": "Enabled Pools", - "available": "Available Pools", - "liquidity": "Liquidity" + "enabled": "Pools Activés", + "available": "Pools Disponibles", + "liquidity": "Liquidité" }, "farming": { "farming": "Farming", - "minting": "Minting Rewards", - "current-mint": "Current mint", - "current-reward": "Current Reward", - "liquidity": "Liquidity Rewards", - "unlocked": "Unlocked Reward", - "locked": "Locked Reward", - "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", - "unlocked-info": "Available to claim immediately.", - "locked-info": "Rewards are unlocked 6 months after the start of the pool.", - "token-vault": "{{token}} Vault", - "eth-tcap-pool": "ETH/TCAP Pool", - "eth-ctx-pool": "ETH/CTX Pool" + "minting": "Production des récompenses", + "current-mint": "Production Actuelle", + "current-reward": "Récompenses Actuelles", + "liquidity": "Récompenses de liquidité", + "unlocked": "Récompenses Dévérrouillez", + "locked": "Récompenses Vérrouillées", + "current-info": "Les récompenses des premiers investisseurs sont distribuées sur 14 jours pour un total de 500,000 CTX. En supposant que 6500 blocs Ethereum sont validés par jour sur 14 jours (91,000 blocs Ethereum), les récompenses par bloc seraient de 5.4945 CTX distribués entre les débiteurs à chaque bloc. 100% des récompenses seront disponibles immédiatement.", + "unlocked-info": "Disponible pour collecter immédiatement.", + "locked-info": "Les récompenses sont débloquées 6 mois après le début de la pool." }, "governance": { - "amount-stake": "Amount to Stake", - "amount-remove": "Amount to Remove", - "new": "New Crypt Keeper", - "respresented": "Represented", - "stake-reward": "Stake Reward", - "staked-reward": "Staked Reward", - "why-me": "Why me?", + "amount-stake": "Montant à Epargner", + "amount-remove": "Montant à Récupérer", + "new": "Nouveau Gardien de la Crypte", + "respresented": "Représenté", + "stake-reward": "Epargner ses Récompenses", + "staked-reward": "Récompenses Epargnées", + "why-me": "Pourquoi moi?", "expertise": "Expertise", - "delegate-to": "Delegate to Keeper", - "delegating": "Delegating", - "stake-delegate": "Stake & Delegate", - "stake-info": "Stake and Delegate CTX to this Crypt Keeper. Each time you Stake and Delegate, you must wait a minimum of 7 days before you can withdraw.", - "stake-info2": "Approve delegating CTX tokens. You only have to do this once.", - "withdraw": "Withdraw", - "withdrawing": "Withdrawing", - "withdraw-info": "Remove delegated votes from this Crypt Keeper. CTX must be staked and delegated for a minimum of 7 days before you are eligible to withdraw.", - "withdraw-info2": "* Eligible to withdraw on {{date}}", + "delegate-to": "Déléguer au Gardien", + "delegating": "Déléguation", + "stake-delegate": "Épargner & Déléguer", + "stake-info": "Épargner et déléguer vos CTX à ce Gardien de la Crypte. A chaque fois que vous épargnez et déléguez, vous devez attendre un minimum de 7 jours avant de pouvoir retirer vos CTX.", + "stake-info2": "Approuver la délégation de vos CTX tokens. Vous aurez à faire ceci qu'une seul fois.", + "withdraw": "Retirer", + "withdrawing": "Retirage en cours", + "withdraw-info": "Retirer des votes délégués à ce Gardien de la Crypte. Vos CTX doivent être épargnés et délégués pendant un minimum de 7 jours avant de pouvoir les retirer.", + "withdraw-info2": "* Vous pourrez retirer le {{date}}", "form": { - "create": "Create Crypt Keeper", - "keeper": "Keeper eth name or address", - "name": "Name" + "create": "Créer votre identité de Gardien de la Crypte", + "keeper": "Nom ou addresse eth du Gardien", + "name": "Nom" }, "success": { - "title": "Crypt. Keepers", - "message": "Crypt Keeper updated" + "title": "Gardien de la Crypte", + "message": "Gardien de la Crypte mis à jour" }, "errors": { - "creating-keeper": "Error creating keeper.", - "exists": "Crypt Keeper for the address already exists.", - "invalid-amount": "Invalid amount to withdraw", - "invalid-ens-address": "Please enter a valid eth name or address", - "invalid-twitter": "It is not a valid twitter username", - "invalid-discord": "It is not a valid discord id", - "need-to-wait": "Need to wait the minimum staking period", - "too-long": "Field is too long ({{max}} characters max)" + "creating-keeper": "Erreur en créant un Gardien.", + "exists": "Un Gardien avec cette addresse existe déjà.", + "invalid-amount": "Montant invalide à retirer", + "invalid-ens-address": "Veuillez entrer un nom ou une addresse eth valide", + "invalid-twitter": "Ceci n'est pas un nom d'utilisateur twitter valide.", + "invalid-discord": "Ceci n'est pas un identifiant discord valide", + "need-to-wait": "Vous devez attendre le temps/la période d'épargne minimum", + "too-long": "Ce champ est trop long ({{max}} caractères maximum)" } }, "graph": { - "staked-usd": "Total Staked in USD", - "staked-eth": "Total Staked in ETH", - "staked-dai": "Total Staked in DAI", - "staked-aave": "Total Staked in AAVE", - "staked-link": "Total Staked in LINK", - "staked-matic": "Total Staked in MATIC", - "total-supply": "Total Supply", - "tcap-price": "TCAP Price", - "ctx-price": "CTX Price" + "staked-usd": "Total Epargné en USD", + "staked-eth": "Total Epargné en ETH", + "staked-dai": "Total Epargné en DAI", + "staked-aave": "Total Epargné en AAVE", + "staked-link": "Total Epargné en LINK", + "staked-matic": "Total Epargné en MATIC", + "total-supply": "Circulation Totale", + "tcap-price": "Prix du TCAP", + "ctx-price": "Prix du CTX" }, "errors": { - "empty": "Field can't be empty", - "invalid-address": "Please enter a valid address", - "invalid-ens": "Please enter a valid ENS name", - "invalid-file-type": "Invalid file type.", - "invalid-image-size": "Image max size is {{size}} KB", - "no-ctx": "Not enough CTX balance.", - "no-funds": "Insufficient funds to stake", - "not-approve": "Token not Approved", - "tran-rejected": "Transaction rejected", - "unexpected": "Unexpected error" + "empty": "Ces champs ne peuvent être vides", + "invalid-address": "Veuillez entrer une addresse valide", + "invalid-ens": "Veuillez entrer un nom ENS valide", + "invalid-file-type": "Type de fichier invalide.", + "invalid-image-size": "La taille maximale du fichier peut être de {{size}} KB", + "no-ctx": "Solde de CTX insuffisant.", + "no-funds": "Fonds insuffisants pour épargner", + "not-approve": "Tokens non Approuvés", + "tran-rejected": "Transaction rejetée", + "unexpected": "Erreur inattendue" } } \ No newline at end of file diff --git a/src/components/Header.tsx b/src/components/Header.tsx index d8214be..37c0f89 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -207,6 +207,7 @@ const Header = ({ signerAddress, isMobile }: props) => { English + French 繁體中文 From 16785c3366f190296d88ece70959d8e060538fe1 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 16 Mar 2022 10:48:31 -0600 Subject: [PATCH 064/278] woking --- src/App.tsx | 6 +- src/components/Farm.tsx | 1016 ------------------------------------ src/contracts/cryptex.json | 2 +- src/utils/constants.tsx | 5 + 4 files changed, 9 insertions(+), 1020 deletions(-) delete mode 100644 src/components/Farm.tsx diff --git a/src/App.tsx b/src/App.tsx index d001fb1..c14165e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -728,6 +728,9 @@ const App = () => { + + + @@ -738,9 +741,6 @@ const App = () => { - - - diff --git a/src/components/Farm.tsx b/src/components/Farm.tsx deleted file mode 100644 index 251fab7..0000000 --- a/src/components/Farm.tsx +++ /dev/null @@ -1,1016 +0,0 @@ -import React, { useContext, useEffect, useState } from "react"; -import Card from "react-bootstrap/esm/Card"; -import Button from "react-bootstrap/esm/Button"; -import Row from "react-bootstrap/esm/Row"; -import Table from "react-bootstrap/esm/Table"; -import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; -import Tooltip from "react-bootstrap/esm/Tooltip"; -import { ethers } from "ethers"; -import NumberFormat from "react-number-format"; -import { useQuery, gql } from "@apollo/client"; -import SignerContext from "../state/SignerContext"; -import TokensContext from "../state/TokensContext"; -import VaultsContext from "../state/VaultsContext"; -import OraclesContext from "../state/OraclesContext"; -import GovernanceContext from "../state/GovernanceContext"; -import RewardsContext from "../state/RewardsContext"; -import "../styles/farm.scss"; -import { ReactComponent as CtxIcon } from "../assets/images/ctx-coin.svg"; -import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; -import { ReactComponent as WETHIcon } from "../assets/images/graph/weth.svg"; -import { ReactComponent as DAIIcon } from "../assets/images/graph/DAI.svg"; -import Loading from "./Loading"; -import { - notifyUser, - errorNotification, - tsToDateString, - getPriceInUSDFromPair, -} from "../utils/utils"; -import { Stake } from "./modals/Stake"; - -const ctxClaimVestShowDate = new Date(1634511235 * 1000); - -const Farm = () => { - const [address, setAddress] = useState(""); - const [isLoading, setIsLoading] = useState(true); - const [ethRewards, setEthRewards] = useState("0"); - const [daiRewards, setDaiRewards] = useState("0"); - const [ethPoolRewards, setEthPoolRewards] = useState("0.0"); - const [ctxPoolRewards, setCtxPoolRewards] = useState("0.0"); - const [vethPoolRewards, setVEthPoolRewards] = useState("0.0"); - const [vctxPoolRewards, setVCtxPoolRewards] = useState("0.0"); - const [ethDebt, setEthDebt] = useState("0.0"); - const [daiDebt, setDaiDebt] = useState("0.0"); - const [ethPoolStake, setEthPoolStake] = useState("0.0"); - const [ctxPoolStake, setCtxPoolStake] = useState("0.0"); - const [ethPoolBalance, setEthPoolBalance] = useState("0.0"); - const [ctxPoolBalance, setCtxPoolBalance] = useState("0.0"); - const [ethVestAmount, setEthVestAmount] = useState(ethers.BigNumber.from(0)); - const [ctxVestAmount, setCtxVestAmount] = useState(ethers.BigNumber.from(0)); - const [vestingEndTime, setVestingEndTime] = useState(0); - const [ctxVestingEndTime, setCtxVestingEndTime] = useState(0); - const [updateData, setUpdateData] = useState(false); - const signer = useContext(SignerContext); - const tokens = useContext(TokensContext); - const vaults = useContext(VaultsContext); - const oracles = useContext(OraclesContext); - const governance = useContext(GovernanceContext); - const rewards = useContext(RewardsContext); - const [stakeShow, setStakeShow] = useState(false); - const [stakeBalance, setStakeBalance] = useState("0"); - const [selectedPoolTitle, setSelectedPoolTitle] = useState(""); - const [selectedPool, setSelectedPool] = useState(); - const [selectedPoolToken, setSelectedPoolToken] = useState(); - // APY - const [, setEthVaultAPY] = useState("0"); - const [, setDaiVaultAPY] = useState("0"); - const [ethPoolAPY, setEthPoolAPY] = useState("0"); - const [ctxPoolAPY, setCtxPoolAPY] = useState("0"); - - const oneYear = 60 * 60 * 24 * 365; - - const lpURL = "https://app.sushi.com"; - const phase = process.env.REACT_APP_PHASE ? parseInt(process.env.REACT_APP_PHASE) : 0; - - const USER_VAULTS = gql` - query getVault($owner: String!) { - vaults(where: { owner: $owner }) { - id - vaultId - owner - collateral - debt - currentRatio - address - owner - } - } - `; - - async function getAPYFromVaultRewards( - totalTcapDebt: number, - rate: number, - ctxPrice: number, - tcapPrice: number - ) { - const apy = ((rate * oneYear * ctxPrice) / (tcapPrice * totalTcapDebt)) * 100; - return apy.toString(); - } - - async function getAPYFromLPRewards( - rate: number, - LPsStaked: number, - reserves: any, - totalSupplyPool: number, - ctxPrice: number, - ethPrice: number - ) { - const token0Price = await getPriceInUSDFromPair(reserves[0], reserves[1], ethPrice); - const valuePerLPToken = (token0Price * reserves[0] + ethPrice * reserves[1]) / totalSupplyPool; - const apy = ((rate * oneYear * ctxPrice) / (valuePerLPToken * LPsStaked)) * 100; - - if (Number.isNaN(apy)) { - return "0"; - } - - return apy.toString(); - } - - async function setDebt(vaultData: any) { - // TODO: fix if no graph - await vaultData.vaults.forEach((v: any) => { - switch (v.address.toLowerCase()) { - case vaults?.wethVault?.address.toLowerCase(): - setEthDebt(ethers.utils.formatEther(v.debt)); - break; - case vaults?.wbtcVault?.address.toLowerCase(): - // setWbtcDebt(ethers.utils.formatEther(v.debt)); - break; - case vaults?.daiVault?.address.toLowerCase(): - setDaiDebt(ethers.utils.formatEther(v.debt)); - break; - default: - break; - } - }); - } - - const { data, refetch } = useQuery(USER_VAULTS, { - variables: { owner: address }, - fetchPolicy: "no-cache", - notifyOnNetworkStatusChange: true, - onCompleted: () => { - setDebt(data); - }, - }); - - const refresh = async () => { - try { - setUpdateData(!updateData); - await refetch(); - } catch (error) { - // catch error in case the vault screen is changed - } - }; - - useEffect(() => { - const loadAddress = async () => { - if ( - tokens.tcapToken && - tokens.wethPoolToken && - oracles.tcapOracle && - tokens.ctxToken && - oracles.wethOracle && - governance.governorAlpha && - governance.timelock && - rewards.wethReward && - rewards.daiReward && - rewards.wethPoolReward - ) { - // Batch Calls - const wethOracleCall = oracles.wethOracleRead?.getLatestAnswer(); - const tcapOracleCall = oracles.tcapOracleRead?.getLatestAnswer(); - const totalTcapDebtWethCall = await rewards.wethRewardRead?.totalSupply(); - const rateWethCall = await rewards.wethRewardRead?.rewardRate(); - const totalTcapDebtDaihCall = await rewards.daiRewardRead?.totalSupply(); - const rateDaiCall = await rewards.daiRewardRead?.rewardRate(); - const reservesEthPoolCall = await tokens.wethPoolTokenRead?.getReserves(); - const totalSupplyEthPoolCall = await tokens.wethPoolTokenRead?.totalSupply(); - const rateEthPoolCall = await rewards.wethPoolRewardRead?.rewardRate(); - const LPsStakedCall = await rewards.wethPoolRewardRead?.totalSupply(); - const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); - const totalSupplyCtxPoolCall = await tokens.ctxPoolTokenRead?.totalSupply(); - const rateCtxPoolCall = await rewards.ctxPoolRewardRead?.rewardRate(); - const ctxLPsStakedCall = await rewards.ctxPoolRewardRead?.totalSupply(); - const wethPoolVestingRatioCall = await rewards.wethPoolRewardRead?.vestingRatio(); - const wethPoolVestingTimeCall = await rewards.wethPoolRewardRead?.vestingEnd(); - const ctxVestingRatioCall = await rewards.ctxPoolRewardRead?.vestingRatio(); - const ctxVestingTimeCall = await rewards.ctxPoolRewardRead?.vestingEnd(); - - // @ts-ignore - const [ - wethOraclePrice, - tcapPrice, - totalTcapDebtWeth, - rateWeth, - totalTcapDebtDai, - rateDai, - reservesEthPool, - totalSupplyEthPool, - rateEthPool, - LPsStaked, - reservesCtxPool, - totalSupplyCtxPool, - rateCtxPool, - ctxLPsStaked, - wethPoolVestingRatio, - wethPoolVestingTime, - ctxVestingRatio, - ctxVestingTime, - ] = await signer.ethcallProvider?.all([ - wethOracleCall, - tcapOracleCall, - totalTcapDebtWethCall, - rateWethCall, - totalTcapDebtDaihCall, - rateDaiCall, - reservesEthPoolCall, - totalSupplyEthPoolCall, - rateEthPoolCall, - LPsStakedCall, - reservesCtxPoolCall, - totalSupplyCtxPoolCall, - rateCtxPoolCall, - ctxLPsStakedCall, - wethPoolVestingRatioCall, - wethPoolVestingTimeCall, - ctxVestingRatioCall, - ctxVestingTimeCall, - ]); - - const currentPriceTCAP = ethers.utils.formatEther(tcapPrice); - const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - - // REACT_APP_POOL_CTX - const currentPriceCTX = await getPriceInUSDFromPair( - reservesCtxPool[0], - reservesCtxPool[1], - parseFloat(currentPriceETH) - ); - // ETH VAULT APY - setEthVaultAPY( - await getAPYFromVaultRewards( - totalTcapDebtWeth, - rateWeth, - currentPriceCTX, - parseFloat(currentPriceTCAP) - ) - ); - - // DAI VAULT APY - setDaiVaultAPY( - await getAPYFromVaultRewards( - totalTcapDebtDai, - rateDai, - currentPriceCTX, - parseFloat(currentPriceTCAP) - ) - ); - - // ETH Pool APY - setEthPoolAPY( - await getAPYFromLPRewards( - rateEthPool, - LPsStaked, - reservesEthPool, - totalSupplyEthPool, - currentPriceCTX, - parseFloat(currentPriceETH) - ) - ); - - // CTX Pool APY - setCtxPoolAPY( - await getAPYFromLPRewards( - rateCtxPool, - ctxLPsStaked, - reservesCtxPool, - totalSupplyCtxPool, - currentPriceCTX, - parseFloat(currentPriceETH) - ) - ); - - setVestingEndTime(wethPoolVestingTime); - setCtxVestingEndTime(ctxVestingTime); - - if (signer.signer) { - const currentAddress = await signer.signer.getAddress(); - setAddress(currentAddress); - - const currentEthRewardCall = await rewards?.wethRewardRead?.earned(currentAddress); - const currentDaiRewardCall = await rewards?.daiRewardRead?.earned(currentAddress); - const currentEthPoolRewardCall = await rewards.wethPoolRewardRead?.earned(currentAddress); - const currentVEthPoolRewardCall = await rewards.wethPoolRewardRead?.vestingAmounts( - currentAddress - ); - const currentEthPoolStakeCall = await rewards.wethPoolRewardRead?.balanceOf( - currentAddress - ); - const currentEthPoolBalanceCall = await tokens.wethPoolTokenRead?.balanceOf( - currentAddress - ); - const currentCtxPoolRewardCall = await rewards.ctxPoolRewardRead?.earned(currentAddress); - const currentVCtxPoolRewardCall = await rewards.ctxPoolRewardRead?.vestingAmounts( - currentAddress - ); - const currentCtxPoolStakeCall = await rewards.ctxPoolRewardRead?.balanceOf( - currentAddress - ); - const currentCtxPoolBalanceCall = await tokens.ctxPoolTokenRead?.balanceOf( - currentAddress - ); - - // @ts-ignore - const [ - currentEthReward, - currentDaiReward, - currentEthPoolReward, - currentVEthPoolReward, - currentEthPoolStake, - currentEthPoolBalance, - currentCtxPoolReward, - currentVCtxPoolReward, - currentCtxPoolStake, - currentCtxPoolBalance, - ] = await signer.ethcallProvider?.all([ - currentEthRewardCall, - currentDaiRewardCall, - currentEthPoolRewardCall, - currentVEthPoolRewardCall, - currentEthPoolStakeCall, - currentEthPoolBalanceCall, - currentCtxPoolRewardCall, - currentVCtxPoolRewardCall, - currentCtxPoolStakeCall, - currentCtxPoolBalanceCall, - ]); - - setEthRewards(ethers.utils.formatEther(currentEthReward)); - setDaiRewards(ethers.utils.formatEther(currentDaiReward)); - - setEthVestAmount(currentVEthPoolReward); - setCtxVestAmount(currentVCtxPoolReward); - if (phase > 1) { - setEthPoolRewards( - ethers.utils.formatEther( - currentEthPoolReward.mul(100 - wethPoolVestingRatio).div(100) - ) - ); - setVEthPoolRewards( - ethers.utils.formatEther( - currentVEthPoolReward.add(currentEthPoolReward.mul(wethPoolVestingRatio).div(100)) - ) - ); - setEthPoolStake(ethers.utils.formatEther(currentEthPoolStake)); - setEthPoolBalance(ethers.utils.formatEther(currentEthPoolBalance)); - setCtxPoolRewards( - ethers.utils.formatEther(currentCtxPoolReward.mul(100 - ctxVestingRatio).div(100)) - ); - setVCtxPoolRewards( - ethers.utils.formatEther( - currentVCtxPoolReward.add(currentCtxPoolReward.mul(ctxVestingRatio).div(100)) - ) - ); - setCtxPoolStake(ethers.utils.formatEther(currentCtxPoolStake)); - setCtxPoolBalance(ethers.utils.formatEther(currentCtxPoolBalance)); - } - } - } - setIsLoading(false); - }; - - loadAddress(); - // eslint-disable-next-line - }, [data, updateData]); - - if (isLoading) { - return ; - } - - const showCtxClaimVest = (): boolean => { - const today = new Date(); - return today > ctxClaimVestShowDate; - }; - - const claimRewards = async (vaultType: string) => { - try { - let tx: ethers.ContractTransaction; - switch (vaultType) { - case "ETH": - tx = await rewards?.wethReward?.getReward(); - break; - case "WBTC": - tx = await rewards?.wbtcReward?.getReward(); - break; - case "DAI": - tx = await rewards?.daiReward?.getReward(); - break; - case "ETHPOOL": - tx = await rewards?.wethPoolReward?.getReward(); - break; - case "WBTCPOOL": - tx = await rewards?.wbtcPoolReward?.getReward(); - break; - case "DAIPOOL": - tx = await rewards?.daiPoolReward?.getReward(); - break; - case "CTXPOOL": - tx = await rewards?.ctxPoolReward?.getReward(); - break; - default: - tx = await rewards?.wethReward?.getReward(); - break; - } - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification("Transaction rejected"); - } else { - errorNotification("Insufficient funds to stake"); - } - } - }; - - const claimVest = async (vaultType: string) => { - try { - let tx: ethers.ContractTransaction; - switch (vaultType) { - case "ETH": - tx = await rewards?.wethReward?.claimVest(); - break; - case "WBTC": - tx = await rewards?.wbtcReward?.claimVest(); - break; - case "DAI": - tx = await rewards?.daiReward?.claimVest(); - break; - case "ETHPOOL": - tx = await rewards?.wethPoolReward?.claimVest(); - break; - case "WBTCPOOL": - tx = await rewards?.wbtcPoolReward?.claimVest(); - break; - case "DAIPOOL": - tx = await rewards?.daiPoolReward?.claimVest(); - break; - case "CTXPOOL": - tx = await rewards?.ctxPoolReward?.claimVest(); - break; - default: - tx = await rewards?.wethReward?.claimVest(); - break; - } - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification("Transaction rejected"); - } else { - errorNotification("Error claiming vest"); - } - } - }; - - const exitRewards = async (vaultType: string) => { - try { - let tx: ethers.ContractTransaction; - switch (vaultType) { - case "ETHPOOL": - tx = await rewards?.wethPoolReward?.exit(); - break; - case "WBTCPOOL": - tx = await rewards?.wbtcPoolReward?.exit(); - break; - case "DAIPOOL": - tx = await rewards?.daiPoolReward?.exit(); - break; - case "CTXPOOL": - tx = await rewards?.ctxPoolReward?.exit(); - break; - default: - tx = await rewards?.wethPoolReward?.exit(); - break; - } - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification("Transaction rejected"); - } else { - errorNotification("Insufficient funds to exit"); - } - } - }; - - return ( -
-
-

Farming

{" "} - - - -

Minting Rewards

-
StatusCollateralCollateral (USD) + Status + + Empty: There is not collateral on the vault.{" "} +
+ Ready: Vault has collateral and it is ready to + mint TCAP.
+ Active: Vault is minting TCAP.
+ Liquidation: Ratio is less than min + required.
+ + } + > + +
+
+ Collateral + + + Collateral (USD) + +
Debt +
Debt (USD)Ratio + Ratio + +
- - - - - {" "} - - - - - - - - - - - - - - - - - - - {" "} - - -
- DescriptionCurrent Mint -
-
Current Reward
-
- - Early adopters rewards are issued over 14 days for a total of - 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day - over 14 days (91,000 Ethereum blocks), the per block reward would be - 5.4945 CTX split across the debtors at that point in time. 100% of - the reward is immediately available. - - } - > - - -
-
-
APY -
- - - ETH Vault - - {" "} - TCAP - - {" "} - CTX - - Inactive - - {address === "" ? ( - <> - - - - - ) : ( - <> - - - - - )} -
- - - DAI Vault - - {" "} - TCAP - - {" "} - CTX - - Inactive - - {address === "" ? ( - <> - - - - - ) : ( - <> - - - - - )} -
- - - {phase > 1 && ( - -

Liquidity Rewards

- - - - - - - - {" "} - - - - - - - - - - - - - - - - - - {" "} - - {" "} - - - - - -
- DescriptionBalanceStake -
-
Unlocked Reward
-
- - Available to claim immediately. - - } - > - - -
-
-
-
-
Locked Reward
-
- - Rewards are unlocked 6 months after the start of the pool. - - } - > - - -
-
-
APY -
- - - - - ETH/TCAP Pool
SushiSwap -
-
- {" "} - - {" "} - - {" "} - CTX - -
- {" "} - CTX -
-
- - {tsToDateString(vestingEndTime)} - -
-
- - - % - - - {address === "" ? ( - <> - - - - - ) : ( - <> - - {ethVestAmount.eq(0) ? ( - - ) : ( - - )} - - - )} -
- - - - - ETH/CTX Pool
SushiSwap -
-
- {" "} - - {" "} - - {" "} - CTX - -
- {" "} - CTX -
-
- - {tsToDateString(ctxVestingEndTime)} - -
-
- - - % - - - {address === "" ? ( - <> - - - - - ) : ( - <> - - {ctxVestAmount.gt(0) && showCtxClaimVest() ? ( - - ) : ( - - )} - - - )} -
-
- )} - - -
- setStakeShow(false)} - refresh={() => refresh()} - /> -
- ); -}; -export default Farm; diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index 61e21dd..6fc24a3 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -17590,7 +17590,7 @@ ] }, "CTXLiquidityReward": { - "address": "0xdC4cDd5dB9EE777EFD891690dc283638CB3A5f94", + "address": "0x06e4F32A5f3bD64C4c620644d107601368BfCb27", "abi": [ { "inputs": [ diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 1fbd184..52b6acc 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -68,6 +68,11 @@ export const NETWORKS = { }, }; +export const UNIV3 = { + NFPositionManager: "0xC36442b4a4522E871399CD717aBDD847Ab11FE88", + Staker: "0xe34139463bA50bD61336E0c446Bd8C0867c6fE65", +}; + export const API_ENDPOINT = "https://api.cryptex.finance"; export const GRAPHQL_ENDPOINT = { From 85206266caee6d5e7eb5d0740c4d3231f6b55c45 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 16 Mar 2022 11:00:07 -0600 Subject: [PATCH 065/278] adding new files --- .../Farm/MintingRewards/Rewards.tsx | 236 +++++ src/components/Farm/MintingRewards/index.tsx | 54 + src/components/Farm/UniV3Rewards/Rewards.tsx | 13 + src/components/Farm/UniV3Rewards/index.tsx | 90 ++ src/components/Farm/index.tsx | 812 +++++++++++++++ src/contracts/NonfungiblePositionManager.json | 947 ++++++++++++++++++ src/contracts/UniswapV3Staker.json | 546 ++++++++++ 7 files changed, 2698 insertions(+) create mode 100644 src/components/Farm/MintingRewards/Rewards.tsx create mode 100644 src/components/Farm/MintingRewards/index.tsx create mode 100644 src/components/Farm/UniV3Rewards/Rewards.tsx create mode 100644 src/components/Farm/UniV3Rewards/index.tsx create mode 100644 src/components/Farm/index.tsx create mode 100644 src/contracts/NonfungiblePositionManager.json create mode 100644 src/contracts/UniswapV3Staker.json diff --git a/src/components/Farm/MintingRewards/Rewards.tsx b/src/components/Farm/MintingRewards/Rewards.tsx new file mode 100644 index 0000000..2c56c07 --- /dev/null +++ b/src/components/Farm/MintingRewards/Rewards.tsx @@ -0,0 +1,236 @@ +import React, { useContext, useState } from "react"; +import Card from "react-bootstrap/esm/Card"; +import Button from "react-bootstrap/esm/Button"; +import { ethers } from "ethers"; +import NumberFormat from "react-number-format"; +import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; +import Table from "react-bootstrap/esm/Table"; +import Tooltip from "react-bootstrap/esm/Tooltip"; +import { useQuery, gql } from "@apollo/client"; +import VaultsContext from "../../../state/VaultsContext"; +import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; +import { ReactComponent as DAIIcon } from "../../../assets/images/graph/DAI.svg"; + +type props = { + address: string; + ethRewards: string; + daiRewards: string; + claimRewards: (vaultType: string) => {}; +}; + +const Rewards = ({ address, ethRewards, daiRewards, claimRewards }: props) => { + const vaults = useContext(VaultsContext); + const [ethDebt, setEthDebt] = useState("0.0"); + const [daiDebt, setDaiDebt] = useState("0.0"); + + const USER_VAULTS = gql` + query getVault($owner: String!) { + vaults(where: { owner: $owner }) { + id + vaultId + owner + collateral + debt + currentRatio + address + owner + } + } + `; + + async function setDebt(vaultData: any) { + // TODO: fix if no graph + await vaultData.vaults.forEach((v: any) => { + switch (v.address.toLowerCase()) { + case vaults?.wethVault?.address.toLowerCase(): + setEthDebt(ethers.utils.formatEther(v.debt)); + break; + case vaults?.wbtcVault?.address.toLowerCase(): + // setWbtcDebt(ethers.utils.formatEther(v.debt)); + break; + case vaults?.daiVault?.address.toLowerCase(): + setDaiDebt(ethers.utils.formatEther(v.debt)); + break; + default: + break; + } + }); + } + + const { data, refetch } = useQuery(USER_VAULTS, { + variables: { owner: address }, + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + onCompleted: () => { + setDebt(data); + }, + }); + + const claimMintRewards = async (vaultType: string) => { + await claimRewards(vaultType); + refetch(); + }; + + return ( + +

Minting Rewards

+ + + + + + {" "} + + + + + + + + + + + + + + + + + + + {" "} + + +
+ DescriptionCurrent Mint +
+
Current Reward
+
+ + Early adopters rewards are issued over 14 days for a total of 500,000 CTX. + Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 + Ethereum blocks), the per block reward would be 5.4945 CTX split across the + debtors at that point in time. 100% of the reward is immediately available. + + } + > + + +
+
+
APY +
+ + + ETH Vault + + {" "} + TCAP + + {" "} + CTX + + Inactive + + {address === "" ? ( + <> + + + + ) : ( + <> + + + + )} +
+ + + DAI Vault + + {" "} + TCAP + + {" "} + CTX + + Inactive + + {address === "" ? ( + <> + + + + ) : ( + <> + + + + )} +
+
+ ); +}; + +export default Rewards; diff --git a/src/components/Farm/MintingRewards/index.tsx b/src/components/Farm/MintingRewards/index.tsx new file mode 100644 index 0000000..dcaf5e3 --- /dev/null +++ b/src/components/Farm/MintingRewards/index.tsx @@ -0,0 +1,54 @@ +import React, { useContext, useEffect, useState } from "react"; +import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; +import NetworkContext from "../../../state/NetworkContext"; +import { GRAPHQL_ENDPOINT, NETWORKS } from "../../../utils/constants"; +import Rewards from "./Rewards"; + +const clientOracle = (graphqlEndpoint: string) => + new ApolloClient({ + uri: graphqlEndpoint, + cache: new InMemoryCache(), + }); + +type props = { + address: string; + ethRewards: string; + daiRewards: string; + claimRewards: (vaultType: string) => {}; +}; + +const MintingRerwards = ({ address, ethRewards, daiRewards, claimRewards }: props) => { + const currentNetwork = useContext(NetworkContext); + const [apolloClient, setApolloClient] = useState( + clientOracle( + process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.rinkeby + ) + ); + + useEffect(() => { + switch (currentNetwork.chainId) { + case NETWORKS.mainnet.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); + break; + case NETWORKS.rinkeby.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.rinkeby)); + break; + default: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); + break; + } + }, [currentNetwork.chainId]); + + return ( + + + + ); +}; + +export default MintingRerwards; diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx new file mode 100644 index 0000000..d1abfd7 --- /dev/null +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -0,0 +1,13 @@ +import React from "react"; +import Card from "react-bootstrap/esm/Card"; + +const Rewards = () => { + console.log("--"); + return ( + +

Entra

+
+ ); +}; + +export default Rewards; diff --git a/src/components/Farm/UniV3Rewards/index.tsx b/src/components/Farm/UniV3Rewards/index.tsx new file mode 100644 index 0000000..6630890 --- /dev/null +++ b/src/components/Farm/UniV3Rewards/index.tsx @@ -0,0 +1,90 @@ +import React, { useContext, useEffect, useState } from "react"; +import { ethers } from "ethers"; +import { Contract } from "ethers-multicall"; +import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; +import NetworkContext from "../../../state/NetworkContext"; +import SignerContext from "../../../state/SignerContext"; +import { GRAPHQL_ENDPOINT, NETWORKS, UNIV3 } from "../../../utils/constants"; +import { toFragment } from "../../../utils/utils"; +import NonfungiblePositionManager from "../../../contracts/NonfungiblePositionManager.json"; +import Rewards from "./Rewards"; + +const clientOracle = (graphqlEndpoint: string) => + new ApolloClient({ + uri: graphqlEndpoint, + cache: new InMemoryCache(), + }); + +type props = { + address: string; +}; + +const UniV3Rewards = ({ address }: props) => { + const currentNetwork = useContext(NetworkContext); + const signer = useContext(SignerContext); + const [apolloClient, setApolloClient] = useState( + clientOracle( + process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.rinkeby + ) + ); + const [lpTokens, setLpTokens] = useState([]); + + const loadLPTokens = async () => { + if (signer.signer) { + const positionManager = new ethers.Contract( + UNIV3.NFPositionManager, + NonfungiblePositionManager, + signer.signer + ); + const positionManagerRead = new Contract( + UNIV3.NFPositionManager, + toFragment(NonfungiblePositionManager) + ); + + const noOfTokensOwnedByUser = await positionManager.balanceOf( + "0x11e4857bb9993a50c685a79afad4e6f65d518dda" + ); + console.log("Tokens by user"); + console.log(noOfTokensOwnedByUser.toNumber()); + if (!noOfTokensOwnedByUser.isZero()) { + const ethcalls = []; + for (let i = 0; i < noOfTokensOwnedByUser.toNumber(); i += 1) { + const currentTokenOfOwner = await positionManagerRead.tokenOfOwnerByIndex( + "0x11e4857bb9993a50c685a79afad4e6f65d518dda", + i + ); + ethcalls.push(currentTokenOfOwner); + } + const tokensId = await signer.ethcallProvider?.all(ethcalls); + console.log(tokensId); + } + } + }; + + useEffect(() => { + const load = () => { + loadLPTokens(); + switch (currentNetwork.chainId) { + case NETWORKS.mainnet.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); + break; + case NETWORKS.rinkeby.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.rinkeby)); + break; + default: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); + break; + } + }; + load(); + // eslint-disable-next-line + }, [currentNetwork.chainId, address]); + + return ( + + + + ); +}; + +export default UniV3Rewards; diff --git a/src/components/Farm/index.tsx b/src/components/Farm/index.tsx new file mode 100644 index 0000000..f3cb9ef --- /dev/null +++ b/src/components/Farm/index.tsx @@ -0,0 +1,812 @@ +import React, { useContext, useEffect, useState } from "react"; +import Card from "react-bootstrap/esm/Card"; +import Button from "react-bootstrap/esm/Button"; +import Row from "react-bootstrap/esm/Row"; +import Table from "react-bootstrap/esm/Table"; +import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; +import Tooltip from "react-bootstrap/esm/Tooltip"; +import { ethers } from "ethers"; +import NumberFormat from "react-number-format"; +import SignerContext from "../../state/SignerContext"; +import TokensContext from "../../state/TokensContext"; +import OraclesContext from "../../state/OraclesContext"; +import GovernanceContext from "../../state/GovernanceContext"; +import RewardsContext from "../../state/RewardsContext"; +import MintingRewards from "./MintingRewards/index"; +import UniV3Rewards from "./UniV3Rewards/index"; +import "../../styles/farm.scss"; +import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; +import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; +import { ReactComponent as WETHIcon } from "../../assets/images/graph/weth.svg"; +import Loading from "../Loading"; +import { + notifyUser, + errorNotification, + tsToDateString, + getPriceInUSDFromPair, +} from "../../utils/utils"; +import { Stake } from "../modals/Stake"; + +const ctxClaimVestShowDate = new Date(1634511235 * 1000); + +const Farm = () => { + const [address, setAddress] = useState(""); + const [isLoading, setIsLoading] = useState(true); + const [ethRewards, setEthRewards] = useState("0"); + const [daiRewards, setDaiRewards] = useState("0"); + const [ethPoolRewards, setEthPoolRewards] = useState("0.0"); + const [ctxPoolRewards, setCtxPoolRewards] = useState("0.0"); + const [vethPoolRewards, setVEthPoolRewards] = useState("0.0"); + const [vctxPoolRewards, setVCtxPoolRewards] = useState("0.0"); + const [ethPoolStake, setEthPoolStake] = useState("0.0"); + const [ctxPoolStake, setCtxPoolStake] = useState("0.0"); + const [ethPoolBalance, setEthPoolBalance] = useState("0.0"); + const [ctxPoolBalance, setCtxPoolBalance] = useState("0.0"); + const [ethVestAmount, setEthVestAmount] = useState(ethers.BigNumber.from(0)); + const [ctxVestAmount, setCtxVestAmount] = useState(ethers.BigNumber.from(0)); + const [vestingEndTime, setVestingEndTime] = useState(0); + const [ctxVestingEndTime, setCtxVestingEndTime] = useState(0); + const [updateData, setUpdateData] = useState(false); + const signer = useContext(SignerContext); + const tokens = useContext(TokensContext); + const oracles = useContext(OraclesContext); + const governance = useContext(GovernanceContext); + const rewards = useContext(RewardsContext); + const [stakeShow, setStakeShow] = useState(false); + const [stakeBalance, setStakeBalance] = useState("0"); + const [selectedPoolTitle, setSelectedPoolTitle] = useState(""); + const [selectedPool, setSelectedPool] = useState(); + const [selectedPoolToken, setSelectedPoolToken] = useState(); + // APY + const [, setEthVaultAPY] = useState("0"); + const [, setDaiVaultAPY] = useState("0"); + const [ethPoolAPY, setEthPoolAPY] = useState("0"); + const [ctxPoolAPY, setCtxPoolAPY] = useState("0"); + + const oneYear = 60 * 60 * 24 * 365; + + const lpURL = "https://app.sushi.com"; + const phase = process.env.REACT_APP_PHASE ? parseInt(process.env.REACT_APP_PHASE) : 0; + + async function getAPYFromVaultRewards( + totalTcapDebt: number, + rate: number, + ctxPrice: number, + tcapPrice: number + ) { + const apy = ((rate * oneYear * ctxPrice) / (tcapPrice * totalTcapDebt)) * 100; + return apy.toString(); + } + + async function getAPYFromLPRewards( + rate: number, + LPsStaked: number, + reserves: any, + totalSupplyPool: number, + ctxPrice: number, + ethPrice: number + ) { + const token0Price = await getPriceInUSDFromPair(reserves[0], reserves[1], ethPrice); + const valuePerLPToken = (token0Price * reserves[0] + ethPrice * reserves[1]) / totalSupplyPool; + const apy = ((rate * oneYear * ctxPrice) / (valuePerLPToken * LPsStaked)) * 100; + + if (Number.isNaN(apy)) { + return "0"; + } + + return apy.toString(); + } + + const refresh = async () => { + try { + setUpdateData(!updateData); + } catch (error) { + // catch error in case the vault screen is changed + } + }; + + useEffect(() => { + const loadAddress = async () => { + if ( + tokens.tcapToken && + tokens.wethPoolToken && + oracles.tcapOracle && + tokens.ctxToken && + oracles.wethOracle && + governance.governorAlpha && + governance.timelock && + rewards.wethReward && + rewards.daiReward && + rewards.wethPoolReward + ) { + // Batch Calls + const wethOracleCall = oracles.wethOracleRead?.getLatestAnswer(); + const tcapOracleCall = oracles.tcapOracleRead?.getLatestAnswer(); + const totalTcapDebtWethCall = await rewards.wethRewardRead?.totalSupply(); + const rateWethCall = await rewards.wethRewardRead?.rewardRate(); + const totalTcapDebtDaihCall = await rewards.daiRewardRead?.totalSupply(); + const rateDaiCall = await rewards.daiRewardRead?.rewardRate(); + const reservesEthPoolCall = await tokens.wethPoolTokenRead?.getReserves(); + const totalSupplyEthPoolCall = await tokens.wethPoolTokenRead?.totalSupply(); + const rateEthPoolCall = await rewards.wethPoolRewardRead?.rewardRate(); + const LPsStakedCall = await rewards.wethPoolRewardRead?.totalSupply(); + const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); + const totalSupplyCtxPoolCall = await tokens.ctxPoolTokenRead?.totalSupply(); + const rateCtxPoolCall = await rewards.ctxPoolRewardRead?.rewardRate(); + const ctxLPsStakedCall = await rewards.ctxPoolRewardRead?.totalSupply(); + const wethPoolVestingRatioCall = await rewards.wethPoolRewardRead?.vestingRatio(); + const wethPoolVestingTimeCall = await rewards.wethPoolRewardRead?.vestingEnd(); + const ctxVestingRatioCall = await rewards.ctxPoolRewardRead?.vestingRatio(); + const ctxVestingTimeCall = await rewards.ctxPoolRewardRead?.vestingEnd(); + + // @ts-ignore + const [ + wethOraclePrice, + tcapPrice, + totalTcapDebtWeth, + rateWeth, + totalTcapDebtDai, + rateDai, + reservesEthPool, + totalSupplyEthPool, + rateEthPool, + LPsStaked, + reservesCtxPool, + totalSupplyCtxPool, + rateCtxPool, + ctxLPsStaked, + wethPoolVestingRatio, + wethPoolVestingTime, + ctxVestingRatio, + ctxVestingTime, + ] = await signer.ethcallProvider?.all([ + wethOracleCall, + tcapOracleCall, + totalTcapDebtWethCall, + rateWethCall, + totalTcapDebtDaihCall, + rateDaiCall, + reservesEthPoolCall, + totalSupplyEthPoolCall, + rateEthPoolCall, + LPsStakedCall, + reservesCtxPoolCall, + totalSupplyCtxPoolCall, + rateCtxPoolCall, + ctxLPsStakedCall, + wethPoolVestingRatioCall, + wethPoolVestingTimeCall, + ctxVestingRatioCall, + ctxVestingTimeCall, + ]); + + const currentPriceTCAP = ethers.utils.formatEther(tcapPrice); + const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + + // REACT_APP_POOL_CTX + const currentPriceCTX = await getPriceInUSDFromPair( + reservesCtxPool[0], + reservesCtxPool[1], + parseFloat(currentPriceETH) + ); + // ETH VAULT APY + setEthVaultAPY( + await getAPYFromVaultRewards( + totalTcapDebtWeth, + rateWeth, + currentPriceCTX, + parseFloat(currentPriceTCAP) + ) + ); + + // DAI VAULT APY + setDaiVaultAPY( + await getAPYFromVaultRewards( + totalTcapDebtDai, + rateDai, + currentPriceCTX, + parseFloat(currentPriceTCAP) + ) + ); + + // ETH Pool APY + setEthPoolAPY( + await getAPYFromLPRewards( + rateEthPool, + LPsStaked, + reservesEthPool, + totalSupplyEthPool, + currentPriceCTX, + parseFloat(currentPriceETH) + ) + ); + + // CTX Pool APY + setCtxPoolAPY( + await getAPYFromLPRewards( + rateCtxPool, + ctxLPsStaked, + reservesCtxPool, + totalSupplyCtxPool, + currentPriceCTX, + parseFloat(currentPriceETH) + ) + ); + + setVestingEndTime(wethPoolVestingTime); + setCtxVestingEndTime(ctxVestingTime); + + if (signer.signer) { + const currentAddress = await signer.signer.getAddress(); + setAddress(currentAddress); + + const currentEthRewardCall = await rewards?.wethRewardRead?.earned(currentAddress); + const currentDaiRewardCall = await rewards?.daiRewardRead?.earned(currentAddress); + const currentEthPoolRewardCall = await rewards.wethPoolRewardRead?.earned(currentAddress); + const currentVEthPoolRewardCall = await rewards.wethPoolRewardRead?.vestingAmounts( + currentAddress + ); + const currentEthPoolStakeCall = await rewards.wethPoolRewardRead?.balanceOf( + currentAddress + ); + const currentEthPoolBalanceCall = await tokens.wethPoolTokenRead?.balanceOf( + currentAddress + ); + const currentCtxPoolRewardCall = await rewards.ctxPoolRewardRead?.earned(currentAddress); + const currentVCtxPoolRewardCall = await rewards.ctxPoolRewardRead?.vestingAmounts( + currentAddress + ); + const currentCtxPoolStakeCall = await rewards.ctxPoolRewardRead?.balanceOf( + currentAddress + ); + const currentCtxPoolBalanceCall = await tokens.ctxPoolTokenRead?.balanceOf( + currentAddress + ); + + // @ts-ignore + const [ + currentEthReward, + currentDaiReward, + currentEthPoolReward, + currentVEthPoolReward, + currentEthPoolStake, + currentEthPoolBalance, + currentCtxPoolReward, + currentVCtxPoolReward, + currentCtxPoolStake, + currentCtxPoolBalance, + ] = await signer.ethcallProvider?.all([ + currentEthRewardCall, + currentDaiRewardCall, + currentEthPoolRewardCall, + currentVEthPoolRewardCall, + currentEthPoolStakeCall, + currentEthPoolBalanceCall, + currentCtxPoolRewardCall, + currentVCtxPoolRewardCall, + currentCtxPoolStakeCall, + currentCtxPoolBalanceCall, + ]); + + setEthRewards(ethers.utils.formatEther(currentEthReward)); + setDaiRewards(ethers.utils.formatEther(currentDaiReward)); + + setEthVestAmount(currentVEthPoolReward); + setCtxVestAmount(currentVCtxPoolReward); + if (phase > 1) { + setEthPoolRewards( + ethers.utils.formatEther( + currentEthPoolReward.mul(100 - wethPoolVestingRatio).div(100) + ) + ); + setVEthPoolRewards( + ethers.utils.formatEther( + currentVEthPoolReward.add(currentEthPoolReward.mul(wethPoolVestingRatio).div(100)) + ) + ); + setEthPoolStake(ethers.utils.formatEther(currentEthPoolStake)); + setEthPoolBalance(ethers.utils.formatEther(currentEthPoolBalance)); + setCtxPoolRewards( + ethers.utils.formatEther(currentCtxPoolReward.mul(100 - ctxVestingRatio).div(100)) + ); + setVCtxPoolRewards( + ethers.utils.formatEther( + currentVCtxPoolReward.add(currentCtxPoolReward.mul(ctxVestingRatio).div(100)) + ) + ); + setCtxPoolStake(ethers.utils.formatEther(currentCtxPoolStake)); + setCtxPoolBalance(ethers.utils.formatEther(currentCtxPoolBalance)); + } + } + } + setIsLoading(false); + }; + + loadAddress(); + // eslint-disable-next-line + }, [updateData]); + + if (isLoading) { + return ; + } + + const showCtxClaimVest = (): boolean => { + const today = new Date(); + return today > ctxClaimVestShowDate; + }; + + const claimRewards = async (vaultType: string) => { + try { + let tx: ethers.ContractTransaction; + switch (vaultType) { + case "ETH": + tx = await rewards?.wethReward?.getReward(); + break; + case "WBTC": + tx = await rewards?.wbtcReward?.getReward(); + break; + case "DAI": + tx = await rewards?.daiReward?.getReward(); + break; + case "ETHPOOL": + tx = await rewards?.wethPoolReward?.getReward(); + break; + case "WBTCPOOL": + tx = await rewards?.wbtcPoolReward?.getReward(); + break; + case "DAIPOOL": + tx = await rewards?.daiPoolReward?.getReward(); + break; + case "CTXPOOL": + tx = await rewards?.ctxPoolReward?.getReward(); + break; + default: + tx = await rewards?.wethReward?.getReward(); + break; + } + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification("Transaction rejected"); + } else { + errorNotification("Insufficient funds to stake"); + } + } + }; + + const claimVest = async (vaultType: string) => { + try { + let tx: ethers.ContractTransaction; + switch (vaultType) { + case "ETH": + tx = await rewards?.wethReward?.claimVest(); + break; + case "WBTC": + tx = await rewards?.wbtcReward?.claimVest(); + break; + case "DAI": + tx = await rewards?.daiReward?.claimVest(); + break; + case "ETHPOOL": + tx = await rewards?.wethPoolReward?.claimVest(); + break; + case "WBTCPOOL": + tx = await rewards?.wbtcPoolReward?.claimVest(); + break; + case "DAIPOOL": + tx = await rewards?.daiPoolReward?.claimVest(); + break; + case "CTXPOOL": + tx = await rewards?.ctxPoolReward?.claimVest(); + break; + default: + tx = await rewards?.wethReward?.claimVest(); + break; + } + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification("Transaction rejected"); + } else { + errorNotification("Error claiming vest"); + } + } + }; + + const exitRewards = async (vaultType: string) => { + try { + let tx: ethers.ContractTransaction; + switch (vaultType) { + case "ETHPOOL": + tx = await rewards?.wethPoolReward?.exit(); + break; + case "WBTCPOOL": + tx = await rewards?.wbtcPoolReward?.exit(); + break; + case "DAIPOOL": + tx = await rewards?.daiPoolReward?.exit(); + break; + case "CTXPOOL": + tx = await rewards?.ctxPoolReward?.exit(); + break; + default: + tx = await rewards?.wethPoolReward?.exit(); + break; + } + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification("Transaction rejected"); + } else { + errorNotification("Insufficient funds to exit"); + } + } + }; + + return ( +
+
+

Farming

{" "} + + + + {phase > 1 && ( + +

Liquidity Rewards

+ + + + + + + + {" "} + + + + + + + + + + + + + + + + + + {" "} + + {" "} + + + + + +
+ DescriptionBalanceStake +
+
Unlocked Reward
+
+ + Available to claim immediately. + + } + > + + +
+
+
+
+
Locked Reward
+
+ + Rewards are unlocked 6 months after the start of the pool. + + } + > + + +
+
+
APY +
+ + + + + ETH/TCAP Pool
SushiSwap +
+
+ {" "} + + {" "} + + {" "} + CTX + +
+ {" "} + CTX +
+
+ + {tsToDateString(vestingEndTime)} + +
+
+ + + % + + + {address === "" ? ( + <> + + + + + ) : ( + <> + + {ethVestAmount.eq(0) ? ( + + ) : ( + + )} + + + )} +
+ + + + + ETH/CTX Pool
SushiSwap +
+
+ {" "} + + {" "} + + {" "} + CTX + +
+ {" "} + CTX +
+
+ + {tsToDateString(ctxVestingEndTime)} + +
+
+ + + % + + + {address === "" ? ( + <> + + + + + ) : ( + <> + + {ctxVestAmount.gt(0) && showCtxClaimVest() ? ( + + ) : ( + + )} + + + )} +
+
+ )} + +
+
+
+ setStakeShow(false)} + refresh={() => refresh()} + /> +
+ ); +}; + +export default Farm; diff --git a/src/contracts/NonfungiblePositionManager.json b/src/contracts/NonfungiblePositionManager.json new file mode 100644 index 0000000..75244eb --- /dev/null +++ b/src/contracts/NonfungiblePositionManager.json @@ -0,0 +1,947 @@ +[{ + "inputs": [{ + "internalType": "address", + "name": "_factory", + "type": "address" + }, { + "internalType": "address", + "name": "_WETH9", + "type": "address" + }, { + "internalType": "address", + "name": "_tokenDescriptor_", + "type": "address" + }], + "stateMutability": "nonpayable", + "type": "constructor" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "Approval", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + }], + "name": "ApprovalForAll", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }], + "name": "Collect", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "indexed": false, + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }], + "name": "DecreaseLiquidity", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "indexed": false, + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }], + "name": "IncreaseLiquidity", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "Transfer", + "type": "event" +}, { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "PERMIT_TYPEHASH", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "WETH9", + "outputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "to", + "type": "address" + }, { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "owner", + "type": "address" + }], + "name": "balanceOf", + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "baseURI", + "outputs": [{ + "internalType": "string", + "name": "", + "type": "string" + }], + "stateMutability": "pure", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [{ + "components": [{ + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "internalType": "address", + "name": "recipient", + "type": "address" + }, { + "internalType": "uint128", + "name": "amount0Max", + "type": "uint128" + }, { + "internalType": "uint128", + "name": "amount1Max", + "type": "uint128" + }], + "internalType": "struct INonfungiblePositionManager.CollectParams", + "name": "params", + "type": "tuple" + }], + "name": "collect", + "outputs": [{ + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "token0", + "type": "address" + }, { + "internalType": "address", + "name": "token1", + "type": "address" + }, { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, { + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + }], + "name": "createAndInitializePoolIfNecessary", + "outputs": [{ + "internalType": "address", + "name": "pool", + "type": "address" + }], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [{ + "components": [{ + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, { + "internalType": "uint256", + "name": "amount0Min", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount1Min", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }], + "internalType": "struct INonfungiblePositionManager.DecreaseLiquidityParams", + "name": "params", + "type": "tuple" + }], + "name": "decreaseLiquidity", + "outputs": [{ + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [], + "name": "factory", + "outputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "getApproved", + "outputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "components": [{ + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount0Desired", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount1Desired", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount0Min", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount1Min", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }], + "internalType": "struct INonfungiblePositionManager.IncreaseLiquidityParams", + "name": "params", + "type": "tuple" + }], + "name": "increaseLiquidity", + "outputs": [{ + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "owner", + "type": "address" + }, { + "internalType": "address", + "name": "operator", + "type": "address" + }], + "name": "isApprovedForAll", + "outputs": [{ + "internalType": "bool", + "name": "", + "type": "bool" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "components": [{ + "internalType": "address", + "name": "token0", + "type": "address" + }, { + "internalType": "address", + "name": "token1", + "type": "address" + }, { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, { + "internalType": "uint256", + "name": "amount0Desired", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount1Desired", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount0Min", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount1Min", + "type": "uint256" + }, { + "internalType": "address", + "name": "recipient", + "type": "address" + }, { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }], + "internalType": "struct INonfungiblePositionManager.MintParams", + "name": "params", + "type": "tuple" + }], + "name": "mint", + "outputs": [{ + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [{ + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + }], + "name": "multicall", + "outputs": [{ + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + }], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [], + "name": "name", + "outputs": [{ + "internalType": "string", + "name": "", + "type": "string" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "ownerOf", + "outputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "spender", + "type": "address" + }, { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }], + "name": "permit", + "outputs": [], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "positions", + "outputs": [{ + "internalType": "uint96", + "name": "nonce", + "type": "uint96" + }, { + "internalType": "address", + "name": "operator", + "type": "address" + }, { + "internalType": "address", + "name": "token0", + "type": "address" + }, { + "internalType": "address", + "name": "token1", + "type": "address" + }, { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, { + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, { + "internalType": "uint256", + "name": "feeGrowthInside0LastX128", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "feeGrowthInside1LastX128", + "type": "uint256" + }, { + "internalType": "uint128", + "name": "tokensOwed0", + "type": "uint128" + }, { + "internalType": "uint128", + "name": "tokensOwed1", + "type": "uint128" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "refundETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "from", + "type": "address" + }, { + "internalType": "address", + "name": "to", + "type": "address" + }, { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "from", + "type": "address" + }, { + "internalType": "address", + "name": "to", + "type": "address" + }, { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + }], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "token", + "type": "address" + }, { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }], + "name": "selfPermit", + "outputs": [], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "token", + "type": "address" + }, { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }], + "name": "selfPermitAllowed", + "outputs": [], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "token", + "type": "address" + }, { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }], + "name": "selfPermitAllowedIfNecessary", + "outputs": [], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "token", + "type": "address" + }, { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }], + "name": "selfPermitIfNecessary", + "outputs": [], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "operator", + "type": "address" + }, { + "internalType": "bool", + "name": "approved", + "type": "bool" + }], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + }], + "name": "supportsInterface", + "outputs": [{ + "internalType": "bool", + "name": "", + "type": "bool" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "token", + "type": "address" + }, { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, { + "internalType": "address", + "name": "recipient", + "type": "address" + }], + "name": "sweepToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [], + "name": "symbol", + "outputs": [{ + "internalType": "string", + "name": "", + "type": "string" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "index", + "type": "uint256" + }], + "name": "tokenByIndex", + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "owner", + "type": "address" + }, { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }], + "name": "tokenOfOwnerByIndex", + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "tokenURI", + "outputs": [{ + "internalType": "string", + "name": "", + "type": "string" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "totalSupply", + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "from", + "type": "address" + }, { + "internalType": "address", + "name": "to", + "type": "address" + }, { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "amount0Owed", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "amount1Owed", + "type": "uint256" + }, { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }], + "name": "uniswapV3MintCallback", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, { + "internalType": "address", + "name": "recipient", + "type": "address" + }], + "name": "unwrapWETH9", + "outputs": [], + "stateMutability": "payable", + "type": "function" +}, { + "stateMutability": "payable", + "type": "receive" +}] \ No newline at end of file diff --git a/src/contracts/UniswapV3Staker.json b/src/contracts/UniswapV3Staker.json new file mode 100644 index 0000000..37aaf67 --- /dev/null +++ b/src/contracts/UniswapV3Staker.json @@ -0,0 +1,546 @@ +[{ + "inputs": [{ + "internalType": "contract IUniswapV3Factory", + "name": "_factory", + "type": "address" + }, { + "internalType": "contract INonfungiblePositionManager", + "name": "_nonfungiblePositionManager", + "type": "address" + }, { + "internalType": "uint256", + "name": "_maxIncentiveStartLeadTime", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "_maxIncentiveDuration", + "type": "uint256" + }], + "stateMutability": "nonpayable", + "type": "constructor" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "indexed": true, + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + }], + "name": "DepositTransferred", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "contract IERC20Minimal", + "name": "rewardToken", + "type": "address" + }, { + "indexed": true, + "internalType": "contract IUniswapV3Pool", + "name": "pool", + "type": "address" + }, { + "indexed": false, + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, { + "indexed": false, + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, { + "indexed": false, + "internalType": "address", + "name": "refundee", + "type": "address" + }, { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }], + "name": "IncentiveCreated", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "bytes32", + "name": "incentiveId", + "type": "bytes32" + }, { + "indexed": false, + "internalType": "uint256", + "name": "refund", + "type": "uint256" + }], + "name": "IncentiveEnded", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }], + "name": "RewardClaimed", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "indexed": true, + "internalType": "bytes32", + "name": "incentiveId", + "type": "bytes32" + }, { + "indexed": false, + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }], + "name": "TokenStaked", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "indexed": true, + "internalType": "bytes32", + "name": "incentiveId", + "type": "bytes32" + }], + "name": "TokenUnstaked", + "type": "event" +}, { + "inputs": [{ + "internalType": "contract IERC20Minimal", + "name": "rewardToken", + "type": "address" + }, { + "internalType": "address", + "name": "to", + "type": "address" + }, { + "internalType": "uint256", + "name": "amountRequested", + "type": "uint256" + }], + "name": "claimReward", + "outputs": [{ + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "components": [{ + "internalType": "contract IERC20Minimal", + "name": "rewardToken", + "type": "address" + }, { + "internalType": "contract IUniswapV3Pool", + "name": "pool", + "type": "address" + }, { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, { + "internalType": "address", + "name": "refundee", + "type": "address" + }], + "internalType": "struct IUniswapV3Staker.IncentiveKey", + "name": "key", + "type": "tuple" + }, { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }], + "name": "createIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "name": "deposits", + "outputs": [{ + "internalType": "address", + "name": "owner", + "type": "address" + }, { + "internalType": "uint48", + "name": "numberOfStakes", + "type": "uint48" + }, { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "components": [{ + "internalType": "contract IERC20Minimal", + "name": "rewardToken", + "type": "address" + }, { + "internalType": "contract IUniswapV3Pool", + "name": "pool", + "type": "address" + }, { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, { + "internalType": "address", + "name": "refundee", + "type": "address" + }], + "internalType": "struct IUniswapV3Staker.IncentiveKey", + "name": "key", + "type": "tuple" + }], + "name": "endIncentive", + "outputs": [{ + "internalType": "uint256", + "name": "refund", + "type": "uint256" + }], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [], + "name": "factory", + "outputs": [{ + "internalType": "contract IUniswapV3Factory", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "components": [{ + "internalType": "contract IERC20Minimal", + "name": "rewardToken", + "type": "address" + }, { + "internalType": "contract IUniswapV3Pool", + "name": "pool", + "type": "address" + }, { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, { + "internalType": "address", + "name": "refundee", + "type": "address" + }], + "internalType": "struct IUniswapV3Staker.IncentiveKey", + "name": "key", + "type": "tuple" + }, { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "getRewardInfo", + "outputs": [{ + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, { + "internalType": "uint160", + "name": "secondsInsideX128", + "type": "uint160" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], + "name": "incentives", + "outputs": [{ + "internalType": "uint256", + "name": "totalRewardUnclaimed", + "type": "uint256" + }, { + "internalType": "uint160", + "name": "totalSecondsClaimedX128", + "type": "uint160" + }, { + "internalType": "uint96", + "name": "numberOfStakes", + "type": "uint96" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "maxIncentiveDuration", + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "maxIncentiveStartLeadTime", + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + }], + "name": "multicall", + "outputs": [{ + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + }], + "stateMutability": "payable", + "type": "function" +}, { + "inputs": [], + "name": "nonfungiblePositionManager", + "outputs": [{ + "internalType": "contract INonfungiblePositionManager", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }, { + "internalType": "address", + "name": "from", + "type": "address" + }, { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }], + "name": "onERC721Received", + "outputs": [{ + "internalType": "bytes4", + "name": "", + "type": "bytes4" + }], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "contract IERC20Minimal", + "name": "", + "type": "address" + }, { + "internalType": "address", + "name": "", + "type": "address" + }], + "name": "rewards", + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "components": [{ + "internalType": "contract IERC20Minimal", + "name": "rewardToken", + "type": "address" + }, { + "internalType": "contract IUniswapV3Pool", + "name": "pool", + "type": "address" + }, { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, { + "internalType": "address", + "name": "refundee", + "type": "address" + }], + "internalType": "struct IUniswapV3Staker.IncentiveKey", + "name": "key", + "type": "tuple" + }, { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "stakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "internalType": "bytes32", + "name": "incentiveId", + "type": "bytes32" + }], + "name": "stakes", + "outputs": [{ + "internalType": "uint160", + "name": "secondsPerLiquidityInsideInitialX128", + "type": "uint160" + }, { + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "internalType": "address", + "name": "to", + "type": "address" + }], + "name": "transferDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "components": [{ + "internalType": "contract IERC20Minimal", + "name": "rewardToken", + "type": "address" + }, { + "internalType": "contract IUniswapV3Pool", + "name": "pool", + "type": "address" + }, { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, { + "internalType": "address", + "name": "refundee", + "type": "address" + }], + "internalType": "struct IUniswapV3Staker.IncentiveKey", + "name": "key", + "type": "tuple" + }, { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }], + "name": "unstakeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, { + "internalType": "address", + "name": "to", + "type": "address" + }, { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }], + "name": "withdrawToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}] \ No newline at end of file From e31e976a5ee53a12f529f9d0646a1e7e280639af Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 16 Mar 2022 22:08:10 -0600 Subject: [PATCH 066/278] adding liquidating info --- src/components/Vault/Monitoring/Liquidate.tsx | 59 +++++++------ src/components/Vault/Monitoring/Vaults.tsx | 31 +++++-- src/components/Vault/Monitoring/common.tsx | 4 + src/components/Vault/Monitoring/index.tsx | 82 ++++++++++++++++++- src/components/Vault/Monitoring/types.tsx | 2 + src/styles/modal.scss | 14 ++++ src/styles/vault-monitoring.scss | 3 + 7 files changed, 162 insertions(+), 33 deletions(-) diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index 7546bb1..2e190bb 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -1,5 +1,6 @@ import React, { useContext, useEffect, useState } from "react"; import { Button, Form } from "react-bootstrap"; +import Table from "react-bootstrap/Table"; import { ethers, BigNumber } from "ethers"; import InputGroup from "react-bootstrap/esm/InputGroup"; import Modal from "react-bootstrap/esm/Modal"; @@ -10,8 +11,8 @@ import SignerContext from "../../../state/SignerContext"; import OracleContext from "../../../state/OraclesContext"; import TokensContext from "../../../state/TokensContext"; import VaultContext from "../../../state/VaultsContext"; -import { errorNotification, notifyUser, toUSD } from "../../../utils/utils"; -import { NETWORKS } from "../../../utils/constants"; +import { errorNotification, isPolygon, notifyUser, toUSD } from "../../../utils/utils"; +import { numberFormatStr } from "./common"; type props = { show: boolean; @@ -36,7 +37,8 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } const [maxTcapUSD, setMaxTcapUSD] = useState("0"); const [reward, setReward] = useState("0"); const [rewardUSD, setRewardUSD] = useState("0"); - const [liquidationFee, setLiquidationFee] = useState("0"); + const [burnFee, setBurnFee] = useState("0"); + const [burnFeeUsd, setBurnFeeUsd] = useState("0"); const [canLiquidate, setCanLiquidate] = useState(true); useEffect(() => { @@ -94,20 +96,24 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); const oraclePriceCall = await oracleRead?.getLatestAnswer(); + const ethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + // @ts-ignore - const [balance, tcapOraclePrice, reqTcap, liqReward, collateralPrice] = + const [balance, tcapOraclePrice, reqTcap, liqReward, collateralPrice, ethPrice] = await signer.ethcallProvider?.all([ tcapBalanceCall, tcapPriceCall, reqTcapCall, liqRewardCall, oraclePriceCall, + ethOraclePriceCall, ]); const tcapBalanceText = ethers.utils.formatEther(balance); const tcapPriceText = ethers.utils.formatEther(tcapOraclePrice); const reqTcapText = ethers.utils.formatEther(reqTcap); const liqRewardText = ethers.utils.formatEther(liqReward); const priceText = ethers.utils.formatEther(collateralPrice.mul(10000000000)); + const ethPriceText = ethers.utils.formatEther(ethPrice.mul(10000000000)); const currentLiqFee = await cVault?.getFee(reqTcap); const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); @@ -117,7 +123,8 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } setRequiredTcap(reqTcapText); setReward(liqRewardText); setRewardUSD(toUSD(liqRewardText, priceText).toFixed(2)); - setLiquidationFee(ethFee.toString()); + setBurnFee(ethFee); + setBurnFeeUsd(toUSD(ethFee, ethPriceText).toFixed(2)); } } } @@ -150,7 +157,7 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } ); const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); - setLiquidationFee(ethFee); + setBurnFee(ethFee); const tx = await currentVault.liquidateVault( BigNumber.from(vaultId), ethers.utils.parseEther(maxTcap), @@ -176,6 +183,8 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } } }; + const netReward = parseFloat(rewardUSD) - parseFloat(maxTcapUSD) - parseFloat(burnFeeUsd); + return ( {" "} {vaultType === "WETH" ? "ETH" : vaultType}
+ +
- USD:{" "} + Burn Fee:{" "} + />{" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"}
- - - Burn Fee:{" "} - {" "} - {currentNetwork.chainId === NETWORKS.polygon.chainId ? "MATIC" : "ETH"} -
+ + + + + + + + + + + + + +
RewardRequired TCAPBurn FeeNet Reward
${numberFormatStr(rewardUSD, 2, 2)}${numberFormatStr(maxTcapUSD, 2, 2)}${numberFormatStr(burnFeeUsd, 2, 2)}${numberFormatStr(netReward.toFixed(2), 2, 2)}
+ ); + } + if (v.url !== "") { + return ( + + {capitalize(v.status)} + + ); + } + return {capitalize(v.status)}; + }; + return ( <> @@ -178,15 +199,7 @@ export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh return ( + )} @@ -263,6 +305,13 @@ export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh + {currentStatus === "liquidation" && ( + + )} ); })} diff --git a/src/components/Vault/Monitoring/common.tsx b/src/components/Vault/Monitoring/common.tsx index 144eda9..8474b16 100644 --- a/src/components/Vault/Monitoring/common.tsx +++ b/src/components/Vault/Monitoring/common.tsx @@ -77,6 +77,6 @@ export const sortRatioAsc = (a: VaultsType, b: VaultsType) => a.ratio - b.ratio; export const sortRatioDesc = (a: VaultsType, b: VaultsType) => b.ratio - a.ratio; -export const sortRewardAsc = (a: VaultsType, b: VaultsType) => a.ratio - b.ratio; +export const sortRewardAsc = (a: VaultsType, b: VaultsType) => a.netReward - b.netReward; -export const sortRewardDesc = (a: VaultsType, b: VaultsType) => a.ratio - b.ratio; +export const sortRewardDesc = (a: VaultsType, b: VaultsType) => b.netReward - a.netReward; diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 8949449..e4f8571 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -54,6 +54,12 @@ const totalsDefault = { debtUSD: "0", }; +type liqVaultsTempType = { + vaultId: string; + vaultType: string; +}; +const showAllVaults = true; + export const Monitoring = () => { const currentNetwork = useContext(NetworkContext); const oracles = useContext(OraclesContext); @@ -72,6 +78,7 @@ export const Monitoring = () => { const [radioValue, setRadioValue] = useState("1"); const [tokenSymbol, setTokenSymbol] = useState("all"); const [currentStatus, setCurrentStatus] = useState("all"); + const [liqLoaded, setLiqLoaded] = useState(false); const [renderTable, setRenderTable] = useState(false); const radios = [ { name: "All Vaults", value: "1" }, @@ -384,7 +391,7 @@ export const Monitoring = () => { } }; - /* const calculateNetRewardUsd = async (vaultId: string, vaultType: string) => { + const calculateNetRewardUsd = async (vaultId: string, vaultType: string) => { let cVault = vaults.wethVault; let cVaultRead = vaults.wethVaultRead; let vaultPrice = oraclePrices?.wethOraclePrice; @@ -448,7 +455,7 @@ export const Monitoring = () => { toUSD(reqTcapText, oraclePrices?.tcapOraclePrice || "0") - toUSD(ethFee, oraclePrices?.wethOraclePrice || "0") ); - }; */ + }; const calculateVaultData = ( collateralWei: ethers.BigNumberish, @@ -481,12 +488,14 @@ export const Monitoring = () => { const loadVaults = async (vaultsData: any) => { const vData = new Array(); + const vLiquidables = new Array(); const totals = { ...totalsDefault }; setSkipQuery(true); setLoadMore(false); + setLiqLoaded(currentStatus !== "liquidation"); // @ts-ignore - vaultsData.vaults.forEach(async (v) => { + vaultsData.vaults.forEach((v) => { const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = calculateVaultData(v.collateral, v.debt, v.tokenSymbol); @@ -494,17 +503,21 @@ export const Monitoring = () => { if (currentStatus === "active" || currentStatus === "liquidation") { addVault = currentStatus === status; } - + if (!showAllVaults) { + addVault = v.tokenSymbol === "WETH" || v.tokenSymbol === "DAI"; + } if (addVault) { let vaultUrl = ""; - const netReward = 0; const symbol = v.tokenSymbol === "WETH" ? "ETH" : v.tokenSymbol; if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { vaultUrl = window.location.origin.concat("/vault/").concat(symbol); } - /* if (currentStatus === "liquidation") { - netReward = await calculateNetRewardUsd(v.vaultId, symbol); - } */ + if (currentStatus === "liquidation") { + vLiquidables.push({ + vaultId: v.vaultId, + vaultType: v.tokenSymbol, + }); + } vData.push({ id: v.vaultId, @@ -515,7 +528,7 @@ export const Monitoring = () => { debtUsd: debtUSD.toFixed(2), ratio, minRatio: minRatio.toString(), - netReward, + netReward: 0, status, blockTS: v.blockTS, url: vaultUrl, @@ -528,8 +541,25 @@ export const Monitoring = () => { totals.debtUSD = (parseFloat(totals.debtUSD) + debtUSD).toFixed(2); } }); - setVaultList(vData); - setVaultsTotals(totals); + if (currentStatus !== "liquidation") { + setVaultList(vData); + setVaultsTotals(totals); + } else { + const loadNetReward = async () => { + vLiquidables.forEach((l, index) => { + calculateNetRewardUsd(l.vaultId, l.vaultType).then((result) => { + vData[index].netReward = result; + }); + }); + }; + loadNetReward().then(() => { + setTimeout(function () { + setVaultList(vData); + setVaultsTotals(totals); + setLiqLoaded(true); + }, 500); + }); + } // Set pagination data confPagination(vData, pagination.itemsPerPage); }; @@ -566,14 +596,18 @@ export const Monitoring = () => { if (isInLayer1(currentNetwork.chainId)) { symbols.push({ key: "weth", name: "ETH" }); symbols.push({ key: "dai", name: "DAI" }); - symbols.push({ key: "aave", name: "AAVE" }); - symbols.push({ key: "link", name: "LINK" }); + if (showAllVaults) { + symbols.push({ key: "aave", name: "AAVE" }); + symbols.push({ key: "link", name: "LINK" }); + } } else if (isOptimism(currentNetwork.chainId)) { symbols.push({ key: "eth", name: "ETH" }); symbols.push({ key: "dai", name: "DAI" }); - symbols.push({ key: "link", name: "LINK" }); - symbols.push({ key: "uni", name: "UNI" }); - symbols.push({ key: "snx", name: "SNX" }); + if (showAllVaults) { + symbols.push({ key: "link", name: "LINK" }); + symbols.push({ key: "uni", name: "UNI" }); + symbols.push({ key: "snx", name: "SNX" }); + } } else { symbols.push({ key: "matic", name: "MATIC" }); symbols.push({ key: "dai", name: "DAI" }); @@ -797,13 +831,14 @@ export const Monitoring = () => { )} - {loading || !pricesUpdated ? ( + {loading || !pricesUpdated || !liqLoaded ? ( ) : ( ) => setVaultList(v)} + currentStatus={currentStatus} pagination={pagination} refresh={updateLiquidatedVault} /> From f59abf0ff69c7b97c51fefd010cb46180e36301b Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 17 Mar 2022 15:28:58 -0600 Subject: [PATCH 068/278] added net rewards to table --- src/components/Vault/Monitoring/Liquidate.tsx | 116 +++++++----- src/components/Vault/Monitoring/common.tsx | 4 + src/components/Vault/Monitoring/index.tsx | 177 ++++++++++++++++-- src/components/Vault/Monitoring/types.tsx | 2 + src/components/Vault/Monitoring/vaults.tsx | 82 +++++++- src/styles/modal.scss | 29 ++- 6 files changed, 333 insertions(+), 77 deletions(-) diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index 5e0a52a..2e190bb 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -1,5 +1,6 @@ import React, { useContext, useEffect, useState } from "react"; import { Button, Form } from "react-bootstrap"; +import Table from "react-bootstrap/Table"; import { ethers, BigNumber } from "ethers"; import InputGroup from "react-bootstrap/esm/InputGroup"; import Modal from "react-bootstrap/esm/Modal"; @@ -7,10 +8,11 @@ import NumberFormat from "react-number-format"; import "../../../styles/modal.scss"; import NetworkContext from "../../../state/NetworkContext"; import SignerContext from "../../../state/SignerContext"; -import VaultContext from "../../../state/VaultsContext"; import OracleContext from "../../../state/OraclesContext"; -import { errorNotification, notifyUser, toUSD } from "../../../utils/utils"; -import { NETWORKS } from "../../../utils/constants"; +import TokensContext from "../../../state/TokensContext"; +import VaultContext from "../../../state/VaultsContext"; +import { errorNotification, isPolygon, notifyUser, toUSD } from "../../../utils/utils"; +import { numberFormatStr } from "./common"; type props = { show: boolean; @@ -24,16 +26,19 @@ type props = { const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh }: props) => { const currentNetwork = useContext(NetworkContext); const signer = useContext(SignerContext); - const vaults = useContext(VaultContext); const oracles = useContext(OracleContext); + const vaults = useContext(VaultContext); + const tokens = useContext(TokensContext); const [currentVault, setCurrentVault] = useState(); + const [tcapBalance, setTcapBalance] = useState("0"); const [tcapPrice, setTcapPrice] = useState("0"); const [requiredTcap, setRequiredTcap] = useState("0"); const [maxTcap, setMaxTcap] = useState("0"); const [maxTcapUSD, setMaxTcapUSD] = useState("0"); const [reward, setReward] = useState("0"); const [rewardUSD, setRewardUSD] = useState("0"); - const [liquidationFee, setLiquidationFee] = useState("0"); + const [burnFee, setBurnFee] = useState("0"); + const [burnFeeUsd, setBurnFeeUsd] = useState("0"); const [canLiquidate, setCanLiquidate] = useState(true); useEffect(() => { @@ -86,31 +91,40 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } } if (vaultId !== "" && cVault && cVaultRead) { setCurrentVault(cVault); + const tcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(currentAddress); const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); const oraclePriceCall = await oracleRead?.getLatestAnswer(); + const ethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + // @ts-ignore - const [tcapOraclePrice, reqTcap, liqReward, collateralPrice] = + const [balance, tcapOraclePrice, reqTcap, liqReward, collateralPrice, ethPrice] = await signer.ethcallProvider?.all([ + tcapBalanceCall, tcapPriceCall, reqTcapCall, liqRewardCall, oraclePriceCall, + ethOraclePriceCall, ]); + const tcapBalanceText = ethers.utils.formatEther(balance); const tcapPriceText = ethers.utils.formatEther(tcapOraclePrice); const reqTcapText = ethers.utils.formatEther(reqTcap); const liqRewardText = ethers.utils.formatEther(liqReward); const priceText = ethers.utils.formatEther(collateralPrice.mul(10000000000)); + const ethPriceText = ethers.utils.formatEther(ethPrice.mul(10000000000)); const currentLiqFee = await cVault?.getFee(reqTcap); const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); + setTcapBalance(tcapBalanceText); setTcapPrice(tcapPriceText); setRequiredTcap(reqTcapText); setReward(liqRewardText); setRewardUSD(toUSD(liqRewardText, priceText).toFixed(2)); - setLiquidationFee(ethFee.toString()); + setBurnFee(ethFee); + setBurnFeeUsd(toUSD(ethFee, ethPriceText).toFixed(2)); } } } @@ -133,27 +147,34 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } event.preventDefault(); if (currentAddress && canLiquidate && currentVault) { setCanLiquidate(false); - if (maxTcap && parseFloat(maxTcap) > 0) { - if (parseFloat(maxTcap) >= parseFloat(requiredTcap)) { - try { - const currentLiqFee = await currentVault?.getFee(ethers.utils.parseEther(requiredTcap)); - const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setLiquidationFee(ethFee); - const tx = await currentVault.liquidateVault( - BigNumber.from(vaultId), - ethers.utils.parseEther(maxTcap), - { value: increasedFee } - ); - notifyUser(tx, refresh); - refresh(); - setMaxTcap(""); - onHide(); - } catch (error) { - errorNotification("Burn fee less than required."); + const maxAmountTcap = parseFloat(maxTcap); + if (maxTcap && maxAmountTcap > 0) { + if (maxAmountTcap >= parseFloat(requiredTcap)) { + if (maxAmountTcap <= parseFloat(tcapBalance)) { + try { + const currentLiqFee = await currentVault?.getFee( + ethers.utils.parseEther(requiredTcap) + ); + const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee); + const tx = await currentVault.liquidateVault( + BigNumber.from(vaultId), + ethers.utils.parseEther(maxTcap), + { value: increasedFee } + ); + notifyUser(tx, refresh); + refresh(); + setMaxTcap(""); + onHide(); + } catch (error) { + errorNotification("Burn fee less than required."); + } + } else { + errorNotification("Not enough TCAP balance."); } } else { - errorNotification("Tcap amount is less than required"); + errorNotification("Tcap amount is less than required."); } } else { errorNotification("Field can't be empty"); @@ -162,6 +183,8 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } } }; + const netReward = parseFloat(rewardUSD) - parseFloat(maxTcapUSD) - parseFloat(burnFeeUsd); + return ( { - setMaxTcap(""); + setMaxTcap("0"); + setMaxTcapUSD("0"); onHide(); }} > @@ -219,34 +243,38 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } />{" "} {vaultType === "WETH" ? "ETH" : vaultType} + +
- USD:{" "} + Burn Fee:{" "} + />{" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"}
- - - Burn Fee:{" "} - {" "} - {currentNetwork.chainId === NETWORKS.polygon.chainId ? "MATIC" : "ETH"} - +
-
- {v.status === "liquidation" && currentAddress !== "" ? ( - - ) : ( - {capitalize(v.status)} - )} -
+
{statusTag(index, v)}
export const sortRatioAsc = (a: VaultsType, b: VaultsType) => a.ratio - b.ratio; export const sortRatioDesc = (a: VaultsType, b: VaultsType) => b.ratio - a.ratio; + +export const sortRewardAsc = (a: VaultsType, b: VaultsType) => a.ratio - b.ratio; + +export const sortRewardDesc = (a: VaultsType, b: VaultsType) => a.ratio - b.ratio; diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 47e4c15..8949449 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -384,6 +384,72 @@ export const Monitoring = () => { } }; + /* const calculateNetRewardUsd = async (vaultId: string, vaultType: string) => { + let cVault = vaults.wethVault; + let cVaultRead = vaults.wethVaultRead; + let vaultPrice = oraclePrices?.wethOraclePrice; + + switch (vaultType) { + case "DAI": + cVault = vaults.daiVault; + cVaultRead = vaults.daiVaultRead; + vaultPrice = oraclePrices?.daiOraclePrice; + break; + case "AAVE": + cVault = vaults.aaveVault; + cVaultRead = vaults.aaveVaultRead; + vaultPrice = oraclePrices?.aaveOraclePrice; + break; + case "LINK": + cVault = vaults.linkVault; + cVaultRead = vaults.linkVaultRead; + vaultPrice = oraclePrices?.linkOraclePrice; + break; + case "SNX": + cVault = vaults.snxVault; + cVaultRead = vaults.snxVaultRead; + vaultPrice = oraclePrices?.snxOraclePrice; + break; + case "UNI": + cVault = vaults.uniVault; + cVaultRead = vaults.uniVaultRead; + vaultPrice = oraclePrices?.uniOraclePrice; + break; + case "MATIC": + cVault = vaults.maticVault; + cVaultRead = vaults.maticVaultRead; + vaultPrice = oraclePrices?.maticOraclePrice; + break; + case "WBTC": + cVault = vaults.wbtcVault; + cVaultRead = vaults.wbtcVaultRead; + vaultPrice = oraclePrices?.wbtcOraclePrice; + break; + default: + cVault = vaults.wethVault; + cVaultRead = vaults.wethVaultRead; + vaultPrice = oraclePrices?.wethOraclePrice; + break; + } + + const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); + const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); + // @ts-ignore + const [reqTcap, liqReward] = await signer.ethcallProvider?.all([reqTcapCall, liqRewardCall]); + + const reqTcapText = ethers.utils.formatEther(reqTcap); + const liqRewardText = ethers.utils.formatEther(liqReward); + const currentLiqFee = await cVault?.getFee(reqTcap); + const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + + return ( + toUSD(liqRewardText, vaultPrice || "0") - + toUSD(reqTcapText, oraclePrices?.tcapOraclePrice || "0") - + toUSD(ethFee, oraclePrices?.wethOraclePrice || "0") + ); + }; */ + const calculateVaultData = ( collateralWei: ethers.BigNumberish, debtWei: ethers.BigNumberish, @@ -420,7 +486,7 @@ export const Monitoring = () => { setSkipQuery(true); setLoadMore(false); // @ts-ignore - vaultsData.vaults.forEach((v) => { + vaultsData.vaults.forEach(async (v) => { const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = calculateVaultData(v.collateral, v.debt, v.tokenSymbol); @@ -430,6 +496,16 @@ export const Monitoring = () => { } if (addVault) { + let vaultUrl = ""; + const netReward = 0; + const symbol = v.tokenSymbol === "WETH" ? "ETH" : v.tokenSymbol; + if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { + vaultUrl = window.location.origin.concat("/vault/").concat(symbol); + } + /* if (currentStatus === "liquidation") { + netReward = await calculateNetRewardUsd(v.vaultId, symbol); + } */ + vData.push({ id: v.vaultId, collateralSymbol: v.tokenSymbol, @@ -439,8 +515,10 @@ export const Monitoring = () => { debtUsd: debtUSD.toFixed(2), ratio, minRatio: minRatio.toString(), + netReward, status, blockTS: v.blockTS, + url: vaultUrl, }); totals.vaults += 1; @@ -583,8 +661,10 @@ export const Monitoring = () => { debtUsd: debtUSD.toFixed(2), ratio, minRatio: minRatio.toString(), + netReward: 0, status, blockTS: vaultList[index].blockTS, + url: vaultList[index].url, }; allVaults[index] = v; setVaultList(allVaults); diff --git a/src/components/Vault/Monitoring/types.tsx b/src/components/Vault/Monitoring/types.tsx index 2629261..cff2616 100644 --- a/src/components/Vault/Monitoring/types.tsx +++ b/src/components/Vault/Monitoring/types.tsx @@ -41,8 +41,10 @@ export type VaultsType = { debtUsd: string; ratio: number; minRatio: string; + netReward: number; status: string; blockTS: string; + url: string; }; export type VaultsTotalsType = { diff --git a/src/styles/modal.scss b/src/styles/modal.scss index aabede6..ea7dce6 100644 --- a/src/styles/modal.scss +++ b/src/styles/modal.scss @@ -194,6 +194,20 @@ } } } + table.liq-info { + margin-top: 3rem !important; + th { + text-align: right; + border-bottom: 1px; + } + td { + text-align: right; + } + .net-reward { + font-size: 18px; + text-shadow: 0 0 4px #e440f2,0 0 10px #e98ff1,0 0 20px #e440f2,0 -10px 40px #b626c4; + } + } .progress { height: 2rem; diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 4ac9341..03abaff 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -214,6 +214,9 @@ background: transparent; border: 0.8px solid #f28040; } + a { + color: $white; + } } .empty { text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; From ed48bea87273881e767139577bf821d13c9115dd Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 17 Mar 2022 15:09:53 -0600 Subject: [PATCH 067/278] show net reward on table when status=liquidation --- src/components/Vault/Monitoring/Vaults.tsx | 51 +++++++++++++++- src/components/Vault/Monitoring/common.tsx | 4 +- src/components/Vault/Monitoring/index.tsx | 69 ++++++++++++++++------ 3 files changed, 104 insertions(+), 20 deletions(-) diff --git a/src/components/Vault/Monitoring/Vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx index c14c2ff..bbfeb9a 100644 --- a/src/components/Vault/Monitoring/Vaults.tsx +++ b/src/components/Vault/Monitoring/Vaults.tsx @@ -21,17 +21,27 @@ import { sortDebtAsc, sortRatioDesc, sortRatioAsc, + sortRewardDesc, + sortRewardAsc, } from "./common"; type dataType = { currentAddress: string; vaults: Array; setVaults: (v: Array) => void; + currentStatus: string; pagination: PaginationType; refresh: (index: number, symbol: string) => void; }; -export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh }: dataType) => { +export const Vaults = ({ + currentAddress, + vaults, + setVaults, + currentStatus, + pagination, + refresh, +}: dataType) => { const [showLiquidate, setShowLiquidate] = useState(false); const [vaultIndex, setVaultIndex] = useState(-1); const [vaultId, setVaultId] = useState(""); @@ -40,6 +50,16 @@ export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh const [collateralUsdSort, setCollateralUsdSort] = useState(0); const [debtSort, setDebtSort] = useState(0); const [ratioSort, setRatioSort] = useState(0); + const [rewardSort, setRewardSort] = useState(0); + // const [renderReward, setRenderReward] = useState(false); + + /* useEffect(() => { + if (loadingLiq) { + console.log("ntra aqui"); + setRenderReward(!renderReward); + } + // eslint-disable-next-line + }, [loadingLiq]); */ const liquidateVault = (index: number, id: string, type: string) => { setVaultId(id); @@ -61,6 +81,9 @@ export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh if (current !== 4) { setRatioSort(0); } + if (current !== 5) { + setRewardSort(0); + } }; const onSortCollateralClick = () => { @@ -107,6 +130,17 @@ export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh resetSortTypes(4); }; + const onSortRewardClick = () => { + const sortType = rewardSort === 1 ? 2 : 1; + if (sortType === 1) { + setVaults(vaults.sort(sortRewardDesc)); + } else { + setVaults(vaults.sort(sortRewardAsc)); + } + setRewardSort(sortType); + resetSortTypes(5); + }; + const sortingIncon = (sortOrder: number) => { if (sortOrder === 0) { return ; @@ -191,6 +225,14 @@ export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh {sortingIncon(ratioSort)} + {currentStatus === "liquidation" && ( + + Net Reward + +
+
+ ${v.netReward.toFixed(2)} +
+
+ + + + + + + + + + + + +
RewardRequired TCAPBurn FeeNet Reward
${numberFormatStr(rewardUSD, 2, 2)}${numberFormatStr(maxTcapUSD, 2, 2)}${numberFormatStr(burnFeeUsd, 2, 2)}${numberFormatStr(netReward.toFixed(2), 2, 2)}
- {loading || !pricesUpdated ? ( + {loading || !pricesUpdated || !liqLoaded ? ( ) : ( ) => setVaultList(v)} + currentStatus={currentStatus} pagination={pagination} refresh={updateLiquidatedVault} /> diff --git a/src/components/Vault/Monitoring/types.tsx b/src/components/Vault/Monitoring/types.tsx index 2629261..cff2616 100644 --- a/src/components/Vault/Monitoring/types.tsx +++ b/src/components/Vault/Monitoring/types.tsx @@ -41,8 +41,10 @@ export type VaultsType = { debtUsd: string; ratio: number; minRatio: string; + netReward: number; status: string; blockTS: string; + url: string; }; export type VaultsTotalsType = { diff --git a/src/components/Vault/Monitoring/vaults.tsx b/src/components/Vault/Monitoring/vaults.tsx index d793f74..bbfeb9a 100644 --- a/src/components/Vault/Monitoring/vaults.tsx +++ b/src/components/Vault/Monitoring/vaults.tsx @@ -21,17 +21,27 @@ import { sortDebtAsc, sortRatioDesc, sortRatioAsc, + sortRewardDesc, + sortRewardAsc, } from "./common"; type dataType = { currentAddress: string; vaults: Array; setVaults: (v: Array) => void; + currentStatus: string; pagination: PaginationType; refresh: (index: number, symbol: string) => void; }; -export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh }: dataType) => { +export const Vaults = ({ + currentAddress, + vaults, + setVaults, + currentStatus, + pagination, + refresh, +}: dataType) => { const [showLiquidate, setShowLiquidate] = useState(false); const [vaultIndex, setVaultIndex] = useState(-1); const [vaultId, setVaultId] = useState(""); @@ -40,6 +50,16 @@ export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh const [collateralUsdSort, setCollateralUsdSort] = useState(0); const [debtSort, setDebtSort] = useState(0); const [ratioSort, setRatioSort] = useState(0); + const [rewardSort, setRewardSort] = useState(0); + // const [renderReward, setRenderReward] = useState(false); + + /* useEffect(() => { + if (loadingLiq) { + console.log("ntra aqui"); + setRenderReward(!renderReward); + } + // eslint-disable-next-line + }, [loadingLiq]); */ const liquidateVault = (index: number, id: string, type: string) => { setVaultId(id); @@ -61,6 +81,9 @@ export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh if (current !== 4) { setRatioSort(0); } + if (current !== 5) { + setRewardSort(0); + } }; const onSortCollateralClick = () => { @@ -107,6 +130,17 @@ export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh resetSortTypes(4); }; + const onSortRewardClick = () => { + const sortType = rewardSort === 1 ? 2 : 1; + if (sortType === 1) { + setVaults(vaults.sort(sortRewardDesc)); + } else { + setVaults(vaults.sort(sortRewardAsc)); + } + setRewardSort(sortType); + resetSortTypes(5); + }; + const sortingIncon = (sortOrder: number) => { if (sortOrder === 0) { return ; @@ -117,6 +151,27 @@ export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh return ; }; + const statusTag = (index: number, v: VaultsType) => { + if (currentAddress === "") { + return {capitalize(v.status)}; + } + if (v.status === "liquidation") { + return ( + + ); + } + if (v.url !== "") { + return ( + + {capitalize(v.status)} + + ); + } + return {capitalize(v.status)}; + }; + return ( <> @@ -170,6 +225,14 @@ export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh {sortingIncon(ratioSort)} + {currentStatus === "liquidation" && ( + + )} @@ -178,15 +241,7 @@ export const Vaults = ({ currentAddress, vaults, setVaults, pagination, refresh return ( + {currentStatus === "liquidation" && ( + + )} ); })} diff --git a/src/styles/modal.scss b/src/styles/modal.scss index 96daedc..7d80cda 100644 --- a/src/styles/modal.scss +++ b/src/styles/modal.scss @@ -75,9 +75,11 @@ } .avatar { - height: 92%; - width: 80%; position: absolute; + height: 92%; + width: 65%; + margin-left: 20px; + cursor: pointer; } .image-group { @@ -91,7 +93,7 @@ } a { position: absolute; - margin-left: 20px; + margin-left: 35px; } } @@ -134,8 +136,10 @@ } input[type="file"] { background-color: $dark; - height: 90%; + height: 100%; width: 90%; + margin-left: 20px; + cursor: pointer; } .custom-file-label { border-color: $green; @@ -190,6 +194,20 @@ } } } + table.liq-info { + margin-top: 3rem !important; + th { + text-align: right; + border-bottom: 1px; + } + td { + text-align: right; + } + .net-reward { + font-size: 18px; + text-shadow: 0 0 4px #e440f2,0 0 10px #e98ff1,0 0 20px #e440f2,0 -10px 40px #b626c4; + } + } .progress { height: 2rem; @@ -244,5 +262,4 @@ overflow-x: scroll; } } - -} +} \ No newline at end of file From 62390fcfad08a123d73b47c8a5b3bd3638cd90b9 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 17 Mar 2022 15:38:17 -0600 Subject: [PATCH 069/278] more reward infoo added --- src/components/Vault/Monitoring/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index e4f8571..9621026 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -557,7 +557,7 @@ export const Monitoring = () => { setVaultList(vData); setVaultsTotals(totals); setLiqLoaded(true); - }, 500); + }, 560); }); } // Set pagination data From ba64a09487782d3fcff69c1a0a4569b281245fac Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 17 Mar 2022 15:56:40 -0600 Subject: [PATCH 070/278] show just ETH and DAI --- src/components/Vault/Monitoring/Vaults.tsx | 9 --------- src/components/Vault/Monitoring/index.tsx | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/components/Vault/Monitoring/Vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx index bbfeb9a..ae7fd88 100644 --- a/src/components/Vault/Monitoring/Vaults.tsx +++ b/src/components/Vault/Monitoring/Vaults.tsx @@ -51,15 +51,6 @@ export const Vaults = ({ const [debtSort, setDebtSort] = useState(0); const [ratioSort, setRatioSort] = useState(0); const [rewardSort, setRewardSort] = useState(0); - // const [renderReward, setRenderReward] = useState(false); - - /* useEffect(() => { - if (loadingLiq) { - console.log("ntra aqui"); - setRenderReward(!renderReward); - } - // eslint-disable-next-line - }, [loadingLiq]); */ const liquidateVault = (index: number, id: string, type: string) => { setVaultId(id); diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 9621026..3bbf380 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -58,7 +58,7 @@ type liqVaultsTempType = { vaultId: string; vaultType: string; }; -const showAllVaults = true; +const showAllVaults = false; export const Monitoring = () => { const currentNetwork = useContext(NetworkContext); From 9a2b06336b073cc58873440b1f701566d40281ac Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 17 Mar 2022 15:57:51 -0600 Subject: [PATCH 071/278] fix timing --- src/components/Vault/Monitoring/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index e4f8571..ae43fd5 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -557,7 +557,7 @@ export const Monitoring = () => { setVaultList(vData); setVaultsTotals(totals); setLiqLoaded(true); - }, 500); + }, 580); }); } // Set pagination data From 7843006548fbd116fe94d7960e0caa6cb0b9df76 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 17 Mar 2022 16:13:15 -0600 Subject: [PATCH 072/278] fixed show just liquidable vaults --- src/components/Vault/Monitoring/index.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 3bbf380..0cedbe4 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -500,12 +500,12 @@ export const Monitoring = () => { calculateVaultData(v.collateral, v.debt, v.tokenSymbol); let addVault = true; - if (currentStatus === "active" || currentStatus === "liquidation") { - addVault = currentStatus === status; - } if (!showAllVaults) { addVault = v.tokenSymbol === "WETH" || v.tokenSymbol === "DAI"; } + if (addVault && (currentStatus === "active" || currentStatus === "liquidation")) { + addVault = currentStatus === status; + } if (addVault) { let vaultUrl = ""; const symbol = v.tokenSymbol === "WETH" ? "ETH" : v.tokenSymbol; From d0a4eec2f59dbd44e0db54a42ae97ad7b7af4c74 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 17 Mar 2022 20:10:44 -0600 Subject: [PATCH 073/278] fixed net reward showing 0 sometimes --- src/components/Vault/Monitoring/common.tsx | 7 ++++ src/components/Vault/Monitoring/index.tsx | 46 +++++++++++----------- src/components/Vault/Monitoring/vaults.tsx | 16 +++----- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/components/Vault/Monitoring/common.tsx b/src/components/Vault/Monitoring/common.tsx index 8474b16..2a7a721 100644 --- a/src/components/Vault/Monitoring/common.tsx +++ b/src/components/Vault/Monitoring/common.tsx @@ -13,6 +13,13 @@ type iconProps = { name: string; }; +export const VAULT_STATUS = { + empty: "empty", + ready: "ready", + active: "active", + liquidation: "liquidation", +}; + export const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); export const CollateralIcon = ({ name }: iconProps) => { diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index e4f8571..ff73297 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -34,7 +34,7 @@ import { VaultsType, VaultsTotalsType, } from "./types"; -import { capitalize, CollateralIcon, numberFormatStr } from "./common"; +import { capitalize, CollateralIcon, numberFormatStr, VAULT_STATUS } from "./common"; const pagDefault = { previous: 0, @@ -78,7 +78,7 @@ export const Monitoring = () => { const [radioValue, setRadioValue] = useState("1"); const [tokenSymbol, setTokenSymbol] = useState("all"); const [currentStatus, setCurrentStatus] = useState("all"); - const [liqLoaded, setLiqLoaded] = useState(false); + // const [liqLoaded, setLiqLoaded] = useState(false); const [renderTable, setRenderTable] = useState(false); const radios = [ { name: "All Vaults", value: "1" }, @@ -94,10 +94,10 @@ export const Monitoring = () => { ]; const statusList = [ { key: "all", name: "All" }, - { key: "empty", name: "Empty" }, - { key: "ready", name: "Ready" }, - { key: "active", name: "Active" }, - { key: "liquidation", name: "Liquidation" }, + { key: VAULT_STATUS.empty, name: "Empty" }, + { key: VAULT_STATUS.ready, name: "Ready" }, + { key: VAULT_STATUS.active, name: "Active" }, + { key: VAULT_STATUS.liquidation, name: "Liquidation" }, ]; const buildFilters = () => { @@ -475,13 +475,13 @@ export const Monitoring = () => { oraclePrices?.tcapOraclePrice || "1" ); - let status = "liquidation"; - if (parseFloat(collateralText) < 0.0000001) { - status = "empty"; - } else if (parseFloat(collateralText) >= 0.0000001 && parseFloat(debtText) < 0.0000001) { - status = "ready"; + let status = VAULT_STATUS.liquidation; + if (parseFloat(collateralText) < 0.0000000001) { + status = VAULT_STATUS.empty; + } else if (parseFloat(collateralText) >= 0.0000000001 && parseFloat(debtText) < 0.0000000001) { + status = VAULT_STATUS.ready; } else if (ratio >= minRatio) { - status = "active"; + status = VAULT_STATUS.active; } return { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status }; }; @@ -493,14 +493,14 @@ export const Monitoring = () => { setSkipQuery(true); setLoadMore(false); - setLiqLoaded(currentStatus !== "liquidation"); + // setLiqLoaded(currentStatus !== VAULT_STATUS.liquidation); // @ts-ignore vaultsData.vaults.forEach((v) => { const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = calculateVaultData(v.collateral, v.debt, v.tokenSymbol); let addVault = true; - if (currentStatus === "active" || currentStatus === "liquidation") { + if (currentStatus === VAULT_STATUS.active || currentStatus === VAULT_STATUS.liquidation) { addVault = currentStatus === status; } if (!showAllVaults) { @@ -512,7 +512,7 @@ export const Monitoring = () => { if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { vaultUrl = window.location.origin.concat("/vault/").concat(symbol); } - if (currentStatus === "liquidation") { + if (currentStatus === VAULT_STATUS.liquidation) { vLiquidables.push({ vaultId: v.vaultId, vaultType: v.tokenSymbol, @@ -541,23 +541,23 @@ export const Monitoring = () => { totals.debtUSD = (parseFloat(totals.debtUSD) + debtUSD).toFixed(2); } }); - if (currentStatus !== "liquidation") { + if (currentStatus !== VAULT_STATUS.liquidation) { setVaultList(vData); setVaultsTotals(totals); } else { const loadNetReward = async () => { vLiquidables.forEach((l, index) => { calculateNetRewardUsd(l.vaultId, l.vaultType).then((result) => { - vData[index].netReward = result; + const newA = [...vData]; + newA[index].netReward = result; + setVaultList(newA); }); }); }; loadNetReward().then(() => { - setTimeout(function () { - setVaultList(vData); - setVaultsTotals(totals); - setLiqLoaded(true); - }, 500); + setVaultList(vData); + setVaultsTotals(totals); + // setLiqLoaded(true); }); } // Set pagination data @@ -831,7 +831,7 @@ export const Monitoring = () => { )} - {loading || !pricesUpdated || !liqLoaded ? ( + {loading || !pricesUpdated ? ( ) : ( { - if (loadingLiq) { - console.log("ntra aqui"); - setRenderReward(!renderReward); - } - // eslint-disable-next-line - }, [loadingLiq]); */ const liquidateVault = (index: number, id: string, type: string) => { setVaultId(id); @@ -155,7 +147,7 @@ export const Vaults = ({ if (currentAddress === "") { return {capitalize(v.status)}; } - if (v.status === "liquidation") { + if (v.status === VAULT_STATUS.liquidation) { return ( )} From a96c1580aac22962277a502c6e04de98b7f386e0 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 17 Mar 2022 20:13:33 -0600 Subject: [PATCH 074/278] deleting commented code --- src/components/Vault/Monitoring/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index ff73297..21822fb 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -78,7 +78,6 @@ export const Monitoring = () => { const [radioValue, setRadioValue] = useState("1"); const [tokenSymbol, setTokenSymbol] = useState("all"); const [currentStatus, setCurrentStatus] = useState("all"); - // const [liqLoaded, setLiqLoaded] = useState(false); const [renderTable, setRenderTable] = useState(false); const radios = [ { name: "All Vaults", value: "1" }, @@ -557,7 +556,6 @@ export const Monitoring = () => { loadNetReward().then(() => { setVaultList(vData); setVaultsTotals(totals); - // setLiqLoaded(true); }); } // Set pagination data From 7ab1e48078f8b291850b3bbfe75d32760cb7bbe9 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 17 Mar 2022 20:27:50 -0600 Subject: [PATCH 075/278] fixed reward showing 0 sometimes --- src/components/Vault/Monitoring/common.tsx | 7 ++++ src/components/Vault/Monitoring/index.tsx | 44 +++++++++++----------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/components/Vault/Monitoring/common.tsx b/src/components/Vault/Monitoring/common.tsx index 8474b16..2a7a721 100644 --- a/src/components/Vault/Monitoring/common.tsx +++ b/src/components/Vault/Monitoring/common.tsx @@ -13,6 +13,13 @@ type iconProps = { name: string; }; +export const VAULT_STATUS = { + empty: "empty", + ready: "ready", + active: "active", + liquidation: "liquidation", +}; + export const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); export const CollateralIcon = ({ name }: iconProps) => { diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index ae43fd5..21822fb 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -34,7 +34,7 @@ import { VaultsType, VaultsTotalsType, } from "./types"; -import { capitalize, CollateralIcon, numberFormatStr } from "./common"; +import { capitalize, CollateralIcon, numberFormatStr, VAULT_STATUS } from "./common"; const pagDefault = { previous: 0, @@ -78,7 +78,6 @@ export const Monitoring = () => { const [radioValue, setRadioValue] = useState("1"); const [tokenSymbol, setTokenSymbol] = useState("all"); const [currentStatus, setCurrentStatus] = useState("all"); - const [liqLoaded, setLiqLoaded] = useState(false); const [renderTable, setRenderTable] = useState(false); const radios = [ { name: "All Vaults", value: "1" }, @@ -94,10 +93,10 @@ export const Monitoring = () => { ]; const statusList = [ { key: "all", name: "All" }, - { key: "empty", name: "Empty" }, - { key: "ready", name: "Ready" }, - { key: "active", name: "Active" }, - { key: "liquidation", name: "Liquidation" }, + { key: VAULT_STATUS.empty, name: "Empty" }, + { key: VAULT_STATUS.ready, name: "Ready" }, + { key: VAULT_STATUS.active, name: "Active" }, + { key: VAULT_STATUS.liquidation, name: "Liquidation" }, ]; const buildFilters = () => { @@ -475,13 +474,13 @@ export const Monitoring = () => { oraclePrices?.tcapOraclePrice || "1" ); - let status = "liquidation"; - if (parseFloat(collateralText) < 0.0000001) { - status = "empty"; - } else if (parseFloat(collateralText) >= 0.0000001 && parseFloat(debtText) < 0.0000001) { - status = "ready"; + let status = VAULT_STATUS.liquidation; + if (parseFloat(collateralText) < 0.0000000001) { + status = VAULT_STATUS.empty; + } else if (parseFloat(collateralText) >= 0.0000000001 && parseFloat(debtText) < 0.0000000001) { + status = VAULT_STATUS.ready; } else if (ratio >= minRatio) { - status = "active"; + status = VAULT_STATUS.active; } return { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status }; }; @@ -493,14 +492,14 @@ export const Monitoring = () => { setSkipQuery(true); setLoadMore(false); - setLiqLoaded(currentStatus !== "liquidation"); + // setLiqLoaded(currentStatus !== VAULT_STATUS.liquidation); // @ts-ignore vaultsData.vaults.forEach((v) => { const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = calculateVaultData(v.collateral, v.debt, v.tokenSymbol); let addVault = true; - if (currentStatus === "active" || currentStatus === "liquidation") { + if (currentStatus === VAULT_STATUS.active || currentStatus === VAULT_STATUS.liquidation) { addVault = currentStatus === status; } if (!showAllVaults) { @@ -512,7 +511,7 @@ export const Monitoring = () => { if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { vaultUrl = window.location.origin.concat("/vault/").concat(symbol); } - if (currentStatus === "liquidation") { + if (currentStatus === VAULT_STATUS.liquidation) { vLiquidables.push({ vaultId: v.vaultId, vaultType: v.tokenSymbol, @@ -541,23 +540,22 @@ export const Monitoring = () => { totals.debtUSD = (parseFloat(totals.debtUSD) + debtUSD).toFixed(2); } }); - if (currentStatus !== "liquidation") { + if (currentStatus !== VAULT_STATUS.liquidation) { setVaultList(vData); setVaultsTotals(totals); } else { const loadNetReward = async () => { vLiquidables.forEach((l, index) => { calculateNetRewardUsd(l.vaultId, l.vaultType).then((result) => { - vData[index].netReward = result; + const newA = [...vData]; + newA[index].netReward = result; + setVaultList(newA); }); }); }; loadNetReward().then(() => { - setTimeout(function () { - setVaultList(vData); - setVaultsTotals(totals); - setLiqLoaded(true); - }, 580); + setVaultList(vData); + setVaultsTotals(totals); }); } // Set pagination data @@ -831,7 +829,7 @@ export const Monitoring = () => { )} - {loading || !pricesUpdated || !liqLoaded ? ( + {loading || !pricesUpdated ? ( ) : ( Date: Thu, 17 Mar 2022 21:19:37 -0600 Subject: [PATCH 076/278] not show WBTC --- src/components/Vault/Monitoring/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 21822fb..64d2cea 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -505,7 +505,7 @@ export const Monitoring = () => { if (!showAllVaults) { addVault = v.tokenSymbol === "WETH" || v.tokenSymbol === "DAI"; } - if (addVault) { + if (addVault && v.tokenSymbol !== "WBTC") { let vaultUrl = ""; const symbol = v.tokenSymbol === "WETH" ? "ETH" : v.tokenSymbol; if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { From 3fbfcc639f902e0f976d4665baa2c473f3794fb7 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 18 Mar 2022 13:04:09 -0600 Subject: [PATCH 077/278] working --- src/components/Farm/UniV3Rewards/Rewards.tsx | 36 +++++++++++++++++++- src/components/Farm/UniV3Rewards/index.tsx | 15 ++------ src/utils/constants.tsx | 9 +++++ 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index d1abfd7..2c127e1 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -1,8 +1,42 @@ import React from "react"; import Card from "react-bootstrap/esm/Card"; +import { useQuery, gql } from "@apollo/client"; const Rewards = () => { - console.log("--"); + const OWNER_POOLS = gql` + query ownerPools($owner: string) { + positions (where: {owner: $owner}) { + id + pool { + id + } + token0 { + id + symbol + } + token1 { + id + symbol + } + liquidity + } + } + `; + + + + const { loading, data, error } = useQuery(OWNER_POOLS, { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + variables: { "0x" }, + onError: () => { + console.log(error); + }, + onCompleted: () => { + + }, + }); + return (

Entra

diff --git a/src/components/Farm/UniV3Rewards/index.tsx b/src/components/Farm/UniV3Rewards/index.tsx index 6630890..285e727 100644 --- a/src/components/Farm/UniV3Rewards/index.tsx +++ b/src/components/Farm/UniV3Rewards/index.tsx @@ -4,7 +4,7 @@ import { Contract } from "ethers-multicall"; import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; import NetworkContext from "../../../state/NetworkContext"; import SignerContext from "../../../state/SignerContext"; -import { GRAPHQL_ENDPOINT, NETWORKS, UNIV3 } from "../../../utils/constants"; +import { GRAPHQL_UNIV3_ENDPOINT, NETWORKS, UNIV3 } from "../../../utils/constants"; import { toFragment } from "../../../utils/utils"; import NonfungiblePositionManager from "../../../contracts/NonfungiblePositionManager.json"; import Rewards from "./Rewards"; @@ -24,7 +24,7 @@ const UniV3Rewards = ({ address }: props) => { const signer = useContext(SignerContext); const [apolloClient, setApolloClient] = useState( clientOracle( - process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.rinkeby + process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_UNIV3_ENDPOINT.mainnet : GRAPHQL_UNIV3_ENDPOINT.rinkeby ) ); const [lpTokens, setLpTokens] = useState([]); @@ -64,17 +64,6 @@ const UniV3Rewards = ({ address }: props) => { useEffect(() => { const load = () => { loadLPTokens(); - switch (currentNetwork.chainId) { - case NETWORKS.mainnet.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); - break; - case NETWORKS.rinkeby.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.rinkeby)); - break; - default: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); - break; - } }; load(); // eslint-disable-next-line diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 52b6acc..912c1a0 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -71,6 +71,10 @@ export const NETWORKS = { export const UNIV3 = { NFPositionManager: "0xC36442b4a4522E871399CD717aBDD847Ab11FE88", Staker: "0xe34139463bA50bD61336E0c446Bd8C0867c6fE65", + pools: [ + "0x0001fcbba8eb491c3ccfeddc5a5caba1a98c4c28", + "0x0002e63328169d7feea121f1e32e4f620abf0352", + ] }; export const API_ENDPOINT = "https://api.cryptex.finance"; @@ -83,6 +87,11 @@ export const GRAPHQL_ENDPOINT = { polygon: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-polygon", }; +export const GRAPHQL_UNIV3_ENDPOINT = { + mainnet: "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", + rinkeby: "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", +} + export const FEATURES = { KEEPERS_API: false, NEW_VAULTS: true, From 29562a130dabdbf6354d5901569869e2b5876ac7 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 18 Mar 2022 13:35:43 -0600 Subject: [PATCH 078/278] new vaults disbled --- src/components/Graph.tsx | 34 ++++++++++++----------- src/components/Vault/Details.tsx | 33 +++++++++++++++++++--- src/components/Vault/Monitoring/index.tsx | 8 +++--- src/utils/constants.tsx | 2 +- 4 files changed, 52 insertions(+), 25 deletions(-) diff --git a/src/components/Graph.tsx b/src/components/Graph.tsx index b78a62a..9842c46 100644 --- a/src/components/Graph.tsx +++ b/src/components/Graph.tsx @@ -29,7 +29,7 @@ import { toUSD, validOracles, } from "../utils/utils"; -import { NETWORKS } from "../utils/constants"; +import { NETWORKS, FEATURES } from "../utils/constants"; import Loading from "./Loading"; const Graph = () => { @@ -363,22 +363,24 @@ const Graph = () => { />{" "}
- - -

Total Staked in AAVE

-
- {" "} - AAVE -
-
+ {FEATURES.NEW_VAULTS && ( + + +

Total Staked in AAVE

+
+ {" "} + AAVE +
+
+ )} )} - {!isPolygon(currentNetwork.chainId) && ( + {!isPolygon(currentNetwork.chainId) && FEATURES.NEW_VAULTS && ( <> @@ -395,7 +397,7 @@ const Graph = () => { )} - {isOptimism(currentNetwork.chainId) && ( + {isOptimism(currentNetwork.chainId) && FEATURES.NEW_VAULTS && ( <> diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index df911d1..a5d7ec3 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -80,7 +80,7 @@ const Details = ({ address }: props) => { currency = "DAI"; break; case "aave": - if (isInLayer1(currentNetwork.chainId)) { + if (isInLayer1(currentNetwork.chainId) && FEATURES.NEW_VAULTS) { currency = "AAVE"; } else { currency = "ETH"; @@ -88,13 +88,29 @@ const Details = ({ address }: props) => { } break; case "link": - if (!isPolygon(currentNetwork.chainId)) { + if (!isPolygon(currentNetwork.chainId) && FEATURES.NEW_VAULTS) { currency = "LINK"; } else { currency = "ETH"; history?.push(`/vault/ETH`); } break; + case "uni": + if (isOptimism(currentNetwork.chainId) && FEATURES.NEW_VAULTS) { + currency = "UNI"; + } else { + currency = "ETH"; + history?.push(`/vault/ETH`); + } + break; + case "snx": + if (isOptimism(currentNetwork.chainId) && FEATURES.NEW_VAULTS) { + currency = "SNX"; + } else { + currency = "ETH"; + history?.push(`/vault/ETH`); + } + break; case "matic": currency = "MATIC"; if (!FEATURES.POLYGON && !isPolygon(currentNetwork.chainId)) { @@ -924,9 +940,18 @@ const Details = ({ address }: props) => { useEffect(() => { async function load() { - let vOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; + let vOptions = ["ETH", "WETH", "DAI"]; + if (isInLayer1(currentNetwork.chainId) && FEATURES.NEW_VAULTS) { + vOptions.push("AAVE"); + vOptions.push("LINK"); + } if (isOptimism(currentNetwork.chainId)) { - vOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; + vOptions = ["ETH", "DAI"]; + if (FEATURES.NEW_VAULTS) { + vOptions.push("LINK"); + vOptions.push("UNI"); + vOptions.push("SNX"); + } } if (isPolygon(currentNetwork.chainId)) { vOptions = ["MATIC", "DAI"]; diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 4246f37..2f74eb6 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -14,6 +14,7 @@ import OraclesContext from "../../../state/OraclesContext"; import SignerContext from "../../../state/SignerContext"; import vaultsContext from "../../../state/VaultsContext"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; +import { FEATURES } from "../../../utils/constants"; import { getRatio2, isInLayer1, @@ -58,7 +59,6 @@ type liqVaultsTempType = { vaultId: string; vaultType: string; }; -const showAllVaults = false; export const Monitoring = () => { const currentNetwork = useContext(NetworkContext); @@ -499,7 +499,7 @@ export const Monitoring = () => { calculateVaultData(v.collateral, v.debt, v.tokenSymbol); let addVault = true; - if (!showAllVaults) { + if (!FEATURES.NEW_VAULTS) { addVault = v.tokenSymbol === "WETH" || v.tokenSymbol === "DAI"; } if (addVault && (currentStatus === "active" || currentStatus === "liquidation")) { @@ -594,14 +594,14 @@ export const Monitoring = () => { if (isInLayer1(currentNetwork.chainId)) { symbols.push({ key: "weth", name: "ETH" }); symbols.push({ key: "dai", name: "DAI" }); - if (showAllVaults) { + if (FEATURES.NEW_VAULTS) { symbols.push({ key: "aave", name: "AAVE" }); symbols.push({ key: "link", name: "LINK" }); } } else if (isOptimism(currentNetwork.chainId)) { symbols.push({ key: "eth", name: "ETH" }); symbols.push({ key: "dai", name: "DAI" }); - if (showAllVaults) { + if (FEATURES.NEW_VAULTS) { symbols.push({ key: "link", name: "LINK" }); symbols.push({ key: "uni", name: "UNI" }); symbols.push({ key: "snx", name: "SNX" }); diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 1fbd184..2323678 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -80,7 +80,7 @@ export const GRAPHQL_ENDPOINT = { export const FEATURES = { KEEPERS_API: false, - NEW_VAULTS: true, + NEW_VAULTS: false, OPTIMISM: true, POLYGON: false, }; From 9c30e5c856256e5f7e0e4f8e96cd20e2c9981824 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 18 Mar 2022 17:20:18 -0600 Subject: [PATCH 079/278] added WETH to optimism --- src/components/Vault/Details.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index a5d7ec3..39f26f0 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -946,7 +946,7 @@ const Details = ({ address }: props) => { vOptions.push("LINK"); } if (isOptimism(currentNetwork.chainId)) { - vOptions = ["ETH", "DAI"]; + vOptions = ["ETH", "WETH", "DAI"]; if (FEATURES.NEW_VAULTS) { vOptions.push("LINK"); vOptions.push("UNI"); From 194d11584b9d4d9488a91dc6d2134b2087f17c50 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 23 Mar 2022 18:58:25 -0600 Subject: [PATCH 080/278] testing staking --- .eslintrc | 1 + src/components/Farm/UniV3Rewards/Rewards.tsx | 268 +++++++++++++++++- src/components/Farm/UniV3Rewards/Stake.tsx | 107 +++++++ src/components/Farm/UniV3Rewards/index.tsx | 101 ++++--- src/components/Farm/UniV3Rewards/types.tsx | 25 ++ src/components/Farm/index.tsx | 4 +- src/contracts/NonfungiblePositionManager.json | 21 +- src/styles/farm.scss | 18 +- src/utils/constants.tsx | 14 - src/utils/univ3.tsx | 54 ++++ src/utils/utils.tsx | 4 +- 11 files changed, 522 insertions(+), 95 deletions(-) create mode 100644 src/components/Farm/UniV3Rewards/Stake.tsx create mode 100644 src/components/Farm/UniV3Rewards/types.tsx create mode 100644 src/utils/univ3.tsx diff --git a/.eslintrc b/.eslintrc index e53d468..056e32d 100644 --- a/.eslintrc +++ b/.eslintrc @@ -37,6 +37,7 @@ "no-debugger": 0, "no-alert": 0, "no-await-in-loop": 0, + "react/prop-types": "off", "no-return-assign": [ "error", "except-parens" diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 2c127e1..48e8506 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -1,11 +1,62 @@ -import React from "react"; +import React, { useContext, useState } from "react"; +import Button from "react-bootstrap/esm/Button"; import Card from "react-bootstrap/esm/Card"; +import Table from "react-bootstrap/esm/Table"; +import { BigNumber, ethers } from "ethers"; +import NumberFormat from "react-number-format"; +import { Contract } from "ethers-multicall"; import { useQuery, gql } from "@apollo/client"; +import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; +import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; +import NetworkContext from "../../../state/NetworkContext"; +import { SignerContext } from "../../../state/SignerContext"; +import TokensContext from "../../../state/TokensContext"; +import { NETWORKS } from "../../../utils/constants"; +import { UNIV3, computeIncentiveId } from "../../../utils/univ3"; +import { capitalize } from "../../../utils/utils"; +import Stake from "./Stake"; +import { IncentiveType, PositionType, StakeStatus } from "./types"; -const Rewards = () => { - const OWNER_POOLS = gql` - query ownerPools($owner: string) { - positions (where: {owner: $owner}) { +type props = { + ownerAddress: string; + signer: SignerContext; + stakerContract: ethers.Contract | undefined; + stakerContractRead: Contract | undefined; + nfpmContract: ethers.Contract | undefined; + nfpmContractRead: Contract | undefined; +}; + +type btnProps = { + position: PositionType; +}; + +const positionDefault = { + lpTokenId: 0, + poolId: "", + liquidity: "0.00", + tickLower: 0, + tickUpper: 0, + incetiveId: "", + reward: 0, + status: StakeStatus.empty, +}; + +const Rewards = ({ + ownerAddress, + signer, + stakerContract, + stakerContractRead, + nfpmContract, + nfpmContractRead, +}: props) => { + const tokens = useContext(TokensContext); + const currentNetwork = useContext(NetworkContext); + const [ethTcapIncentive, setEthTcapIncentive] = useState>([]); + const [ethTcapPositions, setEthTcapPositions] = useState>([]); + + const OWNER_POSITIONS = gql` + query ownerPools($owner: String!) { + positions(where: { owner: $owner }) { id pool { id @@ -18,28 +69,219 @@ const Rewards = () => { id symbol } + tickLower { + tickIdx + } + tickUpper { + tickIdx + } liquidity - } + } } `; - - - const { loading, data, error } = useQuery(OWNER_POOLS, { + const loadData = async (positionsData: any) => { + let ethTcapPool = UNIV3.mainnet.tcapPool; + switch (currentNetwork.chainId) { + case NETWORKS.rinkeby.chainId: + ethTcapPool = UNIV3.mainnet.tcapPool; + break; + default: + ethTcapPool = UNIV3.rinkeby.tcapPool; + break; + } + setEthTcapIncentive(ethTcapPool.incentives); + const ethPositions = new Array(); + console.log("-- pos ---"); + console.log(positionsData.positions); + positionsData.positions.forEach(async (p: any) => { + if (p.pool.id === ethTcapPool.id.toLowerCase()) { + const position = { ...positionDefault }; + const incentiveId = computeIncentiveId(ethTcapPool.incentives[0]); + position.lpTokenId = p.id; + position.poolId = p.pool.id; + position.tickLower = p.tickLower.tickIdx; + position.tickUpper = p.tickUpper.tickIdx; + position.incetiveId = incentiveId; + position.liquidity = ethers.utils.formatEther(p.liquidity); + + const nfpCall = await nfpmContractRead?.getApproved(p.id); + const lpDepositsCall = await stakerContractRead?.deposits(p.id); + const lpStakesCall = await stakerContractRead?.stakes(p.id, incentiveId); + + // @ts-ignore + const [nfpAddress, depositsEth, stakesEth] = await signer.ethcallProvider?.all([ + nfpCall, + lpDepositsCall, + lpStakesCall, + ]); + if (nfpAddress.toLowerCase() !== UNIV3.stakerAddress.toLowerCase()) { + position.status = StakeStatus.not_approved; + } else if ( + depositsEth.owner === ownerAddress && + depositsEth.tickLower === position.tickLower && + depositsEth.tickUpper === position.tickUpper + ) { + position.status = StakeStatus.deposited; + + if (stakesEth.liquidity > BigNumber.from("0")) { + position.status = StakeStatus.staked; + } + } + ethPositions.push(position); + setEthTcapPositions(ethPositions); + } + }); + }; + + const { loading, data, error, refetch } = useQuery(OWNER_POSITIONS, { fetchPolicy: "no-cache", notifyOnNetworkStatusChange: true, - variables: { "0x" }, + variables: { owner: ownerAddress }, onError: () => { console.log(error); + console.log(loading); }, onCompleted: () => { - + loadData(data); }, }); + const refresh = async () => { + try { + await refetch(); + } catch (error) { + console.log(error); + } + }; + + const lpUrl = () => { + const tcapAddress = tokens.tcapToken?.address; + const wethAddress = tokens.wethToken?.address; + + return `https://app.uniswap.org/add/${wethAddress}/${tcapAddress}?chain=${currentNetwork.name}`; + }; + + const ClaimButton = ({ position }: btnProps) => { + let btnDisabled = true; + + // eslint-disable-next-line + if (position.status !== StakeStatus.staked) { + btnDisabled = !(position.reward > 0); + } + return ( + + ); + }; + + const WithdrawButton = ({ position }: btnProps) => { + let title = "Exit"; + let btnDisabled = true; + + // eslint-disable-next-line + if (position.status === StakeStatus.staked) { + title = "Unstake"; + btnDisabled = false; + } + // eslint-disable-next-line + if (position.status === StakeStatus.deposited) { + btnDisabled = false; + } + + return ( + + ); + }; + return ( - -

Entra

+ +
+ Net Reward + +
-
- {v.status === "liquidation" && currentAddress !== "" ? ( - - ) : ( - {capitalize(v.status)} - )} -
+
{statusTag(index, v)}
+
+ ${v.netReward.toFixed(2)} +
+
- ${v.netReward.toFixed(2)} + + ${numberFormatStr(v.netReward.toFixed(2), 2, 2)} +
+ + + + + + + + + + {ethTcapPositions.map((position, index) => { + console.log(""); + return ( + + + + + + + + + + + ); + })} + +
+ DescriptionToken IDLiquidityStatusRewardAPY +
+ + + + + WETH/TCAP Pool
Uniswap +
+
{position.lpTokenId} + {" "} + + {position.status === StakeStatus.not_approved + ? "Not Approved" + : capitalize(position.status)} + + {" "} + CTX + + + + % + + + <> + refresh()} + /> + + + +
); }; diff --git a/src/components/Farm/UniV3Rewards/Stake.tsx b/src/components/Farm/UniV3Rewards/Stake.tsx new file mode 100644 index 0000000..4b5f0e8 --- /dev/null +++ b/src/components/Farm/UniV3Rewards/Stake.tsx @@ -0,0 +1,107 @@ +import React, { useEffect, useState } from "react"; +import Button from "react-bootstrap/esm/Button"; +import { BigNumber, ethers } from "ethers"; +import { UNIV3, encodeIncentive } from "../../../utils/univ3"; +import { IncentiveType, PositionType, StakeStatus } from "./types"; +import { notifyUser, errorNotification } from "../../../utils/utils"; + +type props = { + ownerAddress: string; + position: PositionType; + incentive: IncentiveType; + nfpmContract: ethers.Contract | undefined; + stakerContract: ethers.Contract | undefined; + refresh: () => void; +}; + +const Stake = ({ + ownerAddress, + position, + incentive, + nfpmContract, + stakerContract, + refresh, +}: props) => { + const [title, setTitle] = useState("Stake"); + const [btnDisabled, setBtnDisabled] = useState(true); + + useEffect(() => { + const cDate = new Date(); + const currentTime = cDate.getTime() / 1000; + console.log("--- Time ----"); + console.log(currentTime); + let btnTitle = "Stake"; + let bDisabled = true; + if (position.status === StakeStatus.not_approved) { + btnTitle = "Approve"; + bDisabled = false; + } else if (currentTime < incentive.startTime) { + bDisabled = false; + btnTitle = "Deposit"; + } else if (currentTime >= incentive.startTime && currentTime <= incentive.endTime) { + // eslint-disable-next-line + bDisabled = !(position.status === StakeStatus.empty || position.status === StakeStatus.deposited); + // eslint-disable-next-line + } else { + bDisabled = false; + } + setTitle(btnTitle); + setBtnDisabled(bDisabled); + // eslint-disable-next-line + }, []); + + const approve = async () => { + try { + const tx = await nfpmContract?.approve(UNIV3.stakerAddress, position.lpTokenId); + notifyUser(tx, refresh); + } catch (error) { + console.log(error); + errorNotification("Transaction rejected"); + } + }; + + const deposit = async () => { + try { + const tx = await nfpmContract?.safeTransferFrom( + ownerAddress, + UNIV3.stakerAddress, + BigNumber.from(position.lpTokenId), + encodeIncentive(incentive) + ); + notifyUser(tx, refresh); + } catch (error) { + console.log(error); + errorNotification("Transaction rejected"); + } + }; + + const stake = async () => { + try { + const tx = await stakerContract?.stakeToken(incentive, position.lpTokenId); + notifyUser(tx, refresh); + } catch (error) { + console.log(error); + errorNotification("Transaction rejected"); + } + }; + + const handleOnClick = () => { + setBtnDisabled(true); + if (position.status === StakeStatus.not_approved) { + approve(); + } else if (position.status === StakeStatus.empty) { + deposit(); + } else if (position.status === StakeStatus.deposited) { + stake(); + } + setBtnDisabled(false); + }; + + return ( + + ); +}; + +export default Stake; diff --git a/src/components/Farm/UniV3Rewards/index.tsx b/src/components/Farm/UniV3Rewards/index.tsx index 285e727..e317189 100644 --- a/src/components/Farm/UniV3Rewards/index.tsx +++ b/src/components/Farm/UniV3Rewards/index.tsx @@ -1,12 +1,15 @@ import React, { useContext, useEffect, useState } from "react"; +import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; +import UniswapV3Staker from "../../../contracts/UniswapV3Staker.json"; +import NonfungiblePositionManager from "../../../contracts/NonfungiblePositionManager.json"; import NetworkContext from "../../../state/NetworkContext"; -import SignerContext from "../../../state/SignerContext"; -import { GRAPHQL_UNIV3_ENDPOINT, NETWORKS, UNIV3 } from "../../../utils/constants"; +import { SignerContext } from "../../../state/SignerContext"; +import { NETWORKS } from "../../../utils/constants"; +import { GRAPHQL_UNIV3_ENDPOINT, UNIV3 } from "../../../utils/univ3"; import { toFragment } from "../../../utils/utils"; -import NonfungiblePositionManager from "../../../contracts/NonfungiblePositionManager.json"; + import Rewards from "./Rewards"; const clientOracle = (graphqlEndpoint: string) => @@ -16,62 +19,72 @@ const clientOracle = (graphqlEndpoint: string) => }); type props = { - address: string; + signer: SignerContext; }; -const UniV3Rewards = ({ address }: props) => { +const UniV3Rewards = ({ signer }: props) => { const currentNetwork = useContext(NetworkContext); - const signer = useContext(SignerContext); + const [ownerAddress, setOwnerAddress] = useState(""); + const [stakerContract, setStakerContract] = useState(); + const [stakerContractRead, setStakerContractRead] = useState(); + const [nfpmContract, setNfpmContract] = useState(); + const [nfpmContractRead, setNfpmContractRead] = useState(); const [apolloClient, setApolloClient] = useState( clientOracle( - process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_UNIV3_ENDPOINT.mainnet : GRAPHQL_UNIV3_ENDPOINT.rinkeby + process.env.REACT_APP_NETWORK_ID === "1" + ? GRAPHQL_UNIV3_ENDPOINT.mainnet + : GRAPHQL_UNIV3_ENDPOINT.rinkeby ) ); - const [lpTokens, setLpTokens] = useState([]); - const loadLPTokens = async () => { - if (signer.signer) { - const positionManager = new ethers.Contract( - UNIV3.NFPositionManager, - NonfungiblePositionManager, - signer.signer - ); - const positionManagerRead = new Contract( - UNIV3.NFPositionManager, - toFragment(NonfungiblePositionManager) - ); - - const noOfTokensOwnedByUser = await positionManager.balanceOf( - "0x11e4857bb9993a50c685a79afad4e6f65d518dda" - ); - console.log("Tokens by user"); - console.log(noOfTokensOwnedByUser.toNumber()); - if (!noOfTokensOwnedByUser.isZero()) { - const ethcalls = []; - for (let i = 0; i < noOfTokensOwnedByUser.toNumber(); i += 1) { - const currentTokenOfOwner = await positionManagerRead.tokenOfOwnerByIndex( - "0x11e4857bb9993a50c685a79afad4e6f65d518dda", - i - ); - ethcalls.push(currentTokenOfOwner); - } - const tokensId = await signer.ethcallProvider?.all(ethcalls); - console.log(tokensId); + useEffect(() => { + const load = async () => { + switch (currentNetwork.chainId) { + case NETWORKS.mainnet.chainId: + setApolloClient(clientOracle(GRAPHQL_UNIV3_ENDPOINT.mainnet)); + break; + case NETWORKS.rinkeby.chainId: + setApolloClient(clientOracle(GRAPHQL_UNIV3_ENDPOINT.rinkeby)); + break; + default: + setApolloClient(clientOracle(GRAPHQL_UNIV3_ENDPOINT.mainnet)); + break; } - } - }; + if (signer.signer) { + const stakerRead = new Contract(UNIV3.stakerAddress, UniswapV3Staker); + const staker = new ethers.Contract(UNIV3.stakerAddress, UniswapV3Staker, signer.signer); + const nfpmRead = new Contract( + UNIV3.NFPositionManagerAddress, + toFragment(NonfungiblePositionManager) + ); + const nfpm = new ethers.Contract( + UNIV3.NFPositionManagerAddress, + NonfungiblePositionManager, + signer.signer + ); - useEffect(() => { - const load = () => { - loadLPTokens(); + setStakerContractRead(stakerRead); + setStakerContract(staker); + setNfpmContract(nfpm); + setNfpmContractRead(nfpmRead); + const oAddress = await signer.signer.getAddress(); + setOwnerAddress(oAddress); + } }; load(); // eslint-disable-next-line - }, [currentNetwork.chainId, address]); + }, [currentNetwork.chainId]); return ( - + ); }; diff --git a/src/components/Farm/UniV3Rewards/types.tsx b/src/components/Farm/UniV3Rewards/types.tsx new file mode 100644 index 0000000..5995e3d --- /dev/null +++ b/src/components/Farm/UniV3Rewards/types.tsx @@ -0,0 +1,25 @@ +export const StakeStatus = { + not_approved: "not_approved", + empty: "empty", + deposited: "deposited", + staked: "staked", +}; + +export type IncentiveType = { + rewardToken: string; + pool: string; + startTime: number; + endTime: number; + refundee: string; +}; + +export type PositionType = { + lpTokenId: number; + poolId: string; + liquidity: string; + tickLower: number; + tickUpper: number; + incetiveId: string; + reward: number; + status: string; +}; diff --git a/src/components/Farm/index.tsx b/src/components/Farm/index.tsx index f3cb9ef..4d9c704 100644 --- a/src/components/Farm/index.tsx +++ b/src/components/Farm/index.tsx @@ -449,9 +449,9 @@ const Farm = () => {

Farming

{" "} - + {phase > 1 && ( - +

Liquidity Rewards

diff --git a/src/contracts/NonfungiblePositionManager.json b/src/contracts/NonfungiblePositionManager.json index 75244eb..f972d60 100644 --- a/src/contracts/NonfungiblePositionManager.json +++ b/src/contracts/NonfungiblePositionManager.json @@ -619,25 +619,8 @@ "outputs": [], "stateMutability": "payable", "type": "function" -}, { - "inputs": [{ - "internalType": "address", - "name": "from", - "type": "address" - }, { - "internalType": "address", - "name": "to", - "type": "address" - }, { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }], - "name": "safeTransferFrom", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" -}, { +}, +{ "inputs": [{ "internalType": "address", "name": "from", diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 8e23d29..12cdf8b 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -219,6 +219,9 @@ box-shadow: 0px 0px 39px -6px rgba(63, 217, 180, 0.4); } } + .btn:disabled { + color: $white; + } .table { td { @@ -296,8 +299,21 @@ } } } + &.univ3 { + th.right { + text-align: right; + } + th.center { + text-align: center; + } + .btn { + width: 7rem; + } + .btn.small { + width: 5rem; + } + } } - th { vertical-align: middle; } diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 912c1a0..1fbd184 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -68,15 +68,6 @@ export const NETWORKS = { }, }; -export const UNIV3 = { - NFPositionManager: "0xC36442b4a4522E871399CD717aBDD847Ab11FE88", - Staker: "0xe34139463bA50bD61336E0c446Bd8C0867c6fE65", - pools: [ - "0x0001fcbba8eb491c3ccfeddc5a5caba1a98c4c28", - "0x0002e63328169d7feea121f1e32e4f620abf0352", - ] -}; - export const API_ENDPOINT = "https://api.cryptex.finance"; export const GRAPHQL_ENDPOINT = { @@ -87,11 +78,6 @@ export const GRAPHQL_ENDPOINT = { polygon: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-polygon", }; -export const GRAPHQL_UNIV3_ENDPOINT = { - mainnet: "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", - rinkeby: "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", -} - export const FEATURES = { KEEPERS_API: false, NEW_VAULTS: true, diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx new file mode 100644 index 0000000..dd67235 --- /dev/null +++ b/src/utils/univ3.tsx @@ -0,0 +1,54 @@ +import { ethers } from "ethers"; + +export const UNIV3 = { + NFPositionManagerAddress: "0xC36442b4a4522E871399CD717aBDD847Ab11FE88", + stakerAddress: "0xe34139463bA50bD61336E0c446Bd8C0867c6fE65", + mainnet: { + tcapPool: { + id: "0xfb7BDD5B703f57BC7807b9D731503050EdC8c722", + incentives: [ + { + rewardToken: "0xAa715DbD2ED909B7B7727dC864F3B78276D14A19", + pool: "0xfb7BDD5B703f57BC7807b9D731503050EdC8c722", + startTime: 1647347412, + endTime: 1662899412, + refundee: "0x570f581D23a2AB09FD1990279D9DB6f5DcE18F4A", + }, + ], + }, + }, + rinkeby: { + tcapPool: { + id: "0xfb7BDD5B703f57BC7807b9D731503050EdC8c722", + incentives: [ + { + rewardToken: "0xAa715DbD2ED909B7B7727dC864F3B78276D14A19", + pool: "0xfb7BDD5B703f57BC7807b9D731503050EdC8c722", + startTime: 1647347412, + endTime: 1662899412, + refundee: "0x570f581D23a2AB09FD1990279D9DB6f5DcE18F4A", + }, + ], + }, + }, +}; + +export const GRAPHQL_UNIV3_ENDPOINT = { + mainnet: "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", + rinkeby: "https://api.thegraph.com/subgraphs/name/hamzabhatti125/uniswapv3", +}; + +export const encodeIncentive = (dataMap: any): string => { + const INCENTIVE_KEY_ABI = + "tuple(address rewardToken, address pool, uint256 startTime, uint256 endTime, address refundee)"; + const abiCoder = new ethers.utils.AbiCoder(); + return abiCoder.encode([INCENTIVE_KEY_ABI], [dataMap]); +}; + +export const computeIncentiveId = (dataMap: any): string => { + const INCENTIVE_KEY_ABI = + "tuple(address rewardToken, address pool, uint256 startTime, uint256 endTime, address refundee)"; + const abiCoder = new ethers.utils.AbiCoder(); + const bytes = abiCoder.encode([INCENTIVE_KEY_ABI], [dataMap]); + return ethers.utils.keccak256(bytes); +}; diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index ca714ac..9853745 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -7,6 +7,8 @@ import { FEATURES, NETWORKS } from "./constants"; import { OraclesContext } from "../state/OraclesContext"; import { VaultsContext } from "../state/VaultsContext"; +export const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); + export const makeShortAddress = (address: string) => { const shortAddress = `${address.substr(0, 6).toString()}...${address .substr(address.length - 4, address.length) @@ -107,8 +109,6 @@ export const errorNotification = async (body: string) => { sendNotification(title, body, 3000, () => {}, 0, "error"); }; -// const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); - export const notifyUser = async (tx: ethers.ContractTransaction, fn: any = () => {}) => { try { let notificationTitle = "⏰ Transaction Sent!"; From 7c900ea6b415959833619e3c5466c7aa31dc6d03 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 30 Mar 2022 00:38:34 -0600 Subject: [PATCH 081/278] finish univ3 design --- .../Farm/UniV3Rewards/ClaimReward.tsx | 111 +++++++ src/components/Farm/UniV3Rewards/Rewards.tsx | 314 +++++++++++------- src/components/Farm/UniV3Rewards/Stake.tsx | 29 +- src/components/Farm/index.tsx | 7 +- src/styles/app.scss | 19 ++ src/styles/farm.scss | 67 ++++ src/utils/univ3.tsx | 2 +- 7 files changed, 413 insertions(+), 136 deletions(-) create mode 100644 src/components/Farm/UniV3Rewards/ClaimReward.tsx diff --git a/src/components/Farm/UniV3Rewards/ClaimReward.tsx b/src/components/Farm/UniV3Rewards/ClaimReward.tsx new file mode 100644 index 0000000..972b831 --- /dev/null +++ b/src/components/Farm/UniV3Rewards/ClaimReward.tsx @@ -0,0 +1,111 @@ +import React, { useState } from "react"; +import { Button, Form } from "react-bootstrap"; +import { ethers } from "ethers"; +import Modal from "react-bootstrap/esm/Modal"; +import "../../../styles/modal.scss"; +import { errorNotification, notifyUser } from "../../../utils/utils"; +import { IncentiveType } from "./types"; + +type props = { + show: boolean; + ownerAddress: string; + currentReward: number; + incentive: IncentiveType; + stakerContract?: ethers.Contract; + onHide: () => void; + refresh: () => void; +}; + +const ClaimReward = ({ + show, + ownerAddress, + currentReward, + incentive, + stakerContract, + onHide, + refresh, +}: props) => { + const [rewardText, setRewardText] = useState(""); + const [canClaim, setCanClaim] = useState(true); + + const onChangeReward = (event: React.ChangeEvent) => { + setRewardText(event.target.value); + }; + + const maxReward = async (e: React.MouseEvent) => { + e.preventDefault(); + setRewardText(currentReward.toString()); + }; + + const claim = async (event: React.MouseEvent) => { + event.preventDefault(); + if (stakerContract && canClaim) { + setCanClaim(false); + if (rewardText && parseFloat(rewardText) > 0) { + if (parseFloat(rewardText) <= currentReward) { + try { + const tx = await stakerContract.claimReward( + incentive.rewardToken, + ownerAddress, + ethers.utils.parseEther(rewardText) + ); + notifyUser(tx, refresh); + setRewardText(""); + onHide(); + } catch (error) { + errorNotification("Transaction Rejected"); + } + } else { + errorNotification("Not enough CTX reward"); + } + } else { + errorNotification("Field can't be empty"); + } + setCanClaim(true); + } + }; + + return ( + { + setRewardText(""); + onHide(); + }} + > + + Claim Reward + + +
+
+ + Amount to Claim + + + MAX + + + + + + + + + + + ); +}; + +export default ClaimReward; diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 48e8506..9e5249d 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -1,12 +1,15 @@ import React, { useContext, useState } from "react"; import Button from "react-bootstrap/esm/Button"; import Card from "react-bootstrap/esm/Card"; +import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Table from "react-bootstrap/esm/Table"; +import Tooltip from "react-bootstrap/esm/Tooltip"; import { BigNumber, ethers } from "ethers"; import NumberFormat from "react-number-format"; import { Contract } from "ethers-multicall"; import { useQuery, gql } from "@apollo/client"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; +import { ReactComponent as CtxIcon } from "../../../assets/images/ctx-coin.svg"; import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; import NetworkContext from "../../../state/NetworkContext"; import { SignerContext } from "../../../state/SignerContext"; @@ -14,8 +17,9 @@ import TokensContext from "../../../state/TokensContext"; import { NETWORKS } from "../../../utils/constants"; import { UNIV3, computeIncentiveId } from "../../../utils/univ3"; import { capitalize } from "../../../utils/utils"; -import Stake from "./Stake"; import { IncentiveType, PositionType, StakeStatus } from "./types"; +import ClaimReward from "./ClaimReward"; +import Stake from "./Stake"; type props = { ownerAddress: string; @@ -53,28 +57,16 @@ const Rewards = ({ const currentNetwork = useContext(NetworkContext); const [ethTcapIncentive, setEthTcapIncentive] = useState>([]); const [ethTcapPositions, setEthTcapPositions] = useState>([]); + const [availableReward, setAvailableReward] = useState(0); + const [showClaim, setShowClaim] = useState(false); const OWNER_POSITIONS = gql` query ownerPools($owner: String!) { - positions(where: { owner: $owner }) { + positions(orderBy: id, where: { owner: $owner }) { id - pool { - id - } - token0 { - id - symbol - } - token1 { - id - symbol - } - tickLower { - tickIdx - } - tickUpper { - tickIdx - } + poolAddress + tickLower + tickUpper liquidity } } @@ -92,44 +84,54 @@ const Rewards = ({ } setEthTcapIncentive(ethTcapPool.incentives); const ethPositions = new Array(); - console.log("-- pos ---"); - console.log(positionsData.positions); positionsData.positions.forEach(async (p: any) => { - if (p.pool.id === ethTcapPool.id.toLowerCase()) { + if (p.poolAddress === ethTcapPool.id.toLowerCase()) { const position = { ...positionDefault }; const incentiveId = computeIncentiveId(ethTcapPool.incentives[0]); position.lpTokenId = p.id; - position.poolId = p.pool.id; - position.tickLower = p.tickLower.tickIdx; - position.tickUpper = p.tickUpper.tickIdx; + position.poolId = p.poolAddress; + position.tickLower = p.tickLower; + position.tickUpper = p.tickUpper; position.incetiveId = incentiveId; position.liquidity = ethers.utils.formatEther(p.liquidity); const nfpCall = await nfpmContractRead?.getApproved(p.id); const lpDepositsCall = await stakerContractRead?.deposits(p.id); const lpStakesCall = await stakerContractRead?.stakes(p.id, incentiveId); - + const availableRewardCall = await stakerContractRead?.rewards( + ethTcapPool.incentives[0].rewardToken, + ownerAddress + ); // @ts-ignore - const [nfpAddress, depositsEth, stakesEth] = await signer.ethcallProvider?.all([ - nfpCall, - lpDepositsCall, - lpStakesCall, - ]); - if (nfpAddress.toLowerCase() !== UNIV3.stakerAddress.toLowerCase()) { - position.status = StakeStatus.not_approved; - } else if ( + const [nfpAddress, depositsEth, stakesEth, availableRewardWei] = + await signer.ethcallProvider?.all([ + nfpCall, + lpDepositsCall, + lpStakesCall, + availableRewardCall, + ]); + setAvailableReward(parseFloat(ethers.utils.formatEther(availableRewardWei))); + if ( depositsEth.owner === ownerAddress && depositsEth.tickLower === position.tickLower && depositsEth.tickUpper === position.tickUpper ) { position.status = StakeStatus.deposited; - if (stakesEth.liquidity > BigNumber.from("0")) { position.status = StakeStatus.staked; + const rewardInfoCall = await stakerContractRead?.getRewardInfo( + ethTcapPool.incentives[0], + p.id + ); + // @ts-ignore + const [rewardInfo] = await signer.ethcallProvider?.all([rewardInfoCall]); + position.reward = parseFloat(ethers.utils.formatEther(rewardInfo.reward)); } + } else if (nfpAddress.toLowerCase() !== UNIV3.stakerAddress.toLowerCase()) { + position.status = StakeStatus.not_approved; } ethPositions.push(position); - setEthTcapPositions(ethPositions); + setEthTcapPositions([...ethPositions]); } }); }; @@ -137,7 +139,7 @@ const Rewards = ({ const { loading, data, error, refetch } = useQuery(OWNER_POSITIONS, { fetchPolicy: "no-cache", notifyOnNetworkStatusChange: true, - variables: { owner: ownerAddress }, + variables: { owner: ownerAddress.toLowerCase() }, onError: () => { console.log(error); console.log(loading); @@ -162,29 +164,26 @@ const Rewards = ({ return `https://app.uniswap.org/add/${wethAddress}/${tcapAddress}?chain=${currentNetwork.name}`; }; - const ClaimButton = ({ position }: btnProps) => { - let btnDisabled = true; - - // eslint-disable-next-line - if (position.status !== StakeStatus.staked) { - btnDisabled = !(position.reward > 0); - } + const ClaimButton = () => { + const btnDisabled = !(availableReward > 0); return ( - ); }; const WithdrawButton = ({ position }: btnProps) => { - let title = "Exit"; + const title = "Exit"; let btnDisabled = true; - // eslint-disable-next-line - if (position.status === StakeStatus.staked) { - title = "Unstake"; - btnDisabled = false; - } // eslint-disable-next-line if (position.status === StakeStatus.deposited) { btnDisabled = false; @@ -199,89 +198,146 @@ const Rewards = ({ return ( -
- - - - - - - - - - {ethTcapPositions.map((position, index) => { - console.log(""); - return ( - - - - - - - - + + + + + ); + })} + +
- DescriptionToken IDLiquidityStatusRewardAPY -
- - - - - WETH/TCAP Pool
Uniswap -
-
{position.lpTokenId} - {" "} - - {position.status === StakeStatus.not_approved - ? "Not Approved" - : capitalize(position.status)} - - {" "} - CTX - - + +

Uniswap V3 Liquidity Rewards

+
+
+
Available to Claim:
+
+ + +
+
+
+ +
+
+ + + + + + + + + {ethTcapPositions.map((position, index) => { + console.log(""); + return ( + + + + - - - ); - })} - -
+ DescriptionBalance + Status + + Pending: LP token needs to be + approved in order to be staked.
+ Empty: LP token hasn't been staked or + deposited.
+ Deposited: LP token needs to be + stake to earn rewards.
+ Staked: LP token is staked and + earning rewards.
+ + } + > + +
+
+ Current Reward + + Amount of CTX that it's been earn while the LP token is staked. You must unstake + the LP token in order to claim the reward. + + } + > + + + +
+ + + + + WETH/TCAP Pool
Uniswap +
+
- % - - - <> - refresh()} - /> - - - -
+ />{" "} +
+
+ + {position.status === StakeStatus.not_approved + ? "Pending" + : capitalize(position.status)} + +
+
+ {" "} + CTX + + <> + refresh()} + /> + + +
+ + { + setShowClaim(false); + }} + refresh={() => refresh()} + />
); }; diff --git a/src/components/Farm/UniV3Rewards/Stake.tsx b/src/components/Farm/UniV3Rewards/Stake.tsx index 4b5f0e8..f4dab5a 100644 --- a/src/components/Farm/UniV3Rewards/Stake.tsx +++ b/src/components/Farm/UniV3Rewards/Stake.tsx @@ -28,13 +28,14 @@ const Stake = ({ useEffect(() => { const cDate = new Date(); const currentTime = cDate.getTime() / 1000; - console.log("--- Time ----"); - console.log(currentTime); let btnTitle = "Stake"; let bDisabled = true; if (position.status === StakeStatus.not_approved) { btnTitle = "Approve"; bDisabled = false; + } else if (position.status === StakeStatus.staked) { + bDisabled = false; + btnTitle = "Unstake"; } else if (currentTime < incentive.startTime) { bDisabled = false; btnTitle = "Deposit"; @@ -48,20 +49,23 @@ const Stake = ({ setTitle(btnTitle); setBtnDisabled(bDisabled); // eslint-disable-next-line - }, []); + }, [position]); const approve = async () => { try { + setBtnDisabled(true); const tx = await nfpmContract?.approve(UNIV3.stakerAddress, position.lpTokenId); notifyUser(tx, refresh); } catch (error) { console.log(error); errorNotification("Transaction rejected"); } + setBtnDisabled(false); }; const deposit = async () => { try { + setBtnDisabled(true); const tx = await nfpmContract?.safeTransferFrom( ownerAddress, UNIV3.stakerAddress, @@ -73,28 +77,43 @@ const Stake = ({ console.log(error); errorNotification("Transaction rejected"); } + setBtnDisabled(false); }; const stake = async () => { try { + setBtnDisabled(true); const tx = await stakerContract?.stakeToken(incentive, position.lpTokenId); notifyUser(tx, refresh); } catch (error) { console.log(error); errorNotification("Transaction rejected"); } + setBtnDisabled(false); + }; + + const unstake = async () => { + try { + setBtnDisabled(true); + const tx = await stakerContract?.unstakeToken(incentive, position.lpTokenId); + notifyUser(tx, refresh); + } catch (error) { + console.log(error); + errorNotification("Transaction rejected"); + } + setBtnDisabled(false); }; const handleOnClick = () => { - setBtnDisabled(true); if (position.status === StakeStatus.not_approved) { approve(); } else if (position.status === StakeStatus.empty) { deposit(); } else if (position.status === StakeStatus.deposited) { stake(); + } else if (position.status === StakeStatus.staked) { + unstake(); } - setBtnDisabled(false); }; return ( diff --git a/src/components/Farm/index.tsx b/src/components/Farm/index.tsx index 4d9c704..0f6488b 100644 --- a/src/components/Farm/index.tsx +++ b/src/components/Farm/index.tsx @@ -9,6 +9,7 @@ import { ethers } from "ethers"; import NumberFormat from "react-number-format"; import SignerContext from "../../state/SignerContext"; import TokensContext from "../../state/TokensContext"; +import NetworkContext from "../../state/NetworkContext"; import OraclesContext from "../../state/OraclesContext"; import GovernanceContext from "../../state/GovernanceContext"; import RewardsContext from "../../state/RewardsContext"; @@ -24,6 +25,7 @@ import { errorNotification, tsToDateString, getPriceInUSDFromPair, + isInLayer1, } from "../../utils/utils"; import { Stake } from "../modals/Stake"; @@ -47,6 +49,7 @@ const Farm = () => { const [vestingEndTime, setVestingEndTime] = useState(0); const [ctxVestingEndTime, setCtxVestingEndTime] = useState(0); const [updateData, setUpdateData] = useState(false); + const currentNetwork = useContext(NetworkContext); const signer = useContext(SignerContext); const tokens = useContext(TokensContext); const oracles = useContext(OraclesContext); @@ -449,7 +452,9 @@ const Farm = () => {

Farming

{" "} - + {signer.signer && isInLayer1(currentNetwork.chainId) && ( + + )} {phase > 1 && (

Liquidity Rewards

diff --git a/src/styles/app.scss b/src/styles/app.scss index e465e14..020cda8 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -287,6 +287,25 @@ html, padding: 0.9rem; } +.univ3-status-tooltip > .tooltip-inner { + min-width: 400px; + width: 400px; + text-align: left; + padding: 0.9rem; + .empty { + text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; + } + .deposited { + text-shadow: 0 0 4px #167226,0 0 10px #61c4b3,0 0 20px #167226,0 -10px 40px #167226; + } + .staked { + text-shadow: 0 0 4px #e440f2,0 0 10px #e98ff1,0 0 20px #e440f2,0 -10px 40px #b626c4; + } + .not_approved { + text-shadow: 0 0 4px #c33,0 0 10px rgb(236, 97, 97),0 0 20px #c33,0 -10px 40px #c33; + } +} + form { .field-error { color: $orange; diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 12cdf8b..3ef71e3 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -300,18 +300,85 @@ } } &.univ3 { + thead { + .btn { + margin-top: 0rem; + margin-bottom: 0rem; + } + } + tbody{ + border-bottom: 1px solid #a440f2; + .status { + font-family: "Nineteen Ninety Seven"; + font-size: 15px; + color: #fff !important; + } + } th.right { text-align: right; } th.center { text-align: center; } + th.status { + width: 15%; + } .btn { width: 7rem; } .btn.small { width: 5rem; } + .btn.claim { + background-color: #281e31; + border-radius: 5px; + height: 2.2rem; + width: 6rem; + margin-right: 1rem; + padding: 0.1rem 1rem; + } + .card-body { + padding: 1rem 0rem; + } + .rewards { + display: flex; + justify-content: flex-end; + margin-bottom: 1.3rem; + &-total { + display: flex; + flex-direction: row; + align-items: center; + .amount { + display: flex; + svg { + margin-top: -3px; + margin-left: 4px; + } + } + h6 { + color: $white; + margin-top: 3px; + margin-right: 10px; + font-size: 1.1rem; + } + .number { + color: $white; + text-shadow: 0 0 4px #f195f9,0 0 10px #fff,0 0 20px #e440f2,0 -10px 40px #b626c4; + } + } + } + .empty { + text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; + } + .deposited { + text-shadow: 0 0 4px #167226,0 0 10px #61c4b3,0 0 20px #167226,0 -10px 40px #167226; + } + .staked { + text-shadow: 0 0 4px #e440f2,0 0 10px #e98ff1,0 0 20px #e440f2,0 -10px 40px #b626c4; + } + .not_approved { + text-shadow: 0 0 4px #c33,0 0 10px rgb(236, 97, 97),0 0 20px #c33,0 -10px 40px #c33; + } } } th { diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx index dd67235..9b76c70 100644 --- a/src/utils/univ3.tsx +++ b/src/utils/univ3.tsx @@ -35,7 +35,7 @@ export const UNIV3 = { export const GRAPHQL_UNIV3_ENDPOINT = { mainnet: "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", - rinkeby: "https://api.thegraph.com/subgraphs/name/hamzabhatti125/uniswapv3", + rinkeby: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-rinkeby-two", }; export const encodeIncentive = (dataMap: any): string => { From e961090a3bba5fbbdfbfde40af42994beee71342 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 30 Mar 2022 12:05:28 -0600 Subject: [PATCH 082/278] adding empty lp box --- src/components/Farm/UniV3Rewards/Rewards.tsx | 316 +++++++++++-------- src/components/Farm/index.tsx | 4 +- src/styles/app.scss | 13 + src/styles/farm.scss | 40 ++- 4 files changed, 238 insertions(+), 135 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 9e5249d..df561ee 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -4,6 +4,7 @@ import Card from "react-bootstrap/esm/Card"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Table from "react-bootstrap/esm/Table"; import Tooltip from "react-bootstrap/esm/Tooltip"; +import Spinner from "react-bootstrap/Spinner"; import { BigNumber, ethers } from "ethers"; import NumberFormat from "react-number-format"; import { Contract } from "ethers-multicall"; @@ -34,6 +35,10 @@ type btnProps = { position: PositionType; }; +type infoMsgProps = { + message: string; +}; + const positionDefault = { lpTokenId: 0, poolId: "", @@ -142,10 +147,11 @@ const Rewards = ({ variables: { owner: ownerAddress.toLowerCase() }, onError: () => { console.log(error); - console.log(loading); }, onCompleted: () => { - loadData(data); + if (signer.signer && ownerAddress !== "") { + loadData(data); + } }, }); @@ -159,9 +165,12 @@ const Rewards = ({ const lpUrl = () => { const tcapAddress = tokens.tcapToken?.address; - const wethAddress = tokens.wethToken?.address; + let wethAddress = tokens.wethToken?.address; + if (currentNetwork.chainId === NETWORKS.rinkeby.chainId) { + wethAddress = "0xc778417E063141139Fce010982780140Aa0cD5Ab"; + } - return `https://app.uniswap.org/add/${wethAddress}/${tcapAddress}?chain=${currentNetwork.name}`; + return `https://app.uniswap.org/#/add/${wethAddress}/${tcapAddress}?chain=${currentNetwork.name}`; }; const ClaimButton = () => { @@ -196,136 +205,181 @@ const Rewards = ({ ); }; - return ( - - -

Uniswap V3 Liquidity Rewards

-
-
-
Available to Claim:
-
- - -
+ const InfoMessage = ({ message }: infoMsgProps) => ( +
+
{message}
+
+ ); + + const RenderRewards = () => ( + <> +
+
+
Available to Claim:
+
+ + +
+
+
+ +
+
+ + + + + + + + + {ethTcapPositions.map((position, index) => { + console.log(""); + return ( + + + + + + + + + ); + })} + +
+ DescriptionBalance + Status + + Pending: LP token needs to be + approved in order to be staked.
+ Empty: LP token hasn't been staked or + deposited.
+ Deposited: LP token needs to be + stake to earn rewards.
+ Staked: LP token is staked and earning + rewards.
+ + } + > + +
+
+ Current Reward + + Amount of CTX that it's been earn while the LP token is staked. You must unstake + the LP token in order to claim the reward. + + } + > + + + +
+ + + + + WETH/TCAP Pool
Uniswap +
+
+ {" "} + +
+ + {position.status === StakeStatus.not_approved + ? "Pending" + : capitalize(position.status)} + +
+
+ {" "} + CTX + + <> + refresh()} + /> + + +
+ + ); + + const RenderEmptyLP = () => ( +
+
+
+
+ +
- - - - - - - - - - {ethTcapPositions.map((position, index) => { - console.log(""); - return ( - - - - - - - - - ); - })} - -
- DescriptionBalance - Status - - Pending: LP token needs to be - approved in order to be staked.
- Empty: LP token hasn't been staked or - deposited.
- Deposited: LP token needs to be - stake to earn rewards.
- Staked: LP token is staked and - earning rewards.
- - } - > - -
-
- Current Reward - - Amount of CTX that it's been earn while the LP token is staked. You must unstake - the LP token in order to claim the reward. - - } - > - - - -
- - - - - WETH/TCAP Pool
Uniswap -
-
- {" "} - -
- - {position.status === StakeStatus.not_approved - ? "Pending" - : capitalize(position.status)} - -
-
- {" "} - CTX - - <> - refresh()} - /> - - -
+ + Create Position + +
+
+ ); + + return ( + + +

Uniswap V3 Liquidity Rewards

+
+ + {ownerAddress !== "" ? ( + <> + {loading ? ( + + ) : ( + <>{ethTcapPositions.length === 0 ? RenderEmptyLP() : RenderRewards()} + )} + + ) : ( + + )} {

Farming

{" "} - {signer.signer && isInLayer1(currentNetwork.chainId) && ( - - )} + {isInLayer1(currentNetwork.chainId) && } {phase > 1 && (

Liquidity Rewards

diff --git a/src/styles/app.scss b/src/styles/app.scss index 020cda8..6a7cbfd 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -358,6 +358,19 @@ form { color: $highlight !important; } +.info-message { + display: flex; + justify-content: center; + margin-top: 2rem; + + h5, h6 { + color: #bc99d7; + } + h6 { + font-size: 1.3rem; + } +} + #WEB3_CONNECT_MODAL_ID { .web3modal-provider-container { transition: background-color 0s ease-in-out 0s; diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 3ef71e3..1c22356 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -2,7 +2,7 @@ @import "./fonts"; .farm { - padding: 1rem 3rem; + padding: 3rem 3rem; padding-bottom: 2rem; // Small devices (landscape phones, 576px and up) @@ -379,6 +379,44 @@ .not_approved { text-shadow: 0 0 4px #c33,0 0 10px rgb(236, 97, 97),0 0 20px #c33,0 -10px 40px #c33; } + .empty-lp{ + display: flex; + flex-direction: column; + align-items: center; + .lp-box { + border: 1px solid $light; + border-radius: 5px; + background-color: #281e31a3; + } + .lp-info { + display: flex; + padding: 15px; + } + .icons { + padding: 5px; + } + .description { + padding: 5px; + } + .btn-box { + width: 100%; + } + .btn { + font-size: 0.9rem; + height: 2.5rem; + width: 100%; + border: 0px; + border-top: 0.8px solid $light; + background-color: #281e31; + margin: 0px; + padding-top: 8px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + } + .btn:hover { + color: $white; + } + } } } th { From 46b6fd31cd782e7c3a2c712329e9e4524287489b Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 4 Apr 2022 22:45:38 -0600 Subject: [PATCH 083/278] hard mode design added --- src/App.tsx | 109 +- src/components/Sidebar.tsx | 25 - src/components/Vault/Details.tsx | 303 +- src/contracts/cryptex.json | 8650 +++++++++++++++++++----------- src/hooks/useHardVaults.tsx | 22 + src/hooks/useVaults.tsx | 1 - src/state/HardVaultsContext.tsx | 19 + src/styles/vault-monitoring.scss | 23 +- src/styles/vault.scss | 207 +- 9 files changed, 6090 insertions(+), 3269 deletions(-) create mode 100644 src/hooks/useHardVaults.tsx create mode 100644 src/state/HardVaultsContext.tsx diff --git a/src/App.tsx b/src/App.tsx index bd3d177..cb2c217 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -18,7 +18,6 @@ import Topbar from "./components/Topbar"; import WelcomeWrapper from "./components/Welcome/index"; import Graph from "./components/Graph"; import { Vault, Monitoring } from "./components/Vault"; -import Pool from "./components/Pool"; import Delegators from "./components/Governance/Delegators"; import Loading from "./components/Loading"; import Farm from "./components/Farm"; @@ -26,6 +25,7 @@ import Warnings from "./components/Warnings"; import { useSigner } from "./hooks/useSigner"; import { useNetworks } from "./hooks/useNetworks"; import { useVaults } from "./hooks/useVaults"; +import { useHardVaults } from "./hooks/useHardVaults"; import { useTokens } from "./hooks/useTokens"; import { useOracles } from "./hooks/useOracles"; import { useGovernance } from "./hooks/useGovernance"; @@ -33,6 +33,7 @@ import { useRewards } from "./hooks/useRewards"; import signerContext from "./state/SignerContext"; import NetworkContext from "./state/NetworkContext"; import vaultsContext from "./state/VaultsContext"; +import hardVaultsContext from "./state/HardVaultsContext"; import tokensContext from "./state/TokensContext"; import oraclesContext from "./state/OraclesContext"; import governanceContext from "./state/GovernanceContext"; @@ -73,6 +74,7 @@ const App = () => { const networks = useNetworks(); const [currentSignerAddress, setCurrentSignerAddress] = useState(""); const vaults = useVaults(); + const hardVaults = useHardVaults(); const tokens = useTokens(); const oracles = useOracles(); const governance = useGovernance(); @@ -147,11 +149,23 @@ const App = () => { currentSigner ); vaults.setCurrentAAVEVault(currentAAVEVault); + const currentHardWETHVault = new ethers.Contract( + contracts.HardWETHVaultHandler.address, + contracts.HardWETHVaultHandler.abi, + currentSigner + ); + hardVaults.setCurrentWETHVault(currentHardWETHVault); + const currentAVEEVaultRead = new Contract( contracts.AaveVaultHandler.address, contracts.AaveVaultHandler.abi ); vaults.setCurrentAAVEVaultRead(currentAVEEVaultRead); + const currentHardWETHVaultRead = new Contract( + contracts.HardWETHVaultHandler.address, + toFragment(contracts.HardWETHVaultHandler.abi) + ); + hardVaults.setCurrentWETHVaultRead(currentHardWETHVaultRead); // Tokens const currentAAVEToken = new ethers.Contract( @@ -770,55 +784,54 @@ const App = () => { - - - - - }> - - -
- - - - - - - - - - - - - - - - - - - - + + + + + + }> + + +
+ + + + - - + + - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index a88656e..72634fd 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -10,7 +10,6 @@ import { ReactComponent as MenuLogo } from "../assets/images/menu.svg"; import { ReactComponent as DashboardIcon } from "../assets/images/welcome/dashboard.svg"; import { ReactComponent as VaultIcon } from "../assets/images/welcome/vault.svg"; import { ReactComponent as VaultMonitoringIcon } from "../assets/images/welcome/vault-monitoring.svg"; -import { ReactComponent as PoolsIcon } from "../assets/images/welcome/pool.svg"; import { ReactComponent as LogoutIcon } from "../assets/images/welcome/logout.svg"; import { ReactComponent as GraphIcon } from "../assets/images/welcome/graph.svg"; import { ReactComponent as StakeIcon } from "../assets/images/welcome/stake.svg"; @@ -123,30 +122,6 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { - {isInLayer1(currentNetwork.chainId) && ( - - {active === "pools" ? ( - { - setActive("pools"); - }} - > - - - ) : ( - { - setActive("pools"); - }} - > - - - )} - - )} {active === "farm" ? ( { const oracles = useContext(OraclesContext); const tokens = useContext(TokensContext); const vaults = useContext(VaultsContext); + const hardVaults = useContext(HardVaultsContext); const signer = useContext(SignerContext); - + const [vaultMode, setVaultMode] = useState("normal"); + const radios = [ + { name: "Regular Mode", value: "normal" }, + { name: "Hard Mode", value: "hard" }, + ]; let currency = !isPolygon(currentNetwork.chainId) ? "ETH" : "MATIC"; const match = useRouteMatch("/vault/:currency"); const history = useHistory(); + const isHardMode = () => vaultMode === "hard"; + // @ts-ignore switch (match?.params?.currency?.toLowerCase()) { case "eth": @@ -85,7 +88,7 @@ const Details = ({ address, t }: props) => { break; case "wbtc": currency = "WBTC"; - if (isOptimism(currentNetwork.chainId)) { + if (isOptimism(currentNetwork.chainId) || isHardMode()) { history?.push(`/vault/ETH`); currency = "ETH"; } @@ -94,7 +97,7 @@ const Details = ({ address, t }: props) => { currency = "DAI"; break; case "aave": - if (isInLayer1(currentNetwork.chainId)) { + if (isInLayer1(currentNetwork.chainId) && !isHardMode()) { currency = "AAVE"; } else { currency = "ETH"; @@ -102,7 +105,7 @@ const Details = ({ address, t }: props) => { } break; case "link": - if (!isPolygon(currentNetwork.chainId)) { + if (!isPolygon(currentNetwork.chainId) && !isHardMode()) { currency = "LINK"; } else { currency = "ETH"; @@ -111,10 +114,11 @@ const Details = ({ address, t }: props) => { break; case "matic": currency = "MATIC"; - if (!FEATURES.POLYGON && !isPolygon(currentNetwork.chainId)) { + if ((!FEATURES.POLYGON && !isPolygon(currentNetwork.chainId)) || isHardMode()) { history?.push(`/vault/ETH`); currency = "ETH"; } + setVaultMode("normal"); break; default: currency = FEATURES.POLYGON && isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"; @@ -175,6 +179,7 @@ const Details = ({ address, t }: props) => { debt address owner + hardVault } _meta { block { @@ -285,16 +290,16 @@ const Details = ({ address, t }: props) => { ); switch (vaultType) { case "ETH": - currentVault = vaults.wethVault; - currentVaultRead = vaults.wethVaultRead; + currentVault = !isHardMode() ? vaults.wethVault : hardVaults.wethVault; + currentVaultRead = !isHardMode() ? vaults.wethVaultRead : hardVaults.wethVaultRead; currentToken = tokens.wethToken; currentOracleRead = oracles.wethOracleRead; currentTokenRead = tokens.wethTokenRead; balance = await provider.getBalance(address); break; case "WETH": - currentVault = vaults.wethVault; - currentVaultRead = vaults.wethVaultRead; + currentVault = !isHardMode() ? vaults.wethVault : hardVaults.wethVault; + currentVaultRead = !isHardMode() ? vaults.wethVaultRead : hardVaults.wethVaultRead; currentToken = tokens.wethToken; currentOracleRead = oracles.wethOracleRead; currentTokenRead = tokens.wethTokenRead; @@ -370,8 +375,7 @@ const Details = ({ address, t }: props) => { let currentBlock = await provider.getBlockNumber(); currentBlock -= 10; if ( - (currentNetwork.chainId === NETWORKS.mainnet.chainId || - currentNetwork.chainId === NETWORKS.rinkeby.chainId) && + isInLayer1(currentNetwork.chainId) && vaultData.vaults.length > 0 && !vaultData._meta.hasIndexingErrors && graphBlock >= currentBlock @@ -543,6 +547,11 @@ const Details = ({ address, t }: props) => { setBurnTxt(""); }; + const handleRadioBtnChange = (value: string) => { + setVaultMode(value); + refresh(); + }; + const changeVault = async (newRatio: number, reset = false) => { let r = newRatio; if (reset) { @@ -940,11 +949,11 @@ const Details = ({ address, t }: props) => { } }; - const onChangeVault = async (event: React.ChangeEvent) => { + const handleTokenChange = async (value: string) => { setIsApproved(false); setTokenBalance("0"); setTokenBalanceUSD("0"); - setSelectedVault(event.target.value); + setSelectedVault(value); // Clean form setAddCollateralTxt(""); setAddCollateralUSD("0"); @@ -956,17 +965,20 @@ const Details = ({ address, t }: props) => { setBurnUSD("0"); setBurnFee("0"); // Load values - history?.push(`/vault/${event.target.value}`); + history?.push(`/vault/${value}`); await refetch(); }; useEffect(() => { async function load() { let vOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK", "WBTC"]; - if (isOptimism(currentNetwork.chainId)) { + if (isHardMode()) { + vOptions = ["ETH", "WETH"]; + } + if (isOptimism(currentNetwork.chainId) && !isHardMode()) { vOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; } - if (isPolygon(currentNetwork.chainId)) { + if (isPolygon(currentNetwork.chainId) && !isHardMode()) { vOptions = ["MATIC", "DAI", "WBTC"]; } setVaultOptions(vOptions); @@ -987,128 +999,151 @@ const Details = ({ address, t }: props) => { ); } - return ( - <> -

{t("vault.subtitle1")}

-
+ const CollateralDropdown = () => ( +
+
Collateral:
+ handleTokenChange(eventKey || "ETH")}> + +
+ {selectedVault.toUpperCase()} +
+
+ + {vaultOptions.map((item) => ( + + {item} + + ))} + +
+
+ ); + + const CollateralBalance = () => ( +
+
{(() => { switch (selectedVault) { case "DAI": - return ; + return ; case "AAVE": - return ; + return ; case "LINK": - return ; + return ; case "UNI": - return ; + return ; case "SNX": - return ; + return ; case "MATIC": - return ; + return ; case "WBTC": return ; default: - return ; + return ; } })()} +

+ +

+
+

+ 1000 ? 0 : 2} + /> +

+
+ ); -
- - {vaultOptions.map((val) => ( - - ))} - -

- {" "} - {selectedVault} /{" "} - -

-
+ const CollateralBalance2 = () => ( +
+
+ {(() => { + switch (selectedVault) { + case "DAI": + return ; + case "AAVE": + return ; + case "LINK": + return ; + case "UNI": + return ; + case "SNX": + return ; + case "MATIC": + return ; + case "WBTC": + return ; + default: + return ; + } + })()} +

+ +

+ / +
+ 1000 ? 0 : 2} + /> +
+ ); + + return ( + <> +
+ + {radios.map((radio, idx) => ( + handleRadioBtnChange(e.currentTarget.value)} + > + {radio.name} + + ))} +
{isApproved ? ( <>
- {(() => { - switch (selectedVault) { - case "DAI": - return ; - case "AAVE": - return ; - case "LINK": - return ; - case "UNI": - return ; - case "SNX": - return ; - case "MATIC": - return ; - case "WBTC": - return ; - default: - return ; - } - })()} -
-

{t("vault.balance-title", { vault: selectedVault })}

-
-
- {(() => { - switch (selectedVault) { - case "DAI": - return ; - case "AAVE": - return ; - case "LINK": - return ; - case "UNI": - return ; - case "SNX": - return ; - case "MATIC": - return ; - case "WBTC": - return ; - default: - return ; - } - })()} -

- -

-
-

- 1000 ? 0 : 2} - /> -

+ + + + +
+

{t("vault.balance-title", { vault: selectedVault })}

+
-
+ @@ -1377,11 +1412,19 @@ const Details = ({ address, t }: props) => { ) : (
-
{title}
-

{text}

- + + + + + + +
{title}
+

{text}

+ +
+
)} diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index 44089c0..e46fde3 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -15879,20 +15879,68 @@ "type": "receive" } ] - } - } - } - }, - "4": { - "rinkeby": { - "name": "rinkeby", - "chainId": "4", - "contracts": { - "AAVE": { - "address": "0x8B4A041A619aC26B33e5BAEe9585e569387ec837", + }, + "HardWETHVaultHandler": { + "address": "0x5Da610f142f6762AB7f64aa305c39563a1cF336e", "abi": [ { - "inputs": [], + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], "stateMutability": "nonpayable", "type": "constructor" }, @@ -15902,23 +15950,23 @@ { "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" } ], - "name": "Approval", + "name": "CollateralAdded", "type": "event" }, { @@ -15927,329 +15975,367 @@ { "indexed": true, "internalType": "address", - "name": "from", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" } ], - "name": "Transfer", + "name": "CollateralRemoved", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewBurnFee", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewLiquidationPenalty", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_minimumTCAP", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewMinimumTCAP", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "_owner", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_ratio", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" + "name": "NewRatio", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewTreasury", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "increaseAllowance", - "outputs": [ + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "_account", + "name": "_token", "type": "address" }, { + "indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" + "name": "Recovered", + "type": "event" }, { - "inputs": [], - "name": "symbol", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", - "name": "recipient", + "name": "account", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "transfer", - "outputs": [ + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "TokensBurned", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "sender", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "recipient", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "transferFrom", - "outputs": [ + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "AaveOracle": { - "address": "0x73Ebb8b08f056F451c2aA53dCAd7A35ce6aD52D0", - "abi": [ + "name": "Unpaused", + "type": "event" + }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_aggregator", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "_timelock", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "VaultCreated", + "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "_liquidator", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" } ], - "name": "OwnershipTransferred", + "name": "VaultLiquidated", "type": "event" }, { "inputs": [], - "name": "getLatestAnswer", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "int256", + "internalType": "bytes32", "name": "", - "type": "int256" + "type": "bytes32" } ], "stateMutability": "view", @@ -16257,32 +16343,25 @@ }, { "inputs": [], - "name": "getLatestRound", + "name": "ETHPriceOracle", "outputs": [ { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" - }, + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ { - "internalType": "uint80", + "internalType": "uint8", "name": "", - "type": "uint80" + "type": "uint8" } ], "stateMutability": "view", @@ -16290,7 +16369,7 @@ }, { "inputs": [], - "name": "getLatestTimestamp", + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -16302,38 +16381,39 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousAnswer", + "inputs": [], + "name": "MIN_RATIO", "outputs": [ { - "internalType": "int256", + "internalType": "uint256", "name": "", - "type": "int256" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "uint256", + "name": "price", + "type": "uint256" } ], - "name": "getPreviousTimestamp", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", "outputs": [ { - "internalType": "uint256", + "internalType": "contract TCAP", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -16342,10 +16422,1231 @@ { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "addCollateralETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateralETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + } + } + } + }, + "4": { + "rinkeby": { + "name": "rinkeby", + "chainId": "4", + "contracts": { + "AAVE": { + "address": "0x8B4A041A619aC26B33e5BAEe9585e569387ec837", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "AaveOracle": { + "address": "0x73Ebb8b08f056F451c2aA53dCAd7A35ce6aD52D0", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_timelock", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } ], "name": "getRound", "outputs": [ @@ -24864,119 +26165,378 @@ "type": "bytes32" }, { - "indexed": true, + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimVest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "earned", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getRewardForDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { "internalType": "address", "name": "account", "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" } ], - "name": "RoleGranted", - "type": "event" + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, "internalType": "address", "name": "account", "type": "address" - }, + } + ], + "name": "hasRole", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "RoleRevoked", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" } ], - "name": "Staked", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" + "internalType": "uint256", + "name": "_a", + "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_b", "type": "uint256" } ], - "name": "Withdrawn", - "type": "event" + "name": "min", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "owner", "outputs": [ { - "internalType": "bytes32", + "internalType": "address", "name": "", - "type": "bytes32" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "paused", + "outputs": [ { - "internalType": "address", - "name": "_account", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "balanceOf", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "periodFinish", "outputs": [ { "internalType": "uint256", @@ -24987,22 +26547,70 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], - "name": "claimVest", + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "_account", + "name": "account", "type": "address" } ], - "name": "earned", + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", "outputs": [ { "internalType": "uint256", @@ -25015,21 +26623,20 @@ }, { "inputs": [], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", + "name": "rewardPerTokenStored", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "getRewardForDuration", + "name": "rewardRate", "outputs": [ { "internalType": "uint256", @@ -25043,39 +26650,41 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "getRoleAdmin", + "name": "rewards", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "inputs": [], + "name": "rewardsDuration", + "outputs": [ { "internalType": "uint256", - "name": "index", + "name": "", "type": "uint256" } ], - "name": "getRoleMember", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardsToken", "outputs": [ { - "internalType": "address", + "internalType": "contract IERC20", "name": "", "type": "address" } @@ -25085,60 +26694,38 @@ }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_rewardsDuration", "type": "uint256" } ], - "stateMutability": "view", + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "grantRole", + "name": "stake", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", + "inputs": [], + "name": "stakingToken", "outputs": [ { - "internalType": "bool", + "internalType": "contract IERC20", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", @@ -25146,7 +26733,7 @@ }, { "inputs": [], - "name": "lastTimeRewardApplicable", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -25158,32 +26745,27 @@ "type": "function" }, { - "inputs": [], - "name": "lastUpdateTime", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_a", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_b", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "min", + "name": "userRewardPerTokenPaid", "outputs": [ { "internalType": "uint256", @@ -25191,30 +26773,23 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_reward", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "notifyRewardAmount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", + "name": "vestingAmounts", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -25222,12 +26797,12 @@ }, { "inputs": [], - "name": "paused", + "name": "vestingEnd", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", @@ -25235,7 +26810,7 @@ }, { "inputs": [], - "name": "periodFinish", + "name": "vestingRatio", "outputs": [ { "internalType": "uint256", @@ -25248,118 +26823,183 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "_tokenAddress", - "type": "address" - }, { "internalType": "uint256", - "name": "_tokenAmount", + "name": "_amount", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", + "name": "withdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "GovernorAlpha": { + "address": "0x6f0663fb471c8329De64fb86a2c1b741bb02cB20", + "abi": [ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "timelock_", + "type": "address" }, { "internalType": "address", - "name": "account", + "name": "ctx_", "type": "address" } ], - "name": "renounceRole", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "ProposalCanceled", + "type": "event" }, { - "inputs": [], - "name": "rewardPerToken", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "indexed": false, + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startBlock", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endBlock", "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" } ], - "stateMutability": "view", - "type": "function" + "name": "ProposalCreated", + "type": "event" }, { - "inputs": [], - "name": "rewardPerTokenStored", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "id", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "ProposalExecuted", + "type": "event" }, { - "inputs": [], - "name": "rewardRate", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "eta", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "ProposalQueued", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "voter", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "support", + "type": "bool" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "votes", + "type": "uint256" } ], - "name": "rewards", + "name": "VoteCast", + "type": "event" + }, + { + "inputs": [], + "name": "BALLOT_TYPEHASH", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", @@ -25367,39 +27007,44 @@ }, { "inputs": [], - "name": "rewardsDuration", + "name": "DOMAIN_TYPEHASH", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "rewardsToken", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" } ], - "stateMutability": "view", + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_rewardsDuration", + "name": "proposalId", "type": "uint256" + }, + { + "internalType": "bool", + "name": "support", + "type": "bool" } ], - "name": "setRewardsDuration", + "name": "castVote", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -25408,21 +27053,41 @@ "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "proposalId", "type": "uint256" + }, + { + "internalType": "bool", + "name": "support", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" } ], - "name": "stake", + "name": "castVoteBySig", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "stakingToken", + "name": "ctx", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "contract CtxInterface", "name": "", "type": "address" } @@ -25431,45 +27096,88 @@ "type": "function" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "proposalId", "type": "uint256" } ], - "stateMutability": "view", + "name": "execute", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getActions", + "outputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, { "internalType": "address", - "name": "", + "name": "voter", "type": "address" } ], - "name": "userRewardPerTokenPaid", + "name": "getReceipt", "outputs": [ { - "internalType": "uint256", + "components": [ + { + "internalType": "bool", + "name": "hasVoted", + "type": "bool" + }, + { + "internalType": "bool", + "name": "support", + "type": "bool" + }, + { + "internalType": "uint96", + "name": "votes", + "type": "uint96" + } + ], + "internalType": "struct GovernorAlpha.Receipt", "name": "", - "type": "uint256" + "type": "tuple" } ], "stateMutability": "view", @@ -25483,7 +27191,7 @@ "type": "address" } ], - "name": "vestingAmounts", + "name": "latestProposalIds", "outputs": [ { "internalType": "uint256", @@ -25496,12 +27204,12 @@ }, { "inputs": [], - "name": "vestingEnd", + "name": "name", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], "stateMutability": "view", @@ -25509,7 +27217,7 @@ }, { "inputs": [], - "name": "vestingRatio", + "name": "proposalCount", "outputs": [ { "internalType": "uint256", @@ -25521,184 +27229,203 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "proposalMaxOperations", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" - } - ] - }, - "GovernorAlpha": { - "address": "0x6f0663fb471c8329De64fb86a2c1b741bb02cB20", - "abi": [ + }, { - "inputs": [ - { - "internalType": "address", - "name": "timelock_", - "type": "address" - }, + "inputs": [], + "name": "proposalThreshold", + "outputs": [ { - "internalType": "address", - "name": "ctx_", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "pure", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "uint256", - "name": "id", + "name": "", "type": "uint256" } ], - "name": "ProposalCanceled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "proposals", + "outputs": [ { - "indexed": false, "internalType": "uint256", "name": "id", "type": "uint256" }, { - "indexed": false, "internalType": "address", "name": "proposer", "type": "address" }, { - "indexed": false, + "internalType": "uint256", + "name": "eta", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "startBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "forVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "againstVotes", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "canceled", + "type": "bool" + }, + { + "internalType": "bool", + "name": "executed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address[]", "name": "targets", "type": "address[]" }, { - "indexed": false, "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { - "indexed": false, "internalType": "string[]", "name": "signatures", "type": "string[]" }, { - "indexed": false, "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, { - "indexed": false, - "internalType": "uint256", - "name": "startBlock", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "endBlock", - "type": "uint256" - }, - { - "indexed": false, "internalType": "string", "name": "description", "type": "string" } ], - "name": "ProposalCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "propose", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "id", + "name": "", "type": "uint256" } ], - "name": "ProposalExecuted", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "uint256", - "name": "id", + "name": "proposalId", "type": "uint256" - }, + } + ], + "name": "queue", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "quorumVotes", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "eta", + "name": "", "type": "uint256" } ], - "name": "ProposalQueued", - "type": "event" + "stateMutability": "pure", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { "internalType": "address", - "name": "voter", + "name": "", "type": "address" - }, + } + ], + "name": "receipts", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" + "internalType": "bool", + "name": "hasVoted", + "type": "bool" }, { - "indexed": false, "internalType": "bool", "name": "support", "type": "bool" }, { - "indexed": false, - "internalType": "uint256", + "internalType": "uint96", "name": "votes", - "type": "uint256" + "type": "uint96" } ], - "name": "VoteCast", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "inputs": [], - "name": "BALLOT_TYPEHASH", + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "state", "outputs": [ { - "internalType": "bytes32", + "internalType": "enum GovernorAlpha.ProposalState", "name": "", - "type": "bytes32" + "type": "uint8" } ], "stateMutability": "view", @@ -25706,89 +27433,122 @@ }, { "inputs": [], - "name": "DOMAIN_TYPEHASH", + "name": "timelock", "outputs": [ { - "internalType": "bytes32", + "internalType": "contract TimelockInterface", "name": "", - "type": "bytes32" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "votingDelay", + "outputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "", "type": "uint256" } ], - "name": "cancel", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "votingPeriod", + "outputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "", "type": "uint256" - }, - { - "internalType": "bool", - "name": "support", - "type": "bool" } ], - "name": "castVote", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" + } + ] + }, + "LINK": { + "address": "0x5717DC7Cc0489dCc00316bcDB7e752aec664673e", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" }, { - "internalType": "bool", - "name": "support", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" }, { - "internalType": "uint8", - "name": "v", - "type": "uint8" + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" }, { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" }, { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "castVoteBySig", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Transfer", + "type": "event" }, { - "inputs": [], - "name": "ctx", + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", "outputs": [ { - "internalType": "contract CtxInterface", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -25796,46 +27556,73 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "proposalId", + "name": "amount", "type": "uint256" } ], - "name": "execute", - "outputs": [], - "stateMutability": "payable", + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "getActions", + "name": "balanceOf", "outputs": [ { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" + "internalType": "address", + "name": "_account", + "type": "address" }, { - "internalType": "string[]", - "name": "signatures", - "type": "string[]" - }, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], "stateMutability": "view", @@ -25843,62 +27630,68 @@ }, { "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, { "internalType": "address", - "name": "voter", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" } ], - "name": "getReceipt", + "name": "decreaseAllowance", "outputs": [ { - "components": [ - { - "internalType": "bool", - "name": "hasVoted", - "type": "bool" - }, - { - "internalType": "bool", - "name": "support", - "type": "bool" - }, - { - "internalType": "uint96", - "name": "votes", - "type": "uint96" - } - ], - "internalType": "struct GovernorAlpha.Receipt", + "internalType": "bool", "name": "", - "type": "tuple" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" } ], - "name": "latestProposalIds", + "name": "increaseAllowance", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -25916,12 +27709,12 @@ }, { "inputs": [], - "name": "proposalCount", + "name": "symbol", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], "stateMutability": "view", @@ -25929,7 +27722,7 @@ }, { "inputs": [], - "name": "proposalMaxOperations", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -25937,110 +27730,151 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "proposalThreshold", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ + "name": "transfer", + "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "name": "proposals", - "outputs": [ + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "uint256", - "name": "id", - "type": "uint256" + "internalType": "address", + "name": "sender", + "type": "address" }, { "internalType": "address", - "name": "proposer", + "name": "recipient", "type": "address" }, { "internalType": "uint256", - "name": "eta", + "name": "amount", "type": "uint256" - }, + } + ], + "name": "transferFrom", + "outputs": [ { - "internalType": "uint256", - "name": "startBlock", - "type": "uint256" - }, + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "LinkOracle": { + "address": "0xEecF07643384C689C7AB804887ef2187cE75D5Ec", + "abi": [ + { + "inputs": [ { - "internalType": "uint256", - "name": "endBlock", - "type": "uint256" + "internalType": "address", + "name": "_aggregator", + "type": "address" }, { - "internalType": "uint256", - "name": "forVotes", - "type": "uint256" - }, + "internalType": "address", + "name": "_timelock", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "againstVotes", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" }, { - "internalType": "bool", - "name": "canceled", - "type": "bool" - }, + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ { - "internalType": "bool", - "name": "executed", - "type": "bool" + "internalType": "int256", + "name": "", + "type": "int256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getLatestRound", + "outputs": [ { - "internalType": "address[]", - "name": "targets", - "type": "address[]" + "internalType": "uint80", + "name": "", + "type": "uint80" }, { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" + "internalType": "int256", + "name": "", + "type": "int256" }, { - "internalType": "string[]", - "name": "signatures", - "type": "string[]" + "internalType": "uint256", + "name": "", + "type": "uint256" }, { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" + "internalType": "uint256", + "name": "", + "type": "uint256" }, { - "internalType": "string", - "name": "description", - "type": "string" + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "propose", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", "outputs": [ { "internalType": "uint256", @@ -26048,25 +27882,37 @@ "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "queue", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "quorumVotes", + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", "outputs": [ { "internalType": "uint256", @@ -26074,57 +27920,56 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint256", + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", "name": "", - "type": "uint256" + "type": "uint80" }, { - "internalType": "address", + "internalType": "int256", "name": "", - "type": "address" - } - ], - "name": "receipts", - "outputs": [ + "type": "int256" + }, { - "internalType": "bool", - "name": "hasVoted", - "type": "bool" + "internalType": "uint256", + "name": "", + "type": "uint256" }, { - "internalType": "bool", - "name": "support", - "type": "bool" + "internalType": "uint256", + "name": "", + "type": "uint256" }, { - "internalType": "uint96", - "name": "votes", - "type": "uint96" + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "state", + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "enum GovernorAlpha.ProposalState", + "internalType": "address", "name": "", - "type": "uint8" + "type": "address" } ], "stateMutability": "view", @@ -26132,77 +27977,126 @@ }, { "inputs": [], - "name": "timelock", - "outputs": [ + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "contract TimelockInterface", - "name": "", + "internalType": "address", + "name": "_aggregator", "type": "address" } ], - "stateMutability": "view", + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "votingDelay", + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "pure", "type": "function" }, { - "inputs": [], - "name": "votingPeriod", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "pure", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" } ] }, - "LINK": { - "address": "0x5717DC7Cc0489dCc00316bcDB7e752aec664673e", + "LinkVaultHandler": { + "address": "0xBd4a21cC2D12157765a8861A83FC4cfd216630b1", "abi": [ { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, "inputs": [ { - "indexed": true, + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { "internalType": "address", - "name": "owner", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "spender", + "name": "_collateralAddress", "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" } ], - "name": "Approval", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, @@ -26210,329 +28104,373 @@ { "indexed": true, "internalType": "address", - "name": "from", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" } ], - "name": "Transfer", + "name": "CollateralAdded", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "CollateralRemoved", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_burnFee", "type": "uint256" } ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewBurnFee", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_liquidationPenalty", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewLiquidationPenalty", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "_owner", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_ratio", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" + "name": "NewRatio", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewTreasury", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "increaseAllowance", - "outputs": [ + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "_account", + "name": "_token", "type": "address" }, { + "indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Recovered", + "type": "event" }, { - "inputs": [], - "name": "name", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { - "inputs": [], - "name": "symbol", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "recipient", + "name": "_owner", "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "amount", + "name": "_id", "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "TokensBurned", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "sender", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "recipient", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "transferFrom", - "outputs": [ + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "LinkOracle": { - "address": "0xEecF07643384C689C7AB804887ef2187cE75D5Ec", - "abi": [ + "name": "Unpaused", + "type": "event" + }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_aggregator", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "_timelock", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "VaultCreated", + "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "_liquidator", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" } ], - "name": "OwnershipTransferred", + "name": "VaultLiquidated", "type": "event" }, { "inputs": [], - "name": "getLatestAnswer", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "int256", + "internalType": "bytes32", "name": "", - "type": "int256" + "type": "bytes32" } ], "stateMutability": "view", @@ -26540,32 +28478,25 @@ }, { "inputs": [], - "name": "getLatestRound", + "name": "ETHPriceOracle", "outputs": [ { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" - }, + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], "stateMutability": "view", @@ -26573,7 +28504,7 @@ }, { "inputs": [], - "name": "getLatestTimestamp", + "name": "MIN_RATIO", "outputs": [ { "internalType": "uint256", @@ -26585,19 +28516,26 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "uint256", + "name": "price", + "type": "uint256" } ], - "name": "getPreviousAnswer", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", "outputs": [ { - "internalType": "int256", + "internalType": "contract TCAP", "name": "", - "type": "int256" + "type": "address" } ], "stateMutability": "view", @@ -26605,57 +28543,51 @@ }, { "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousTimestamp", - "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "getRound", + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, { "internalType": "uint256", "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ { - "internalType": "uint80", + "internalType": "contract IERC20", "name": "", - "type": "uint80" + "type": "address" } ], "stateMutability": "view", @@ -26663,10 +28595,10 @@ }, { "inputs": [], - "name": "owner", + "name": "collateralPriceOracle", "outputs": [ { - "internalType": "address", + "internalType": "contract ChainlinkOracle", "name": "", "type": "address" } @@ -26676,563 +28608,582 @@ }, { "inputs": [], - "name": "renounceOwnership", + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { - "internalType": "address", - "name": "_aggregator", + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", "type": "address" } ], - "name": "setReferenceContract", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "supportsInterface", + "name": "getRoleAdmin", "outputs": [ { - "internalType": "bool", + "internalType": "bytes32", "name": "", - "type": "bool" + "type": "bytes32" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ { "internalType": "address", - "name": "newOwner", + "name": "", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "LinkVaultHandler": { - "address": "0xBd4a21cC2D12157765a8861A83FC4cfd216630b1", - "abi": [ + }, { "inputs": [ { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ { "internalType": "uint256", - "name": "_divisor", + "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "_ratio", + "name": "_id", "type": "uint256" - }, + } + ], + "name": "getVault", + "outputs": [ { "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" }, { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" }, { "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", + "name": "", "type": "address" }, { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "internalType": "address", - "name": "_rewardHandler", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "address", - "name": "_treasury", + "name": "account", "type": "address" } ], + "name": "grantRole", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "CollateralAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_vaultId", "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_maxTCAP", "type": "uint256" } ], - "name": "CollateralRemoved", - "type": "event" + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" } ], - "name": "NewBurnFee", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "rewardCollateral", "type": "uint256" } ], - "name": "NewLiquidationPenalty", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "_ratio", + "name": "_amount", "type": "uint256" } ], - "name": "NewRatio", - "type": "event" + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "oracleDigits", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "_tresury", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "NewTreasury", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "ratio", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Paused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "_token", + "name": "_tokenAddress", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "RoleAdminChanged", - "type": "event" + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, "internalType": "address", "name": "account", "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" } ], - "name": "RoleRevoked", - "type": "event" + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "requiredCollateral", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "collateral", "type": "uint256" } ], - "name": "TokensBurned", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_vaultId", "type": "uint256" - }, + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], - "name": "TokensMinted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { "internalType": "address", "name": "account", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "rewardHandler", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", + "internalType": "contract IRewardHandler", + "name": "", "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" } ], - "name": "VaultCreated", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "_liquidator", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "_liquidationCollateral", + "name": "_burnFee", "type": "uint256" - }, + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_reward", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "VaultLiquidated", - "type": "event" + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ + "inputs": [ { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" } ], - "stateMutability": "view", + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "ETHPriceOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", + "internalType": "address", + "name": "_treasury", "type": "address" } ], - "stateMutability": "view", + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "MAX_FEE", + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "MIN_RATIO", + "name": "tcapOracle", "outputs": [ { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "TCAPPrice", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "price", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "TCAPToken", + "name": "treasury", "outputs": [ { - "internalType": "contract TCAP", + "internalType": "address", "name": "", "type": "address" } @@ -27240,137 +29191,242 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "addCollateral", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "burnFee", + "name": "vaults", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], "stateMutability": "view", "type": "function" + } + ] + }, + "Orchestrator": { + "address": "0x32ac6dBaf90A4C45f160D13B32fDD10D75D09976", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_guardian", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" }, { - "inputs": [], - "name": "collateralContract", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract IERC20", - "name": "", + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "guardian", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "GuardianSet", + "type": "event" }, { - "inputs": [], - "name": "collateralPriceOracle", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "counter", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "target", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "_value", + "name": "value", "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "stateMutability": "view", - "type": "function" + "name": "TransactionExecuted", + "type": "event" }, { - "inputs": [], - "name": "createVault", + "inputs": [ + { + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" + }, + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "addTCAPVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "divisor", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" + }, + { + "internalType": "bool", + "name": "_enable", + "type": "bool" } ], - "stateMutability": "view", + "name": "enableTCAPCap", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, { "internalType": "uint256", - "name": "_amount", + "name": "value", "type": "uint256" + }, + { + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "name": "getFee", + "name": "executeTransaction", "outputs": [ { - "internalType": "uint256", - "name": "fee", - "type": "uint256" + "internalType": "bytes", + "name": "", + "type": "bytes" } ], - "stateMutability": "view", + "stateMutability": "payable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "guardian", + "outputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "internalType": "address", + "name": "", "type": "address" } ], - "name": "getOraclePrice", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "uint256", - "name": "price", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], "stateMutability": "view", @@ -27379,334 +29435,380 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" } ], - "stateMutability": "view", + "name": "pauseVault", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" }, { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", + "internalType": "contract IVaultHandler", + "name": "_vault", "type": "address" } ], - "stateMutability": "view", + "name": "removeTCAPVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_to", + "type": "address" } ], - "stateMutability": "view", + "name": "retrieveETH", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_id", - "type": "uint256" - } - ], - "name": "getVault", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", + "internalType": "contract IVaultHandler", + "name": "_vault", "type": "address" }, { "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "getVaultRatio", - "outputs": [ - { - "internalType": "uint256", - "name": "currentRatio", - "type": "uint256" + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" } ], - "stateMutability": "view", + "name": "setEmergencyBurnFee", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", + "internalType": "contract IVaultHandler", + "name": "_vault", "type": "address" } ], - "name": "grantRole", + "name": "setEmergencyLiquidationPenalty", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "_guardian", "type": "address" } ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", + "name": "setGuardian", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" }, { "internalType": "uint256", - "name": "_maxTCAP", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "liquidateVault", + "name": "setLiquidationPenalty", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "liquidationPenalty", - "outputs": [ + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" } ], - "stateMutability": "view", + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" + }, { "internalType": "uint256", - "name": "_vaultId", + "name": "_cap", "type": "uint256" } ], - "name": "liquidationReward", - "outputs": [ + "name": "setTCAPCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "uint256", - "name": "rewardCollateral", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" } ], - "name": "mint", + "name": "unpauseVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "oracleDigits", - "outputs": [ + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "TCAP": { + "address": "0x565224C2b5Bdf33f3970d35f82945075F90128F4", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, { "internalType": "uint256", - "name": "", + "name": "_cap", "type": "uint256" + }, + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Approval", + "type": "event" }, { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "NewCap", + "type": "event" }, { - "inputs": [], - "name": "paused", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": false, "internalType": "bool", - "name": "", + "name": "_enable", "type": "bool" } ], - "stateMutability": "view", - "type": "function" + "name": "NewCapEnabled", + "type": "event" }, { - "inputs": [], - "name": "ratio", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_tokenAddress", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_tokenAmount", + "name": "value", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Transfer", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_tokenHandler", + "type": "address" } ], - "name": "removeCollateral", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "VaultHandlerAdded", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "account", + "name": "_tokenHandler", "type": "address" } ], - "name": "renounceRole", + "name": "VaultHandlerRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vaultHandler", + "type": "address" + } + ], + "name": "addVaultHandler", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -27714,16 +29816,21 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" } ], - "name": "requiredCollateral", + "name": "allowance", "outputs": [ { "internalType": "uint256", - "name": "collateral", + "name": "", "type": "uint256" } ], @@ -27732,49 +29839,42 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "_vaultId", + "name": "amount", "type": "uint256" } ], - "name": "requiredLiquidationTCAP", + "name": "approve", "outputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", "name": "account", "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardHandler", + "name": "balanceOf", "outputs": [ { - "internalType": "contract IRewardHandler", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -27782,65 +29882,75 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, { "internalType": "uint256", - "name": "_burnFee", + "name": "_amount", "type": "uint256" } ], - "name": "setBurnFee", + "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "cap", + "outputs": [ { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "capEnabled", + "outputs": [ { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "setRatio", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "decimals", + "outputs": [ { - "internalType": "address", - "name": "_treasury", - "type": "address" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], - "name": "setTreasury", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" } ], - "name": "supportsInterface", + "name": "decreaseAllowance", "outputs": [ { "internalType": "bool", @@ -27848,52 +29958,43 @@ "type": "bool" } ], - "stateMutability": "pure", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "tcapOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", - "type": "address" + "internalType": "bool", + "name": "_enable", + "type": "bool" } ], - "stateMutability": "view", + "name": "enableCap", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "treasury", + "name": "increaseAllowance", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -27901,173 +30002,145 @@ "inputs": [ { "internalType": "address", - "name": "", + "name": "_account", "type": "address" - } - ], - "name": "userToVault", - "outputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "name", + "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], - "name": "vaults", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", "outputs": [ - { - "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Debt", - "type": "uint256" - }, { "internalType": "address", - "name": "Owner", + "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" - } - ] - }, - "Orchestrator": { - "address": "0x32ac6dBaf90A4C45f160D13B32fDD10D75D09976", - "abi": [ + }, { "inputs": [ { "internalType": "address", - "name": "_guardian", + "name": "_vaultHandler", "type": "address" } ], + "name": "removeVaultHandler", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "guardian", - "type": "address" + "internalType": "uint256", + "name": "_cap", + "type": "uint256" } ], - "name": "GuardianSet", - "type": "event" + "name": "setCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "pure", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, + "inputs": [], + "name": "symbol", + "outputs": [ { - "indexed": false, "internalType": "string", - "name": "signature", + "name": "", "type": "string" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" } ], - "name": "TransactionExecuted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "inputs": [ - { - "internalType": "contract TCAP", - "name": "_tcap", - "type": "address" - }, + "inputs": [], + "name": "totalSupply", + "outputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "addTCAPVault", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "contract TCAP", - "name": "_tcap", + "internalType": "address", + "name": "recipient", "type": "address" }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ { "internalType": "bool", - "name": "_enable", + "name": "", "type": "bool" } ], - "name": "enableTCAPCap", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -28075,233 +30148,250 @@ "inputs": [ { "internalType": "address", - "name": "target", + "name": "sender", "type": "address" }, { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "string", - "name": "signature", - "type": "string" + "internalType": "address", + "name": "recipient", + "type": "address" }, { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "executeTransaction", + "name": "transferFrom", "outputs": [ { - "internalType": "bytes", + "internalType": "bool", "name": "", - "type": "bytes" + "type": "bool" } ], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "guardian", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], + "name": "vaultHandlers", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "view", "type": "function" - }, + } + ] + }, + "TCAPOracle": { + "address": "0x87388c142a3848F966FBA7Db22663D9CCa7d8a86", + "abi": [ { "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", + "internalType": "address", + "name": "_aggregator", "type": "address" } ], - "name": "pauseVault", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "contract TCAP", - "name": "_tcap", + "indexed": true, + "internalType": "address", + "name": "previousOwner", "type": "address" }, { - "internalType": "contract IVaultHandler", - "name": "_vault", + "indexed": true, + "internalType": "address", + "name": "newOwner", "type": "address" } - ], - "name": "removeTCAPVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + ], + "name": "OwnershipTransferred", + "type": "event" }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "getLatestAnswer", + "outputs": [ { - "internalType": "address", - "name": "_to", - "type": "address" + "internalType": "int256", + "name": "", + "type": "int256" } ], - "name": "retrieveETH", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getLatestRound", + "outputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" }, { "internalType": "uint256", - "name": "_burnFee", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "setEmergencyBurnFee", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "setEmergencyLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "getPreviousAnswer", + "outputs": [ { - "internalType": "address", - "name": "_guardian", - "type": "address" + "internalType": "int256", + "name": "", + "type": "int256" } ], - "name": "setGuardian", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" - }, + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" }, { "internalType": "uint256", - "name": "_ratio", + "name": "", "type": "uint256" - } - ], - "name": "setRatio", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract TCAP", - "name": "_tcap", - "type": "address" }, { "internalType": "uint256", - "name": "_cap", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "setTCAPCap", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "newOwner", + "name": "", "type": "address" } ], - "name": "transferOwnership", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -28309,131 +30399,110 @@ { "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", + "internalType": "address", + "name": "_aggregator", "type": "address" } ], - "name": "unpauseVault", + "name": "setReferenceContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "TCAP": { - "address": "0x565224C2b5Bdf33f3970d35f82945075F90128F4", - "abi": [ { "inputs": [ { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "string", - "name": "_symbol", - "type": "string" - }, - { - "internalType": "uint256", - "name": "_cap", - "type": "uint256" - }, - { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" } ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, + "name": "supportsInterface", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "Approval", - "type": "event" + "stateMutability": "pure", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "newOwner", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" } ], - "name": "NewCap", - "type": "event" - }, + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "Timelock": { + "address": "0x65a2B1B48b7997a50947E83aaf58E29a54a0B735", + "abi": [ { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "admin_", "type": "address" }, { - "indexed": false, - "internalType": "bool", - "name": "_enable", - "type": "bool" + "internalType": "uint256", + "name": "delay_", + "type": "uint256" } ], - "name": "NewCapEnabled", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" }, { "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "target", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "eta", + "type": "uint256" } ], - "name": "OwnershipTransferred", + "name": "CancelTransaction", "type": "event" }, { @@ -28441,14 +30510,14 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" }, { "indexed": true, "internalType": "address", - "name": "to", + "name": "target", "type": "address" }, { @@ -28456,9 +30525,27 @@ "internalType": "uint256", "name": "value", "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "eta", + "type": "uint256" } ], - "name": "Transfer", + "name": "ExecuteTransaction", "type": "event" }, { @@ -28467,17 +30554,11 @@ { "indexed": true, "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_tokenHandler", + "name": "newAdmin", "type": "address" } ], - "name": "VaultHandlerAdded", + "name": "NewAdmin", "type": "event" }, { @@ -28485,90 +30566,86 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_tokenHandler", - "type": "address" + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" } ], - "name": "VaultHandlerRemoved", + "name": "NewDelay", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_vaultHandler", + "name": "newPendingAdmin", "type": "address" } ], - "name": "addVaultHandler", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewPendingAdmin", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "owner", - "type": "address" + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" }, { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "target", "type": "address" - } - ], - "name": "allowance", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "value", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + }, { - "internalType": "address", - "name": "spender", - "type": "address" + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "eta", "type": "uint256" } ], - "name": "approve", + "name": "QueueTransaction", + "type": "event" + }, + { + "inputs": [], + "name": "GRACE_PERIOD", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", + "inputs": [], + "name": "MAXIMUM_DELAY", "outputs": [ { "internalType": "uint256", @@ -28580,57 +30657,79 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, + "inputs": [], + "name": "MINIMUM_DELAY", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "burn", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptAdmin", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "cap", + "name": "admin", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "capEnabled", - "outputs": [ + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "eta", + "type": "uint256" } ], - "stateMutability": "view", + "name": "cancelTransaction", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "decimals", + "name": "delay", "outputs": [ { - "internalType": "uint8", + "internalType": "uint256", "name": "", - "type": "uint8" + "type": "uint256" } ], "stateMutability": "view", @@ -28639,103 +30738,108 @@ { "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" }, { "internalType": "uint256", - "name": "subtractedValue", + "name": "eta", "type": "uint256" } ], - "name": "decreaseAllowance", + "name": "executeTransaction", "outputs": [ { - "internalType": "bool", + "internalType": "bytes", "name": "", - "type": "bool" + "type": "bytes" } ], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "pendingAdmin", + "outputs": [ { - "internalType": "bool", - "name": "_enable", - "type": "bool" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "enableCap", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "spender", + "name": "target", "type": "address" }, { "internalType": "uint256", - "name": "addedValue", + "name": "value", "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "internalType": "string", + "name": "signature", + "type": "string" + }, { - "internalType": "address", - "name": "_account", - "type": "address" + "internalType": "bytes", + "name": "data", + "type": "bytes" }, { "internalType": "uint256", - "name": "_amount", + "name": "eta", "type": "uint256" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", + "name": "queueTransaction", "outputs": [ { - "internalType": "string", + "internalType": "bytes32", "name": "", - "type": "string" + "type": "bytes32" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "owner", + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "queuedTransactions", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -28744,19 +30848,12 @@ { "inputs": [ { - "internalType": "address", - "name": "_vaultHandler", - "type": "address" + "internalType": "uint256", + "name": "delay_", + "type": "uint256" } ], - "name": "removeVaultHandler", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", + "name": "setDelay", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -28764,12 +30861,12 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_cap", - "type": "uint256" + "internalType": "address", + "name": "pendingAdmin_", + "type": "address" } ], - "name": "setCap", + "name": "setPendingAdmin", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -28794,205 +30891,162 @@ "type": "function" }, { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "WBTC": { + "address": "0x81A345e4627C614DaBA4E862A8c317023E935506", + "abi": [ { "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "recipient", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "Approval", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "sender", + "name": "from", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "recipient", + "name": "to", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "Transfer", + "type": "event" }, { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "owner", "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + }, { "internalType": "address", - "name": "", + "name": "spender", "type": "address" } ], - "name": "vaultHandlers", + "name": "allowance", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", "type": "function" - } - ] - }, - "TCAPOracle": { - "address": "0x87388c142a3848F966FBA7Db22663D9CCa7d8a86", - "abi": [ + }, { "inputs": [ { "internalType": "address", - "name": "_aggregator", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" } ], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "getLatestAnswer", + "name": "balanceOf", "outputs": [ { - "internalType": "int256", + "internalType": "uint256", "name": "", - "type": "int256" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "getLatestRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_account", + "type": "address" }, { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], - "stateMutability": "view", + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "getLatestTimestamp", + "name": "decimals", "outputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "", - "type": "uint256" + "type": "uint8" } ], "stateMutability": "view", @@ -29001,88 +31055,77 @@ { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" } ], - "name": "getPreviousAnswer", + "name": "decreaseAllowance", "outputs": [ { - "internalType": "int256", + "internalType": "bool", "name": "", - "type": "int256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" } ], - "name": "getPreviousTimestamp", + "name": "increaseAllowance", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_account", + "type": "address" }, { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], - "stateMutability": "view", + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "name", "outputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", @@ -29090,33 +31133,44 @@ }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "totalSupply", + "outputs": [ { - "internalType": "address", - "name": "_aggregator", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "setReferenceContract", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "supportsInterface", + "name": "transfer", "outputs": [ { "internalType": "bool", @@ -29124,127 +31178,85 @@ "type": "bool" } ], - "stateMutability": "pure", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "sender", "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "Timelock": { - "address": "0x65a2B1B48b7997a50947E83aaf58E29a54a0B735", - "abi": [ - { - "inputs": [ + }, { "internalType": "address", - "name": "admin_", + "name": "recipient", "type": "address" }, { "internalType": "uint256", - "name": "delay_", + "name": "amount", "type": "uint256" } ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", - "type": "constructor" - }, + "type": "function" + } + ] + }, + "WETH": { + "address": "0x5D3E425A099c2863224d6D63b330Df0F22B299b9", + "abi": [ { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32" + "internalType": "address", + "name": "src", + "type": "address" }, { "indexed": true, "internalType": "address", - "name": "target", + "name": "guy", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "eta", + "name": "wad", "type": "uint256" } ], - "name": "CancelTransaction", + "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32" - }, { "indexed": true, "internalType": "address", - "name": "target", + "name": "dst", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "eta", + "name": "wad", "type": "uint256" } ], - "name": "ExecuteTransaction", + "name": "Deposit", "type": "event" }, { @@ -29253,24 +31265,23 @@ { "indexed": true, "internalType": "address", - "name": "newAdmin", + "name": "src", "type": "address" - } - ], - "name": "NewAdmin", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "newDelay", + "name": "wad", "type": "uint256" } ], - "name": "NewDelay", + "name": "Transfer", "type": "event" }, { @@ -29279,59 +31290,76 @@ { "indexed": true, "internalType": "address", - "name": "newPendingAdmin", + "name": "src", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" } ], - "name": "NewPendingAdmin", + "name": "Withdrawal", "type": "event" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32" + "internalType": "address", + "name": "", + "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "target", + "name": "", "type": "address" - }, + } + ], + "name": "allowance", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "", "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "signature", - "type": "string" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "address", + "name": "guy", + "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "eta", + "name": "wad", "type": "uint256" } ], - "name": "QueueTransaction", - "type": "event" + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" }, { - "inputs": [], - "name": "GRACE_PERIOD", + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -29344,12 +31372,12 @@ }, { "inputs": [], - "name": "MAXIMUM_DELAY", + "name": "decimals", "outputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "", - "type": "uint256" + "type": "uint8" } ], "stateMutability": "view", @@ -29357,12 +31385,19 @@ }, { "inputs": [], - "name": "MINIMUM_DELAY", + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], "stateMutability": "view", @@ -29370,19 +31405,25 @@ }, { "inputs": [], - "name": "acceptAdmin", - "outputs": [], - "stateMutability": "nonpayable", + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "admin", + "name": "totalSupply", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -29392,38 +31433,152 @@ "inputs": [ { "internalType": "address", - "name": "target", + "name": "dst", "type": "address" }, { "internalType": "uint256", - "name": "value", + "name": "wad", "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "src", + "type": "address" }, { - "internalType": "string", - "name": "signature", - "type": "string" + "internalType": "address", + "name": "dst", + "type": "address" }, { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "WETHOracle": { + "address": "0x731Aa03C683Afb292732C31c1d50C491B8d8043F", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" }, { "internalType": "uint256", - "name": "eta", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "cancelTransaction", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "delay", + "name": "getLatestTimestamp", "outputs": [ { "internalType": "uint256", @@ -29437,50 +31592,36 @@ { "inputs": [ { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "eta", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "executeTransaction", + "name": "getPreviousAnswer", "outputs": [ { - "internalType": "bytes", + "internalType": "int256", "name": "", - "type": "bytes" + "type": "int256" } ], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "pendingAdmin", + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -29489,70 +31630,58 @@ { "inputs": [ { - "internalType": "address", - "name": "target", - "type": "address" - }, + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ { - "internalType": "uint256", - "name": "value", - "type": "uint256" + "internalType": "uint80", + "name": "", + "type": "uint80" }, { - "internalType": "string", - "name": "signature", - "type": "string" + "internalType": "int256", + "name": "", + "type": "int256" }, { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "uint256", + "name": "", + "type": "uint256" }, { "internalType": "uint256", - "name": "eta", + "name": "", "type": "uint256" - } - ], - "name": "queueTransaction", - "outputs": [ + }, { - "internalType": "bytes32", + "internalType": "uint80", "name": "", - "type": "bytes32" + "type": "uint80" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "queuedTransactions", + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "delay_", - "type": "uint256" - } - ], - "name": "setDelay", + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -29561,11 +31690,11 @@ "inputs": [ { "internalType": "address", - "name": "pendingAdmin_", + "name": "_aggregator", "type": "address" } ], - "name": "setPendingAdmin", + "name": "setReferenceContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -29574,7 +31703,7 @@ "inputs": [ { "internalType": "bytes4", - "name": "_interfaceId", + "name": "interfaceId", "type": "bytes4" } ], @@ -29589,438 +31718,378 @@ "stateMutability": "pure", "type": "function" }, - { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "WBTC": { - "address": "0x81A345e4627C614DaBA4E862A8c317023E935506", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, { "inputs": [ { "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", + "name": "newOwner", "type": "address" } ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "WETHRewardHandler": { + "address": "0x39347a6328e1D4601A389d4dB0B26aC305886fb0", + "abi": [ { "inputs": [ { "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ { "internalType": "address", - "name": "account", + "name": "_rewardsToken", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_vault", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "decimals", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint8", - "name": "", - "type": "uint8" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "spender", + "name": "token", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "subtractedValue", + "name": "amount", "type": "uint256" } ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "Recovered", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { + "indexed": false, "internalType": "uint256", - "name": "addedValue", + "name": "reward", "type": "uint256" } ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "RewardAdded", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "user", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "reward", "type": "uint256" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RewardPaid", + "type": "event" }, { - "inputs": [], - "name": "name", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardsDurationUpdated", + "type": "event" }, { - "inputs": [], - "name": "symbol", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", - "name": "recipient", + "name": "account", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", - "name": "sender", + "name": "account", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "recipient", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", "type": "address" }, { + "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "WETH": { - "address": "0x5D3E425A099c2863224d6D63b330Df0F22B299b9", - "abi": [ + "name": "Staked", + "type": "event" + }, { "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "src", + "name": "account", "type": "address" - }, + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { "indexed": true, "internalType": "address", - "name": "guy", + "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "wad", + "name": "amount", "type": "uint256" } ], - "name": "Approval", - "type": "event" + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "dst", + "name": "_account", "type": "address" - }, + } + ], + "name": "balanceOf", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "wad", + "name": "", "type": "uint256" } ], - "name": "Deposit", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "indexed": true, "internalType": "address", - "name": "dst", + "name": "_account", "type": "address" - }, + } + ], + "name": "earned", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "wad", + "name": "", "type": "uint256" } ], - "name": "Transfer", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "src", + "name": "_staker", "type": "address" - }, + } + ], + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getRewardForDuration", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "wad", + "name": "", "type": "uint256" } ], - "name": "Withdrawal", - "type": "event" + "stateMutability": "view", + "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "", + "name": "_staker", "type": "address" - }, + } + ], + "name": "getRewardFromVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "allowance", + "name": "getRoleAdmin", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", @@ -30029,36 +32098,36 @@ { "inputs": [ { - "internalType": "address", - "name": "guy", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "uint256", - "name": "wad", + "name": "index", "type": "uint256" } ], - "name": "approve", + "name": "getRoleMember", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "balanceOf", + "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", @@ -30070,33 +32139,42 @@ "type": "function" }, { - "inputs": [], - "name": "decimals", - "outputs": [ + "inputs": [ { - "internalType": "uint8", - "name": "", - "type": "uint8" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "deposit", + "name": "grantRole", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "name", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", "outputs": [ { - "internalType": "string", + "internalType": "bool", "name": "", - "type": "string" + "type": "bool" } ], "stateMutability": "view", @@ -30104,12 +32182,12 @@ }, { "inputs": [], - "name": "symbol", + "name": "lastTimeRewardApplicable", "outputs": [ { - "internalType": "string", + "internalType": "uint256", "name": "", - "type": "string" + "type": "uint256" } ], "stateMutability": "view", @@ -30117,7 +32195,7 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "lastUpdateTime", "outputs": [ { "internalType": "uint256", @@ -30131,46 +32209,56 @@ { "inputs": [ { - "internalType": "address", - "name": "dst", - "type": "address" + "internalType": "uint256", + "name": "_a", + "type": "uint256" }, { "internalType": "uint256", - "name": "wad", + "name": "_b", "type": "uint256" } ], - "name": "transfer", + "name": "min", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "src", - "type": "address" - }, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "dst", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "wad", - "type": "uint256" } ], - "name": "transferFrom", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { "internalType": "bool", @@ -30178,65 +32266,91 @@ "type": "bool" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "periodFinish", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, { "internalType": "uint256", - "name": "wad", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "withdraw", + "name": "recoverERC20", "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "WETHOracle": { - "address": "0x731Aa03C683Afb292732C31c1d50C491B8d8043F", - "abi": [ + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "_aggregator", + "name": "account", "type": "address" } ], + "name": "renounceRole", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { "inputs": [], - "name": "getLatestAnswer", + "name": "rewardPerToken", "outputs": [ { - "internalType": "int256", + "internalType": "uint256", "name": "", - "type": "int256" + "type": "uint256" } ], "stateMutability": "view", @@ -30244,32 +32358,12 @@ }, { "inputs": [], - "name": "getLatestRound", + "name": "rewardPerTokenStored", "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, { "internalType": "uint256", "name": "", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], "stateMutability": "view", @@ -30277,7 +32371,7 @@ }, { "inputs": [], - "name": "getLatestTimestamp", + "name": "rewardRate", "outputs": [ { "internalType": "uint256", @@ -30291,31 +32385,25 @@ { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "getPreviousAnswer", + "name": "rewards", "outputs": [ { - "internalType": "int256", + "internalType": "uint256", "name": "", - "type": "int256" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousTimestamp", + "inputs": [], + "name": "rewardsDuration", "outputs": [ { "internalType": "uint256", @@ -30327,73 +32415,71 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", + "inputs": [], + "name": "rewardsToken", "outputs": [ { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", + "internalType": "contract IERC20", "name": "", - "type": "int256" - }, + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_rewardsDuration", "type": "uint256" + } + ], + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_staker", + "type": "address" }, { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], - "stateMutability": "view", + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "totalSupply", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { "internalType": "address", - "name": "_aggregator", + "name": "newOwner", "type": "address" } ], - "name": "setReferenceContract", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -30401,60 +32487,148 @@ { "inputs": [ { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "supportsInterface", + "name": "userRewardPerTokenPaid", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "_staker", "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "transferOwnership", + "name": "withdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ] }, - "WETHRewardHandler": { - "address": "0x39347a6328e1D4601A389d4dB0B26aC305886fb0", + "WETHVaultHandler": { + "address": "0x093f8F7C7fCC6edf991309A5056feB5cA9579292", "abi": [ { "inputs": [ { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, "internalType": "address", "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "_rewardsToken", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { - "internalType": "address", - "name": "_vault", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "CollateralAdded", + "type": "event" }, { "anonymous": false, @@ -30462,62 +32636,80 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "OwnershipTransferred", + "name": "CollateralRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" } ], - "name": "Paused", + "name": "NewBurnFee", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "token", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "Recovered", + "name": "NewLiquidationPenalty", "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_ratio", "type": "uint256" } ], - "name": "RewardAdded", + "name": "NewRatio", "type": "event" }, { @@ -30526,30 +32718,68 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", "type": "address" }, { "indexed": false, - "internalType": "uint256", - "name": "reward", - "type": "uint256" + "internalType": "address", + "name": "_tresury", + "type": "address" } ], - "name": "RewardPaid", + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, { "indexed": false, "internalType": "uint256", - "name": "newDuration", + "name": "_amount", "type": "uint256" } ], - "name": "RewardsDurationUpdated", + "name": "Recovered", "type": "event" }, { @@ -30633,17 +32863,48 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", "type": "address" }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "Staked", + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", "type": "event" }, { @@ -30665,27 +32926,123 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", "type": "uint256" } ], - "name": "Withdrawn", - "type": "event" + "stateMutability": "view", + "type": "function" }, { "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "TCAPToken", "outputs": [ { - "internalType": "bytes32", + "internalType": "contract TCAP", "name": "", - "type": "bytes32" + "type": "address" } ], "stateMutability": "view", @@ -30694,12 +33051,39 @@ { "inputs": [ { - "internalType": "address", - "name": "_account", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "balanceOf", + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "addCollateralETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", "outputs": [ { "internalType": "uint256", @@ -30711,47 +33095,54 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "collateralContract", + "outputs": [ { - "internalType": "address", - "name": "_account", + "internalType": "contract IERC20", + "name": "", "type": "address" } ], - "name": "earned", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", "outputs": [ { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "counter", + "outputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "internalType": "uint256", + "name": "_value", + "type": "uint256" } ], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "getReward", + "name": "createVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "getRewardForDuration", + "name": "divisor", "outputs": [ { "internalType": "uint256", @@ -30765,14 +33156,39 @@ { "inputs": [ { - "internalType": "address", - "name": "_staker", + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", "type": "address" } ], - "name": "getRewardFromVault", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { @@ -30837,6 +33253,59 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -30880,21 +33349,26 @@ "type": "function" }, { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", "type": "uint256" } ], - "stateMutability": "view", + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "lastUpdateTime", + "name": "liquidationPenalty", "outputs": [ { "internalType": "uint256", @@ -30909,39 +33383,47 @@ "inputs": [ { "internalType": "uint256", - "name": "_a", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_b", + "name": "_vaultId", "type": "uint256" } ], - "name": "min", + "name": "liquidationReward", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "rewardCollateral", "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_reward", + "name": "_amount", "type": "uint256" } ], - "name": "notifyRewardAmount", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "owner", @@ -30955,6 +33437,13 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "paused", @@ -30970,7 +33459,7 @@ }, { "inputs": [], - "name": "periodFinish", + "name": "ratio", "outputs": [ { "internalType": "uint256", @@ -31000,8 +33489,14 @@ "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -31009,17 +33504,19 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "renounceRole", + "name": "removeCollateralETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -31037,31 +33534,24 @@ "type": "address" } ], - "name": "revokeRole", + "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "rewardPerToken", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerTokenStored", + "name": "requiredCollateral", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "collateral", "type": "uint256" } ], @@ -31069,12 +33559,18 @@ "type": "function" }, { - "inputs": [], - "name": "rewardRate", + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], @@ -31083,58 +33579,70 @@ }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "name": "rewards", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardHandler", "outputs": [ { - "internalType": "uint256", + "internalType": "contract IRewardHandler", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "rewardsDuration", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "rewardsToken", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "stateMutability": "view", + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_rewardsDuration", + "name": "_ratio", "type": "uint256" } ], - "name": "setRewardsDuration", + "name": "setRatio", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -31143,28 +33651,42 @@ "inputs": [ { "internalType": "address", - "name": "_staker", + "name": "_treasury", "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" } ], - "name": "stake", + "name": "setTreasury", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, { "inputs": [], - "name": "totalSupply", + "name": "tcapOracle", "outputs": [ { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -31184,59 +33706,86 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "treasury", + "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], - "name": "userRewardPerTokenPaid", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "vault", - "outputs": [ + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" }, { "internalType": "uint256", - "name": "_amount", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" } ] }, - "WETHVaultHandler": { - "address": "0x093f8F7C7fCC6edf991309A5056feB5cA9579292", + "HardWETHVaultHandler": { + "address": "0x5Da610f142f6762AB7f64aa305c39563a1cF336e", "abi": [ { "inputs": [ @@ -31290,11 +33839,6 @@ "name": "_ethOracle", "type": "address" }, - { - "internalType": "address", - "name": "_rewardHandler", - "type": "address" - }, { "internalType": "address", "name": "_treasury", @@ -31392,6 +33936,25 @@ "name": "NewLiquidationPenalty", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "NewMinimumTCAP", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -31695,6 +34258,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "MAX_FEE", @@ -31806,6 +34382,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "collateralPriceOracle", @@ -32097,6 +34686,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "minimumTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -32295,27 +34897,27 @@ "type": "function" }, { - "inputs": [], - "name": "rewardHandler", - "outputs": [ + "inputs": [ { - "internalType": "contract IRewardHandler", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" } ], - "stateMutability": "view", + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_burnFee", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "setBurnFee", + "name": "setLiquidationPenalty", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -32324,11 +34926,11 @@ "inputs": [ { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "_minimumTCAP", "type": "uint256" } ], - "name": "setLiquidationPenalty", + "name": "setMinimumTCAP", "outputs": [], "stateMutability": "nonpayable", "type": "function" diff --git a/src/hooks/useHardVaults.tsx b/src/hooks/useHardVaults.tsx new file mode 100644 index 0000000..18156c3 --- /dev/null +++ b/src/hooks/useHardVaults.tsx @@ -0,0 +1,22 @@ +import React, { useState } from "react"; +import { ethers } from "ethers"; +import { Contract } from "ethers-multicall"; +import { HardVaultsContext } from "../state/HardVaultsContext"; + +export const useHardVaults = (): HardVaultsContext => { + const [wethVault, setWETHVault] = useState(); + const [wethVaultRead, setWETHVaultRead] = useState(); + const setCurrentWETHVault = React.useCallback((currentWETHVault: ethers.Contract): void => { + setWETHVault(currentWETHVault); + }, []); + const setCurrentWETHVaultRead = React.useCallback((currentWETHVaultRead: Contract): void => { + setWETHVaultRead(currentWETHVaultRead); + }, []); + + return { + wethVault, + setCurrentWETHVault, + wethVaultRead, + setCurrentWETHVaultRead, + }; +}; diff --git a/src/hooks/useVaults.tsx b/src/hooks/useVaults.tsx index 61e0719..ffd4237 100644 --- a/src/hooks/useVaults.tsx +++ b/src/hooks/useVaults.tsx @@ -42,7 +42,6 @@ export const useVaults = (): VaultsContext => { const setCurrentUNIVault = React.useCallback((currentUNIVault: ethers.Contract): void => { setUNIVault(currentUNIVault); }, []); - const setCurrentMaticVault = React.useCallback((currentMaticVault: ethers.Contract): void => { setMaticVault(currentMaticVault); }, []); diff --git a/src/state/HardVaultsContext.tsx b/src/state/HardVaultsContext.tsx new file mode 100644 index 0000000..a235b44 --- /dev/null +++ b/src/state/HardVaultsContext.tsx @@ -0,0 +1,19 @@ +import React from "react"; +import { ethers } from "ethers"; +import { Contract } from "ethers-multicall"; + +export interface HardVaultsContext { + wethVault?: ethers.Contract; + setCurrentWETHVault: (currentVault: ethers.Contract) => void; + wethVaultRead?: Contract; + setCurrentWETHVaultRead: (currentVaultRead: Contract) => void; +} + +export const HARD_VAULTS_DEFAULT_VALUE = { + setCurrentWETHVault: () => {}, + setCurrentWETHVaultRead: () => {}, +}; + +const hardVaultsContext = React.createContext(HARD_VAULTS_DEFAULT_VALUE); + +export default hardVaultsContext; diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 03abaff..28635a0 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -71,18 +71,17 @@ } } .btn-group { - border: 1px solid #dfd1ea; - border-radius: 5px; - margin-bottom: 0rem !important; - - .btn-secondary { - margin-bottom: 0rem; - font-size: 0.8rem; - background-color: #281e31; - } - .btn-secondary.active { - background-color: $neon-highlight; - } + border: 1px solid #dfd1ea; + border-radius: 5px; + margin-bottom: 0rem !important; + .btn-secondary { + margin-bottom: 0rem; + font-size: 0.8rem; + background-color: #281e31; + } + .btn-secondary.active { + background-color: $neon-highlight; + } } .filters { display: flex; diff --git a/src/styles/vault.scss b/src/styles/vault.scss index 3be356f..f759333 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -12,12 +12,12 @@ // Large devices (desktops, 992px and up) @media (min-width: 992px) { - padding: 1rem 1.5rem; + padding: 3rem 1.5rem; } // Large devices (small laptos) @media (min-width: 1300px) { - padding: 1rem 3rem; + padding: 3rem 3rem; } .loading-container { @@ -25,8 +25,10 @@ } .icon-container { - margin-top: 1.5rem; - + display: flex; + flex-direction: row; + margin-top: 3rem; + margin-bottom: 2rem; svg { margin-top: 7px; vertical-align: top; @@ -54,12 +56,152 @@ } } - .select-container { - display: inline-block; - margin-left: 1rem; + .btn-group { + width: fit-content; + border: 1px solid #dfd1ea; + border-radius: 5px; + margin-bottom: 0rem !important; + input[type="radio"] { + display: none; + } + .btn-secondary { + margin-bottom: 0rem; + font-size: 0.8rem; + background-color: #281e31; + } + .btn-secondary.active { + background-color: $neon-highlight; + } + } + } - p { - margin-left: -2rem; + .dd-collateral { + display: flex; + align-items: center; + h6 { + color: $white; + margin: 0px; + } + .balance-container { + display: flex; + align-items: center; + margin: 0rem 1rem; + color: $light; + .number { + margin-bottom: 0rem; + color: $light; + } + } + .dropdown { + padding-left: 0.5rem; + .btn { + margin-top: 0rem; + } + .dropdown-toggle { + display: flex; + height: 2.1rem; + width: 150px; + background-color: #281e31; + border: 1px solid #dfd1ea; + border-radius: 5px; + + div { + display: flex; + align-items: center; + flex: 1; + } + span { + font-size: 0.8rem; + } + svg { + height: 20px; + margin-right: 5px; + } + } + .dropdown-toggle::after { + position: absolute; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.4em solid; + border-right: 0.4em solid transparent; + border-bottom: 0; + border-left: 0.4em solid transparent; + margin-top: 7px; + margin-left: 65%; + } + .dropdown-menu { + width: 85%; + margin-top: 3px !important; + margin-right: 1rem; + background-color: #211828; + + .dropdown-item { + color: $white; + } + .dropdown-item.active { + background-color: rgba(121, 64, 242, 0.4); + } + .dropdown-item:hover { + background-color: rgba(121, 64, 242, 0.3); + } + } + } + } + + .collateral-balance { + display: flex; + align-items: center; + h4 { + margin-bottom: 0rem; + } + .number { + color: $light; + font-size: 1.1rem; + } + .amount { + display: flex; + align-items: center; + .number { + color: $white; + } + } + svg.small { + vertical-align: top; + width: 0.7rem; + filter: brightness(1118%) drop-shadow(0px 0px 5px $highlight); + @supports (-webkit-touch-callout: none) { + height: intrinsic; + } + + &.btc.small { + margin-top: 0px; + width: 1.5rem; + } + &.dai.small { + margin-top: 0px; + width: 1.2rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.aave.small { + margin-top: 2px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.link.small { + margin-top: 7px; + width: 1.4rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.uni.small { + margin-top: -5px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.snx.small { + margin-top: -3px; + width: 1.3rem; + filter: drop-shadow(0px 0px 5px $highlight); } } } @@ -107,43 +249,56 @@ margin-bottom: 2.25rem; } - .pre-actions { + .pre-actions { p { width: 30rem; } - .btn { width: 13.4375rem; height: 3.875rem; border-radius: 1px; margin-top: 2rem; } + .card { + width: 35rem; + padding: 1rem 0.5rem; + } + .card-header { + display: flex; + justify-content: space-between; + padding-bottom: 1.5rem; + } } .actions-container { margin-top: 1rem; column-gap: 2rem; - p { width: 100%; } - .card { padding: 2rem; } + .card-header { + padding: 0rem; + padding-bottom: 1.5rem; + } + .card-body { + padding: 0rem; + } .info { display: flex; align-items: top; - div { width: 100%; } - p { text-align: right; } - + .collateral-balance { + flex-direction: column; + } .amount { display: flex; flex-direction: row; @@ -323,33 +478,26 @@ } svg.small { - @supports not (-webkit-touch-callout: none) { - margin-top: -5px; - } vertical-align: top; + margin-top: -5px; width: 0.8rem; - filter: brightness(1118%) drop-shadow(0px 0px 5px $highlight); - @supports (-webkit-touch-callout: none) { - height: intrinsic; - } - &.btc.small { margin-top: -5px; width: 1.8rem; } &.dai.small { - margin-top: -5px; - width: 1.5rem; + margin-top: 0px; + width: 1.2rem; filter: drop-shadow(0px 0px 5px $highlight); } &.aave.small { - margin-top: 2px; + margin-top: -5px; width: 1.7rem; filter: drop-shadow(0px 0px 5px $highlight); } &.link.small { - margin-top: -3px; + margin-top: 0px; width: 1.7rem; filter: drop-shadow(0px 0px 5px $highlight); } @@ -371,6 +519,7 @@ min-height: 26rem; } } + .token-icon-container { display: flex; flex-direction: row; @@ -407,7 +556,7 @@ margin-bottom: 0rem; } .balance { - row-gap: 2rem; + row-gap: 1.5rem; } .card { From cbde05e178cb859886698558ffc1a9a62fea257c Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 11 Apr 2022 22:09:40 -0600 Subject: [PATCH 084/278] adding tick values to univ3 pools --- src/components/Farm/UniV3Rewards/Rewards.tsx | 75 ++++++++++++++----- src/components/Farm/UniV3Rewards/types.tsx | 4 + src/components/Farm/index.tsx | 23 ++---- src/components/Vault/Details.tsx | 9 ++- src/components/Vault/Monitoring/Liquidate.tsx | 9 ++- src/components/Vault/Monitoring/Vaults.tsx | 2 +- src/components/Vault/Monitoring/common.tsx | 15 ---- src/components/Vault/Monitoring/index.tsx | 4 +- src/styles/farm.scss | 9 +++ src/styles/vault.scss | 29 +++++++ src/utils/univ3.tsx | 2 + src/utils/utils.tsx | 15 ++++ 12 files changed, 140 insertions(+), 56 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index df561ee..6b115d6 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -12,12 +12,13 @@ import { useQuery, gql } from "@apollo/client"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; import { ReactComponent as CtxIcon } from "../../../assets/images/ctx-coin.svg"; import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; +import { ReactComponent as UNIIconSmall } from "../../../assets/images/vault/uni.svg"; import NetworkContext from "../../../state/NetworkContext"; import { SignerContext } from "../../../state/SignerContext"; import TokensContext from "../../../state/TokensContext"; import { NETWORKS } from "../../../utils/constants"; import { UNIV3, computeIncentiveId } from "../../../utils/univ3"; -import { capitalize } from "../../../utils/utils"; +import { capitalize, errorNotification, notifyUser, numberFormatStr } from "../../../utils/utils"; import { IncentiveType, PositionType, StakeStatus } from "./types"; import ClaimReward from "./ClaimReward"; import Stake from "./Stake"; @@ -44,7 +45,11 @@ const positionDefault = { poolId: "", liquidity: "0.00", tickLower: 0, + tickLowerPrice0: 1, + tickLowerPrice1: 1, tickUpper: 0, + tickUpperPrice0: 1, + tickUpperPrice1: 1, incetiveId: "", reward: 0, status: StakeStatus.empty, @@ -70,8 +75,16 @@ const Rewards = ({ positions(orderBy: id, where: { owner: $owner }) { id poolAddress - tickLower - tickUpper + tickLower { + tickIdx + price0 + price1 + } + tickUpper { + tickIdx + price0 + price1 + } liquidity } } @@ -95,8 +108,12 @@ const Rewards = ({ const incentiveId = computeIncentiveId(ethTcapPool.incentives[0]); position.lpTokenId = p.id; position.poolId = p.poolAddress; - position.tickLower = p.tickLower; - position.tickUpper = p.tickUpper; + position.tickLower = parseInt(p.tickLower.tickIdx); + position.tickLowerPrice0 = p.tickLower.price0; + position.tickLowerPrice1 = p.tickLower.price1; + position.tickUpper = parseInt(p.tickUpper.tickIdx); + position.tickUpperPrice0 = p.tickUpper.price0; + position.tickUpperPrice1 = p.tickUpper.price1; position.incetiveId = incentiveId; position.liquidity = ethers.utils.formatEther(p.liquidity); @@ -165,12 +182,27 @@ const Rewards = ({ const lpUrl = () => { const tcapAddress = tokens.tcapToken?.address; + let { feeTier } = UNIV3.mainnet.tcapPool; let wethAddress = tokens.wethToken?.address; if (currentNetwork.chainId === NETWORKS.rinkeby.chainId) { + feeTier = UNIV3.rinkeby.tcapPool.feeTier; wethAddress = "0xc778417E063141139Fce010982780140Aa0cD5Ab"; } - return `https://app.uniswap.org/#/add/${wethAddress}/${tcapAddress}?chain=${currentNetwork.name}`; + return `https://app.uniswap.org/#/add/${wethAddress}/${tcapAddress}/${feeTier}?chain=${currentNetwork.name}`; + }; + + const withdraw = async (lpTokenId: number) => { + if (stakerContract) { + try { + const tx = await stakerContract.withdrawToken(lpTokenId, ownerAddress, "0x"); + notifyUser(tx, refresh); + refresh(); + } catch (error) { + errorNotification("Transaction Rejected"); + console.log(error); + } + } }; const ClaimButton = () => { @@ -199,7 +231,12 @@ const Rewards = ({ } return ( - ); @@ -236,7 +273,7 @@ const Rewards = ({ Description - Balance + Range (TCAP per WETH) Status - WETH/TCAP Pool
Uniswap + TCAP/WETH Pool
Uniswap
- - {" "} + +
+ Min: {numberFormatStr(position.tickUpperPrice1.toString(), 4, 4)} +
+
+ Max: {numberFormatStr(position.tickLowerPrice1.toString(), 4, 4)} +
@@ -352,7 +387,9 @@ const Rewards = ({
diff --git a/src/components/Farm/UniV3Rewards/types.tsx b/src/components/Farm/UniV3Rewards/types.tsx index 5995e3d..2707946 100644 --- a/src/components/Farm/UniV3Rewards/types.tsx +++ b/src/components/Farm/UniV3Rewards/types.tsx @@ -18,7 +18,11 @@ export type PositionType = { poolId: string; liquidity: string; tickLower: number; + tickLowerPrice0: number; + tickLowerPrice1: number; tickUpper: number; + tickUpperPrice0: number; + tickUpperPrice1: number; incetiveId: string; reward: number; status: string; diff --git a/src/components/Farm/index.tsx b/src/components/Farm/index.tsx index fc4c4f6..b727407 100644 --- a/src/components/Farm/index.tsx +++ b/src/components/Farm/index.tsx @@ -14,7 +14,6 @@ import NetworkContext from "../../state/NetworkContext"; import OraclesContext from "../../state/OraclesContext"; import GovernanceContext from "../../state/GovernanceContext"; import RewardsContext from "../../state/RewardsContext"; -import MintingRewards from "./MintingRewards/index"; import UniV3Rewards from "./UniV3Rewards/index"; import "../../styles/farm.scss"; import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; @@ -36,8 +35,8 @@ const Farm = () => { const { t } = useTranslation(); const [address, setAddress] = useState(""); const [isLoading, setIsLoading] = useState(true); - const [ethRewards, setEthRewards] = useState("0"); - const [daiRewards, setDaiRewards] = useState("0"); + /* const [ethRewards, setEthRewards] = useState("0"); + const [daiRewards, setDaiRewards] = useState("0"); */ const [ethPoolRewards, setEthPoolRewards] = useState("0.0"); const [ctxPoolRewards, setCtxPoolRewards] = useState("0.0"); const [vethPoolRewards, setVEthPoolRewards] = useState("0.0"); @@ -245,8 +244,8 @@ const Farm = () => { const currentAddress = await signer.signer.getAddress(); setAddress(currentAddress); - const currentEthRewardCall = await rewards?.wethRewardRead?.earned(currentAddress); - const currentDaiRewardCall = await rewards?.daiRewardRead?.earned(currentAddress); + /* const currentEthRewardCall = await rewards?.wethRewardRead?.earned(currentAddress); + const currentDaiRewardCall = await rewards?.daiRewardRead?.earned(currentAddress); */ const currentEthPoolRewardCall = await rewards.wethPoolRewardRead?.earned(currentAddress); const currentVEthPoolRewardCall = await rewards.wethPoolRewardRead?.vestingAmounts( currentAddress @@ -270,8 +269,6 @@ const Farm = () => { // @ts-ignore const [ - currentEthReward, - currentDaiReward, currentEthPoolReward, currentVEthPoolReward, currentEthPoolStake, @@ -281,8 +278,6 @@ const Farm = () => { currentCtxPoolStake, currentCtxPoolBalance, ] = await signer.ethcallProvider?.all([ - currentEthRewardCall, - currentDaiRewardCall, currentEthPoolRewardCall, currentVEthPoolRewardCall, currentEthPoolStakeCall, @@ -293,8 +288,8 @@ const Farm = () => { currentCtxPoolBalanceCall, ]); - setEthRewards(ethers.utils.formatEther(currentEthReward)); - setDaiRewards(ethers.utils.formatEther(currentDaiReward)); + /* setEthRewards(ethers.utils.formatEther(currentEthReward)); + setDaiRewards(ethers.utils.formatEther(currentDaiReward)); */ setEthVestAmount(currentVEthPoolReward); setCtxVestAmount(currentVCtxPoolReward); @@ -792,12 +787,6 @@ const Farm = () => {
)} -
diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index 1ba6b48..aedf440 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -61,6 +61,7 @@ const Details = ({ address, t }: props) => { const hardVaults = useContext(HardVaultsContext); const signer = useContext(SignerContext); const [vaultMode, setVaultMode] = useState("normal"); + const [loadingMode, setLoadingMode] = useState(false); const radios = [ { name: "Regular Mode", value: "normal" }, { name: "Hard Mode", value: "hard" }, @@ -519,6 +520,7 @@ const Details = ({ address, t }: props) => { setSelectedVault("MATIC"); } loadVault(vaultType, data); + setLoadingMode(false); }, }); @@ -548,6 +550,7 @@ const Details = ({ address, t }: props) => { }; const handleRadioBtnChange = (value: string) => { + setLoadingMode(true); setVaultMode(value); refresh(); }; @@ -991,7 +994,7 @@ const Details = ({ address, t }: props) => { // eslint-disable-next-line }, [address, data]); - if (isLoading) { + if (isLoading || loadingMode) { return (
@@ -1110,6 +1113,10 @@ const Details = ({ address, t }: props) => {
); + /* if (loadingMode) { + return ; + } */ + return ( <>
diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index 2e190bb..ceb2715 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -11,8 +11,13 @@ import SignerContext from "../../../state/SignerContext"; import OracleContext from "../../../state/OraclesContext"; import TokensContext from "../../../state/TokensContext"; import VaultContext from "../../../state/VaultsContext"; -import { errorNotification, isPolygon, notifyUser, toUSD } from "../../../utils/utils"; -import { numberFormatStr } from "./common"; +import { + errorNotification, + isPolygon, + notifyUser, + numberFormatStr, + toUSD, +} from "../../../utils/utils"; type props = { show: boolean; diff --git a/src/components/Vault/Monitoring/Vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx index bbfeb9a..e3516ef 100644 --- a/src/components/Vault/Monitoring/Vaults.tsx +++ b/src/components/Vault/Monitoring/Vaults.tsx @@ -9,10 +9,10 @@ import { ReactComponent as SortUpIcon } from "../../../assets/images/sort-up.svg import { ReactComponent as SortDownIcon } from "../../../assets/images/sort-down.svg"; import Liquidate from "./Liquidate"; import { PaginationType, VaultsType } from "./types"; +import { numberFormatStr } from "../../../utils/utils"; import { capitalize, CollateralIcon, - numberFormatStr, sortCollateralDesc, sortCollateralAsc, sortCollateralUsdDesc, diff --git a/src/components/Vault/Monitoring/common.tsx b/src/components/Vault/Monitoring/common.tsx index 2a7a721..673d3fc 100644 --- a/src/components/Vault/Monitoring/common.tsx +++ b/src/components/Vault/Monitoring/common.tsx @@ -47,21 +47,6 @@ export const CollateralIcon = ({ name }: iconProps) => { } }; -export const numberFormatStr = ( - value: string, - minDecimals: number | undefined, - maxDecimals: number | undefined -) => { - const numberFormat = new Intl.NumberFormat([], { - minimumFractionDigits: minDecimals, - maximumFractionDigits: maxDecimals, - }); - if (minDecimals) { - return numberFormat.format(parseFloat(parseFloat(value).toFixed(maxDecimals))); - } - return numberFormat.format(parseFloat(value)); -}; - export const sortCollateralAsc = (a: VaultsType, b: VaultsType) => parseFloat(a.collateralValue) - parseFloat(b.collateralValue); diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 64d2cea..a216026 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -20,6 +20,7 @@ import { isOptimism, isPolygon, isUndefined, + numberFormatStr, toUSD, validOracles, validVaults, @@ -34,7 +35,7 @@ import { VaultsType, VaultsTotalsType, } from "./types"; -import { capitalize, CollateralIcon, numberFormatStr, VAULT_STATUS } from "./common"; +import { capitalize, CollateralIcon, VAULT_STATUS } from "./common"; const pagDefault = { previous: 0, @@ -58,6 +59,7 @@ type liqVaultsTempType = { vaultId: string; vaultType: string; }; + const showAllVaults = true; export const Monitoring = () => { diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 1c22356..aa65be7 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -190,6 +190,7 @@ small { color: white; + filter: drop-shadow(0 0 5px #a440f2); } &.pool { @@ -396,8 +397,13 @@ padding: 5px; } .description { + margin-left: 10px; padding: 5px; } + .uni { + margin-left: -10px; + filter: drop-shadow(0 0 5px #a440f2); + } .btn-box { width: 100%; } @@ -416,6 +422,9 @@ .btn:hover { color: $white; } + .small { + margin-left: -10px; + } } } } diff --git a/src/styles/vault.scss b/src/styles/vault.scss index f759333..2b7de2d 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -5,6 +5,35 @@ padding-bottom: 0px; margin-bottom: 3rem; + .lightning{ + position: fixed; + height: 100%; + width: 100%; + z-index: 1; + + -webkit-animation: flash ease-out 7s infinite; + -moz-animation: flash ease-out 7s infinite; + animation: flash ease-out 7s infinite; + animation-delay: 2s; + @-webkit-keyframes flash { + from { opacity: 0; } + 92% { opacity: 0; } + 93% { opacity: 0.6; } + 94% { opacity: 0.2; } + 96% { opacity: 0.9; } + to { opacity: 0; } + } + + @keyframes flash { + from { opacity: 0; } + 92% { opacity: 0; } + 93% { opacity: 0.6; } + 94% { opacity: 0.2; } + 96% { opacity: 1; } + to { opacity: 0; } + } + /*End! is that simple! */ + } // Small devices (landscape phones, 576px and up) @media (min-width: 576px) { padding: 1rem 3rem; diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx index 9b76c70..8ac6fa8 100644 --- a/src/utils/univ3.tsx +++ b/src/utils/univ3.tsx @@ -6,6 +6,7 @@ export const UNIV3 = { mainnet: { tcapPool: { id: "0xfb7BDD5B703f57BC7807b9D731503050EdC8c722", + feeTier: 3000, incentives: [ { rewardToken: "0xAa715DbD2ED909B7B7727dC864F3B78276D14A19", @@ -20,6 +21,7 @@ export const UNIV3 = { rinkeby: { tcapPool: { id: "0xfb7BDD5B703f57BC7807b9D731503050EdC8c722", + feeTier: 3000, incentives: [ { rewardToken: "0xAa715DbD2ED909B7B7727dC864F3B78276D14A19", diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index f4bf598..8e486f9 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -383,3 +383,18 @@ export const validVaults = (chainId: number, vaults: VaultsContext): boolean => } return valid; }; + +export const numberFormatStr = ( + value: string, + minDecimals: number | undefined, + maxDecimals: number | undefined +) => { + const numberFormat = new Intl.NumberFormat([], { + minimumFractionDigits: minDecimals, + maximumFractionDigits: maxDecimals, + }); + if (minDecimals) { + return numberFormat.format(parseFloat(parseFloat(value).toFixed(maxDecimals))); + } + return numberFormat.format(parseFloat(value)); +}; From 2111fd15b7fcd6731316ac918167e680eee65fef Mon Sep 17 00:00:00 2001 From: Voith Date: Tue, 12 Apr 2022 22:49:22 +0530 Subject: [PATCH 085/278] Update SSS reward amount and formula --- src/components/Governance/StakerStats.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 6b77641..fdb9da8 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -7,7 +7,7 @@ import GovernanceContext from "../../state/GovernanceContext"; import SignerContext from "../../state/SignerContext"; import { errorNotification, notifyUser } from "../../utils/utils"; -const sixMonthCtxRewardAmount = 60000; +const sixMonthCtxRewardAmount = 12654; const apyShowDate = new Date(1633654800 * 1000); type props = { refresh: () => void; @@ -80,7 +80,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes }: props) const apy = (): string => { const currentDate = new Date(); if (parseFloat(totalStaked) > 0 && currentDate > apyShowDate) { - const a = Math.round(((2 * sixMonthCtxRewardAmount) / parseFloat(totalStaked)) * 100); + const a = Math.round(((4 * sixMonthCtxRewardAmount) / parseFloat(totalStaked)) * 100); return a .toString() .replace(/\B(?=(\d{3})+(?!\d))/g, ",") From 3d69df72a6a1d545c907fffadb2448b09c7d2b8b Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 12 Apr 2022 11:33:33 -0600 Subject: [PATCH 086/278] change apy formula on sss rewards --- src/components/Governance/StakerStats.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index a6546cf..7d3a820 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -7,7 +7,7 @@ import GovernanceContext from "../../state/GovernanceContext"; import SignerContext from "../../state/SignerContext"; import { errorNotification, notifyUser } from "../../utils/utils"; -const sixMonthCtxRewardAmount = 60000; +const sixMonthCtxRewardAmount = 12654; const apyShowDate = new Date(1633654800 * 1000); type props = { refresh: () => void; From bb3e9dd1710ed60fc053ba8beceb86e817dfdc53 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 12 Apr 2022 11:46:44 -0600 Subject: [PATCH 087/278] testing --- src/components/Governance/StakerStats.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 7c38dbb..aa1c0e6 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -86,7 +86,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes }: props) const apy = (): string => { const currentDate = new Date(); if (parseFloat(totalStaked) > 0 && currentDate > apyShowDate) { - const a = Math.round(((2 * sixMonthCtxRewardAmount) / parseFloat(totalStaked)) * 100); + const a = Math.round(((4 * sixMonthCtxRewardAmount) / parseFloat(totalStaked)) * 100); return a .toString() .replace(/\B(?=(\d{3})+(?!\d))/g, ",") From 672c02fa6bd9c383d7a26a510682179e1e8cfd98 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 13 Apr 2022 00:03:06 -0600 Subject: [PATCH 088/278] updating univ3 position description --- src/components/Farm/UniV3Rewards/Rewards.tsx | 110 ++- src/components/Farm/UniV3Rewards/index.tsx | 5 + src/components/Farm/UniV3Rewards/types.tsx | 18 + src/contracts/UniV3Pool.json | 988 +++++++++++++++++++ src/styles/app.scss | 5 +- src/styles/farm.scss | 45 +- src/styles/tower.scss | 88 ++ src/utils/utils.tsx | 16 +- 8 files changed, 1235 insertions(+), 40 deletions(-) create mode 100644 src/contracts/UniV3Pool.json create mode 100644 src/styles/tower.scss diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 6b115d6..ed9718e 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -9,6 +9,7 @@ import { BigNumber, ethers } from "ethers"; import NumberFormat from "react-number-format"; import { Contract } from "ethers-multicall"; import { useQuery, gql } from "@apollo/client"; +import { FaArrowsAltH } from "react-icons/fa"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; import { ReactComponent as CtxIcon } from "../../../assets/images/ctx-coin.svg"; import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; @@ -18,8 +19,14 @@ import { SignerContext } from "../../../state/SignerContext"; import TokensContext from "../../../state/TokensContext"; import { NETWORKS } from "../../../utils/constants"; import { UNIV3, computeIncentiveId } from "../../../utils/univ3"; -import { capitalize, errorNotification, notifyUser, numberFormatStr } from "../../../utils/utils"; -import { IncentiveType, PositionType, StakeStatus } from "./types"; +import { + capitalize, + calculateCumulativePrice, + errorNotification, + notifyUser, + numberFormatStr, +} from "../../../utils/utils"; +import { IncentiveType, PositionType, positionDefaultValues, StakeStatus } from "./types"; import ClaimReward from "./ClaimReward"; import Stake from "./Stake"; @@ -30,6 +37,7 @@ type props = { stakerContractRead: Contract | undefined; nfpmContract: ethers.Contract | undefined; nfpmContractRead: Contract | undefined; + poolContractRead: Contract | undefined; }; type btnProps = { @@ -40,21 +48,6 @@ type infoMsgProps = { message: string; }; -const positionDefault = { - lpTokenId: 0, - poolId: "", - liquidity: "0.00", - tickLower: 0, - tickLowerPrice0: 1, - tickLowerPrice1: 1, - tickUpper: 0, - tickUpperPrice0: 1, - tickUpperPrice1: 1, - incetiveId: "", - reward: 0, - status: StakeStatus.empty, -}; - const Rewards = ({ ownerAddress, signer, @@ -62,17 +55,19 @@ const Rewards = ({ stakerContractRead, nfpmContract, nfpmContractRead, + poolContractRead, }: props) => { const tokens = useContext(TokensContext); const currentNetwork = useContext(NetworkContext); const [ethTcapIncentive, setEthTcapIncentive] = useState>([]); const [ethTcapPositions, setEthTcapPositions] = useState>([]); + const [cumulativePrice, setCumulativePrice] = useState(0); const [availableReward, setAvailableReward] = useState(0); const [showClaim, setShowClaim] = useState(false); const OWNER_POSITIONS = gql` query ownerPools($owner: String!) { - positions(orderBy: id, where: { owner: $owner }) { + positions(orderBy: id, where: { owner: $owner, liquidity_gt: 0 }) { id poolAddress tickLower { @@ -102,9 +97,20 @@ const Rewards = ({ } setEthTcapIncentive(ethTcapPool.incentives); const ethPositions = new Array(); + + // Read pool price + const poolObserveCall = await poolContractRead?.observe([0, 10]); + // @ts-ignore + const [observations] = await signer.ethcallProvider?.all([poolObserveCall]); + const tickCumulative0 = observations.tickCumulatives[0]; + const tickCumulative1 = observations.tickCumulatives[1]; + + const currentCumPrice = calculateCumulativePrice(tickCumulative0, tickCumulative1, 10); + setCumulativePrice(currentCumPrice); + positionsData.positions.forEach(async (p: any) => { if (p.poolAddress === ethTcapPool.id.toLowerCase()) { - const position = { ...positionDefault }; + const position = { ...positionDefaultValues }; const incentiveId = computeIncentiveId(ethTcapPool.incentives[0]); position.lpTokenId = p.id; position.poolId = p.poolAddress; @@ -152,6 +158,12 @@ const Rewards = ({ } else if (nfpAddress.toLowerCase() !== UNIV3.stakerAddress.toLowerCase()) { position.status = StakeStatus.not_approved; } + + // Check if it is in range + position.priceInRange = + currentCumPrice >= position.tickUpperPrice1 && + currentCumPrice <= position.tickLowerPrice1; + ethPositions.push(position); setEthTcapPositions([...ethPositions]); } @@ -272,8 +284,26 @@ const Rewards = ({ - + - @@ -432,11 +437,6 @@ const Rewards = ({ />{" "} CTX - + +
+ <>{t("vaults")} +
+ {vaultsTotals.vaults} + + +
+ <>{t("collateral")} (USD) +
+ + ${numberFormatStr(vaultsTotals.collateralUSD, 2, 2)} + + + +
+
+ <>{t("debt")} +
+ +
+ {numberFormatStr(vaultsTotals.debt, 4, 4)} + + +
+ <>{t("debt")} (USD) +
+ ${numberFormatStr(vaultsTotals.debtUSD, 2, 2)} + + + + + + + +
+
+
+ <>{t("view")}: +
+ handleItemsViewChange(eventKey || "15")}> + +
+ {pagination.itemsPerPage} +
+
+ + {viewsList.map((item) => ( + + {item.name} + + ))} + +
+
+
+
+
+
+ <>{t("collateral")}: +
+ handleTokenChange(eventKey || "ALL")} + > + +
+ + {tokenSymbol.toUpperCase()} +
+
+ + {tokensSymbols().map((item) => ( + + {item.name} + + ))} + +
+
+
+
Status
+ handleStatusChange(eventKey || "ALL")}> + +
+ {capitalize(currentStatus)} +
+
+ + {statusList.map((item) => ( + + {item.name} + + ))} + +
+
+ {isInLayer1(currentNetwork.chainId) && ( +
+
+ <>{t("mode")}: +
+ handleModeChange(eventKey || "ALL")} + > + +
+ {capitalize(vaultMode)} +
+
+ + {modeList.map((item) => ( + + {item.name} + + ))} + +
+
+ )} + {currentStatus !== VAULT_STATUS.empty && currentStatus !== VAULT_STATUS.ready && ( +
+
Ratio Range
+ + +
+ + {currentMinRatio} {currentMaxRatio} + +
+
+ +
+ + + +
+ +
+
+
+ )} + {currentAddress !== "" && ( +
+ handleRadioBtnChange(val)} + name="vaults-options" + > + {radios.map((radio, idx) => ( + + {radio.name} + + ))} + +
+ )} +
+ + {loading || filteringRatios ? ( + + ) : ( + ) => setVaultList(v)} + currentStatus={currentStatus} + pagination={pagination} + refresh={updateLiquidatedVault} + setVaultToUpdate={setVaultToUpdate} + myVaults={radioValue === "2"} + /> + )} + + {pagination.pages > 0 && !loading && ( + + )} + + + + + + + ); +}; + +export default Monitoring; diff --git a/src/components/Vaults/vault/Vault2.tsx b/src/components/Vaults/vault/Vault2.tsx new file mode 100644 index 0000000..c9e315f --- /dev/null +++ b/src/components/Vaults/vault/Vault2.tsx @@ -0,0 +1,202 @@ +import React, { useContext, useState, useEffect } from "react"; +import { ethers, BigNumber } from "ethers"; +import { + Button, + ButtonGroup, + Dropdown, + Form, + InputGroup, + OverlayTrigger, + ToggleButton, + Tooltip, +} from "react-bootstrap/esm"; +import { FaArrowLeft } from "react-icons/fa"; +import NumberFormat from "react-number-format"; +import { useTranslation } from "react-i18next"; +import "../../../styles/mint2.scss"; +import VaultForm from "./VaultForm"; +import { useVault } from "../../../hooks"; +import { networkContext, signerContext } from "../../../state"; +import { TokenIcon } from "../common"; +import { NETWORKS } from "../../../utils/constants"; +import { + errorNotification, + getDefaultProvider, + getRatio, + getSafeRemoveCollateral, + getSafeMint, + isInLayer1, + isOptimism, + isPolygon, + notifyUser, + toUSD, + isArbitrum, +} from "../../../utils/utils"; + +type VaultInitType = { + vaultId: string; + assetSymbol: string; + collateralSymbol: string; + isHardVault: boolean; +}; + +type props = { + currentAddress: string; + vaultInitData: VaultInitType; + goBack: () => void; +}; + +const Vault2 = ({ currentAddress, vaultInitData, goBack }: props) => { + const { t } = useTranslation(); + const currentNetwork = useContext(networkContext); + const [vaultMode, setVaultMode] = useState( + isInLayer1(currentNetwork.chainId) ? "hard" : "normal" + ); + const [vaultData, setVaultData] = useState(vaultInitData); + const [loadingMode, setLoadingMode] = useState(false); + const radios = [ + { name: "Regular", value: "normal" }, + { name: "Hard", value: "hard" }, + ]; + + // Vault Data + const [assetOptions, setAssetOptions] = useState>([]); + const [collateralOptions, setCollateralOptions] = useState>([]); + + // Inputss + const isHardMode = () => vaultMode === "hard"; + + useEffect( + () => { + const load = async () => { + if (currentAddress !== "") { + let aOptions = ["TCAP"]; + if (isArbitrum(currentNetwork.chainId)) { + aOptions = ["JPEGz"]; + } + + let cOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; + if (isHardMode()) { + cOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; + } + if (isOptimism(currentNetwork.chainId) && !isHardMode()) { + cOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; + } + if (isPolygon(currentNetwork.chainId) && !isHardMode()) { + cOptions = ["MATIC", "DAI", "WBTC"]; + } + + setAssetOptions(aOptions); + setCollateralOptions(cOptions); + } + }; + load(); + }, + // eslint-disable-next-line + [currentAddress, vaultInitData] + ); + + const handleRadioBtnChange = async (value: string) => { + setLoadingMode(true); + setVaultMode(value); + }; + + const handleTokenChange = async (value: string) => { + console.log(" bb ", value); + setVaultData({ + vaultId: "0", + assetSymbol: vaultData.assetSymbol, + collateralSymbol: value, + isHardVault: vaultData.isHardVault, + }); + }; + + const AssetDropdown = () => ( +
+
Asset
+ + +
+ + TCAP +
+
+ + {assetOptions.map((item) => ( + + + {item} + + ))} + +
+
+ ); + + const CollateralDropdown = () => ( +
+
Collateral
+ handleTokenChange(eventKey || "ETH")}> + +
+ + {vaultData.collateralSymbol.toUpperCase()} +
+
+ + {collateralOptions.map((item) => ( + + + {item} + + ))} + +
+
+ ); + + return ( +
+
+
+
+ +
Vault
+
+
+ + {radios.map((radio, idx) => ( + handleRadioBtnChange(e.currentTarget.value)} + > + {radio.name} + + ))} + +
+
+
+
+
+ + +
+ +
+
+
+
+ ); +}; + +export default Vault2; diff --git a/src/components/Vaults/vault/VaultForm.tsx b/src/components/Vaults/vault/VaultForm.tsx new file mode 100644 index 0000000..e75f351 --- /dev/null +++ b/src/components/Vaults/vault/VaultForm.tsx @@ -0,0 +1,1159 @@ +import React, { useContext, useState, useEffect } from "react"; +import { ethers, BigNumber } from "ethers"; +import { Button, Dropdown, Form, InputGroup } from "react-bootstrap/esm"; +import NumberFormat from "react-number-format"; +import { useTranslation } from "react-i18next"; +import "../../../styles/mint2.scss"; +import { useVault } from "../../../hooks"; +import { networkContext, signerContext } from "../../../state"; +import { TokenIcon } from "../common"; +import { NETWORKS } from "../../../utils/constants"; +import { + errorNotification, + getDefaultProvider, + getRatio, + getSafeRemoveCollateral, + getSafeMint, + isInLayer1, + isOptimism, + isPolygon, + notifyUser, + toUSD, + isArbitrum, +} from "../../../utils/utils"; + +type VaultInitType = { + vaultId: string; + assetSymbol: string; + collateralSymbol: string; + isHardVault: boolean; +}; + +type props = { + currentAddress: string; + vaultData: VaultInitType; +}; + +const VaultForm = ({ currentAddress, vaultData }: props) => { + const { t } = useTranslation(); + const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); + const [vaultMode, setVaultMode] = useState( + isInLayer1(currentNetwork.chainId) ? "hard" : "normal" + ); + + const { + currentCollateral, + currentVault, + currentAssetRead, + currentCollateralRead, + currentVaultRead, + currentCollateralOracleRead, + currentAssetOracleRead, + } = useVault(vaultData.assetSymbol, vaultData.collateralSymbol, vaultData.isHardVault); + const [loadingMode, setLoadingMode] = useState(false); + const actions = ["add", "remove", "mint", "burn"]; + const radios = [ + { name: "Regular", value: "normal" }, + { name: "Hard", value: "hard" }, + ]; + + // Actions + const [title, setTitle] = useState(t("vault.create")); + const [text, setText] = useState(t("vault.create-text", { asset: vaultData.assetSymbol })); + const [isApproved, setIsApproved] = useState(false); + const [isLoading, setIsLoading] = useState(true); + const [btnDisabled, setBtnDisabled] = useState(false); + const [activeAction, setActiveAction] = useState(""); + + // Vault Data + const [assetOptions, setAssetOptions] = useState>([]); + const [collateralOptions, setCollateralOptions] = useState>([]); + const [vaultDebt, setVaultDebt] = useState("0"); + const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); + const [vaultCollateral, setVaultCollateral] = useState("0"); + const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); + const [vaultRatio, setVaultRatio] = useState("0"); + const [tempRatio, setTempRatio] = useState(""); + const [minRatio, setMinRatio] = useState("0"); + const [selectedVaultDecimals, setSelectedVaultDecimals] = useState(18); + + // General Data + const [assetBalance, setAssetBalance] = useState("0"); + const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); + const [tokenBalance, setTokenBalance] = useState("0"); + const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); + + // Inputs + const [addCollateralTxt, setAddCollateralTxt] = useState("0"); + const [addCollateralUSD, setAddCollateralUSD] = useState("0"); + const [removeCollateralTxt, setRemoveCollateralTxt] = useState("0"); + const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); + const [mintTxt, setMintTxt] = useState("0"); + const [mintUSD, setMintUSD] = useState("0"); + const [burnTxt, setBurnTxt] = useState("0"); + const [burnUSD, setBurnUSD] = useState("0"); + const [burnFee, setBurnFee] = useState("0"); + const [vaultStatus, setVaultStatus] = useState(""); + const isHardMode = () => vaultMode === "hard"; + // Infinite Approval + const approveValue = BigNumber.from("1157920892373161954235709850086879078532699"); + + async function loadVault() { + let balance; + const provider = getDefaultProvider( + currentNetwork.chainId || NETWORKS.mainnet.chainId, + currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.rinkeby.name + ); + + let currentVaultData: any; + if (vaultData.vaultId !== "0") { + // @ts-ignore + const vault = await currentVault.vaults(BigNumber.from(vaultData.vaultId)); + currentVaultData = { + vaultId: vaultData.vaultId, + collateral: vault.Collateral, + debt: vault.Debt, + }; + } else { + // @ts-ignore + const vaultID = await currentVault.userToVault(currentAddress); + // @ts-ignore + const cVault = await currentVault.vaults(vaultID); + currentVaultData = { + vaultId: vaultID, + collateral: cVault.Collateral, + debt: cVault.Debt, + }; + console.log("-- aa --", vaultID.toString()); + } + + if (vaultData.collateralSymbol !== "ETH") { + // @ts-ignore + balance = await currentCollateral.balanceOf(currentAddress); + } else { + balance = await provider.getBalance(currentAddress); + } + + let decimals = 18; + let currentCollateralPrice; + + if (currentVaultData) { + const { collateral, debt } = currentVaultData; + // @ts-ignore + const allowanceCall = await currentCollateralRead.allowance( + currentAddress, + // @ts-ignore + currentVault.address + ); + // @ts-ignore + const currentRatioCall = await currentVaultRead.getVaultRatio(currentVaultData.vaultId); + + // @ts-ignore + const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); + // @ts-ignore + const decimalsCall = await currentCollateralRead.decimals(); + // @ts-ignore + const currentCollateralPriceCall = await currentCollateralOracleRead.getLatestAnswer(); + // @ts-ignore + const currentMinRatioCall = await currentVaultRead.ratio(); + // @ts-ignore + const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + + // @ts-ignore + const [ + allowance, + currentRatio, + currentAssetPrice, + decimalsVal, + currentCollateralPriceVal, + currentMinRatio, + currentAssetBalance, + ] = await signer.ethcallProvider?.all([ + allowanceCall, + currentRatioCall, + currentAssetPriceCall, + decimalsCall, + currentCollateralPriceCall, + currentMinRatioCall, + currentAssetBalanceCall, + ]); + + decimals = decimalsVal; + currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + + const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); + setAssetBalance(cBalance); + + if (!allowance.isZero() || currentVaultData.collateralSymbol === "ETH") { + const safeValue = currentVaultData.isHardVault ? 20 : 50; + const warnValue = currentVaultData.isHardVault ? 10 : 30; + + setMinRatio(currentMinRatio.toString()); + setIsApproved(true); + setVaultRatio(currentRatio.toString()); + if (currentRatio.toString() === "0") { + setVaultStatus("N/A"); + } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + safeValue) { + setVaultStatus("safe"); + } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + warnValue) { + setVaultStatus("warning"); + } else { + setVaultStatus("danger"); + } + + const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); + setVaultCollateral(parsedCollateral); + const usdCollateral = toUSD(currentCollateralPrice, parsedCollateral); + setVaultCollateralUSD(usdCollateral.toString()); + + const currentAssetPriceFormat = ethers.utils.formatEther(currentAssetPrice); + const parsedDebt = ethers.utils.formatEther(debt); + setVaultDebt(parsedDebt); + const usdAsset = toUSD(currentAssetPriceFormat, parsedDebt); + setVaultDebtUSD(usdAsset.toString()); + } else { + setText(t("vault.approve-text", { asset: currentVaultData.assetSymbol })); + setTitle(t("vault.approve")); + setIsApproved(false); + } + } else { + // @ts-ignore + const decimalsCall = await currentCollateralRead.decimals(); + // @ts-ignore + const currentPriceCall = await currentCollateralOracleRead.getLatestAnswer(); + // @ts-ignore + const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + // @ts-ignore + const [decimalsVal, currentCollateralPriceVal, currentAssetBalance] = + await signer.ethcallProvider?.all([ + decimalsCall, + currentPriceCall, + currentAssetBalanceCall, + ]); + decimals = decimalsVal; + currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + + const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); + setAssetBalance(cBalance); + + setText(t("vault.create-text")); + setTitle(t("vault.create")); + setIsApproved(false); + } + + setSelectedVaultDecimals(decimals); + const currentBalance = ethers.utils.formatUnits(balance, decimals); + if (parseFloat(currentBalance) < 0.09) { + setTokenBalanceDecimals(4); + } else { + setTokenBalanceDecimals(2); + } + setTokenBalance(currentBalance); + const usdBalance = toUSD(currentCollateralPrice, currentBalance); + setTokenBalanceUSD(usdBalance.toString()); + setLoadingMode(false); + } + + useEffect( + () => { + const load = async () => { + if (currentAddress !== "" && currentCollateral !== null && currentAssetRead !== null) { + await loadVault(); + + let aOptions = ["TCAP"]; + if (isArbitrum(currentNetwork.chainId)) { + aOptions = ["JPEGz"]; + } + + let cOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; + if (isHardMode()) { + cOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; + } + if (isOptimism(currentNetwork.chainId) && !isHardMode()) { + cOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; + } + if (isPolygon(currentNetwork.chainId) && !isHardMode()) { + cOptions = ["MATIC", "DAI", "WBTC"]; + } + + setAssetOptions(aOptions); + setCollateralOptions(cOptions); + } + }; + load(); + }, + // eslint-disable-next-line + [currentAddress, currentCollateral, vaultData] + ); + + const assetPrice = async () => { + const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentAssetPrice] = await signer.ethcallProvider?.all([currentAssetPriceCall]); + return currentAssetPrice; + }; + + const collateralPrice = async () => { + const collateralPriceCall = await currentCollateralOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentCollateralPrice] = await signer.ethcallProvider?.all([collateralPriceCall]); + return currentCollateralPrice; + }; + + const isGasAsset = () => + (!isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === "ETH") || + (isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === "MATIC"); + + const refresh = async () => { + try { + await loadVault(); + } catch (error) { + console.log(error); + } + }; + + const resetFields = () => { + setBurnFee("0"); + setAddCollateralUSD("0"); + setAddCollateralTxt("0"); + setRemoveCollateralTxt("0"); + setRemoveCollateralUSD("0"); + setMintTxt("0"); + setMintUSD("0"); + setBurnUSD("0"); + setBurnTxt("0"); + }; + + const handleRadioBtnChange = async (value: string) => { + setLoadingMode(true); + setVaultMode(value); + setIsApproved(false); + setTokenBalance("0"); + setTokenBalanceUSD("0"); + + resetFields(); + await loadVault(); + }; + + const changeVault = async (newRatio: number, reset = false) => { + const safeValue = vaultData.isHardVault ? 20 : 50; + const warnValue = vaultData.isHardVault ? 10 : 30; + let r = newRatio; + + if (reset) { + r = parseFloat(tempRatio); + setVaultRatio(tempRatio); + setTempRatio(""); + resetFields(); + } else { + if (tempRatio === "") { + setTempRatio(vaultRatio); + } + r = newRatio; + setVaultRatio(r.toString()); + } + + if (r === 0) { + setVaultStatus(t("vault.status.na")); + } else if (r >= parseFloat(minRatio) + safeValue) { + setVaultStatus(t("vault.status.safe")); + } else if (r >= parseFloat(minRatio) + warnValue) { + setVaultStatus(t("vault.status.warning")); + } else if (r >= parseFloat(minRatio)) { + setVaultStatus(t("vault.status.danger")); + } else { + setVaultRatio("0"); + setVaultStatus(t("vault.status.error")); + } + }; + + // forms + const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { + if (vaultData.isHardVault) { + const d = parseFloat(vaultDebt); + let newDebt = 0; + if (isMint) { + newDebt = amount + d; + } else { + newDebt = d - amount; + } + return newDebt >= 20 || newDebt === 0; + } + return true; + }; + + const onChangeAddCollateral = async (event: React.ChangeEvent) => { + setAddCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); + const r = await getRatio( + newCollateral.toString(), + currentPrice, + vaultDebt, + currentAssetPrice + ); + changeVault(r); + setAddCollateralUSD(usd.toString()); + } else { + changeVault(0, false); + setAddCollateralUSD("0"); + } + }; + + const onFocusAddCollateral = () => { + if (addCollateralTxt && parseFloat(addCollateralTxt) === 0) { + setAddCollateralTxt(""); + } + }; + + const onBlurAddCollateral = () => { + if (!addCollateralTxt) { + setAddCollateralTxt("0"); + } + }; + + const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { + setRemoveCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); + const r = await getRatio( + newCollateral.toString(), + currentPrice, + vaultDebt, + currentAssetPrice + ); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + } else { + changeVault(0, false); + setRemoveCollateralUSD("0"); + } + }; + + const onFocusRemoveCollateral = () => { + if (removeCollateralTxt && parseFloat(removeCollateralTxt) === 0) { + setRemoveCollateralTxt(""); + } + }; + + const onBlurRemoveCollateral = () => { + if (!removeCollateralTxt) { + setRemoveCollateralTxt("0"); + } + }; + + const onChangeMint = async (event: React.ChangeEvent) => { + setMintTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentAssetPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); + const r = await getRatio( + vaultCollateral, + currentPrice, + newDebt.toString(), + currentAssetPrice + ); + changeVault(r); + setMintUSD(usd.toString()); + } else { + changeVault(0, false); + setMintUSD("0"); + } + }; + + const onFocusMint = () => { + if (mintTxt && parseFloat(mintTxt) === 0) { + setMintTxt(""); + } + }; + + const onBlurMint = () => { + if (!mintTxt) { + setMintTxt("0"); + } + }; + + const onChangeBurn = async (event: React.ChangeEvent) => { + try { + setBurnTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentAssetPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); + const r = await getRatio( + vaultCollateral, + currentPrice, + newDebt.toString(), + currentAssetPrice + ); + changeVault(r); + setBurnUSD(usd.toString()); + const currentBurnFee = await currentVaultRead?.getFee( + ethers.utils.parseEther(event.target.value) + ); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + changeVault(0, false); + setBurnUSD("0"); + setBurnFee("0"); + } + } catch (error) { + console.error(error); + changeVault(0, true); + setBurnUSD("0"); + setBurnFee("0"); + } + }; + + const onFocusBurn = () => { + if (burnTxt && parseFloat(burnTxt) === 0) { + setBurnTxt(""); + } + }; + + const onBlurBurn = () => { + if (!burnTxt) { + setBurnTxt("0"); + } + }; + + const addCollateral = async () => { + if (addCollateralTxt && parseFloat(addCollateralTxt) > 0) { + setBtnDisabled(true); + // fix decimals + const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); + try { + if (isGasAsset()) { + let tx; + if (vaultData.collateralSymbol === "ETH") { + tx = await currentVault?.addCollateralETH({ + value: amount, + }); + } else { + tx = await currentVault?.addCollateralMATIC({ + value: amount, + }); + } + notifyUser(tx, refresh); + } else { + const tx = await currentVault?.addCollateral(amount); + notifyUser(tx, refresh); + } + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("errors.no-funds")); + } + } + setBtnDisabled(false); + setAddCollateralTxt("0"); + setAddCollateralUSD("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const maxAddCollateral = async (e: React.MouseEvent) => { + e.preventDefault(); + let balance = "0"; + if (vaultData.collateralSymbol === "ETH") { + const provider = getDefaultProvider(currentNetwork.chainId, currentNetwork.name); + balance = ethers.utils.formatEther(await provider.getBalance(currentAddress)); + } else if (currentCollateral) { + const value = BigNumber.from(await currentCollateral.balanceOf(currentAddress)); + balance = ethers.utils.formatUnits(value, selectedVaultDecimals); + } + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + setAddCollateralTxt(balance); + let usd = toUSD(currentPrice, balance); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(balance) + parseFloat(vaultCollateral); + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); + changeVault(r); + setAddCollateralUSD(usd.toString()); + }; + + const removeCollateral = async () => { + if (removeCollateralTxt && parseFloat(removeCollateralTxt) > 0) { + const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); + setBtnDisabled(true); + try { + if (isGasAsset()) { + let tx; + if (vaultData.collateralSymbol === "ETH") { + tx = await currentCollateral?.removeCollateralETH(amount); + } else { + tx = await currentCollateral?.removeCollateralMATIC(amount); + } + notifyUser(tx, refresh); + } else { + const tx = await currentCollateral?.removeCollateral(amount); + notifyUser(tx, refresh); + } + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.tran-rejected")); + } + } + setBtnDisabled(false); + setRemoveCollateralTxt("0"); + setRemoveCollateralUSD("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const safeRemoveCollateral = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let collateralToRemove = await getSafeRemoveCollateral( + minRatio, + vaultCollateral, + currentPrice, + currentAssetPrice, + vaultDebt, + vaultData.isHardVault + ); + if (selectedVaultDecimals === 8) { + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); + } + setRemoveCollateralTxt(collateralToRemove.toString()); + let usd = toUSD(currentPrice, collateralToRemove.toString()); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - collateralToRemove; + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + }; + + const mintTCAP = async () => { + if (mintTxt && parseFloat(mintTxt) > 0) { + if (isMinRequiredTcap(parseFloat(mintTxt), true)) { + setBtnDisabled(true); + try { + const amount = ethers.utils.parseEther(mintTxt); + const tx = await currentVault?.mint(amount); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.no-collateral")); + } + } + setBtnDisabled(false); + setMintTxt("0"); + setMintUSD("0"); + } else { + errorNotification(t("vault.errors.min-tcap")); + } + } else { + errorNotification(t("errors.empty")); + } + }; + + const safeMintTCAP = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + const safeMint = await getSafeMint( + minRatio, + vaultCollateral, + currentPrice, + currentAssetPrice, + vaultDebt, + vaultData.isHardVault + ); + setMintTxt(safeMint.toString()); + let usd = toUSD(currentAssetPrice, safeMint.toString()); + if (!usd) { + usd = 0; + } + const newDebt = safeMint + parseFloat(vaultDebt); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); + changeVault(r); + setMintUSD(usd.toString()); + }; + + const burnTCAP = async () => { + if (burnTxt && parseFloat(burnTxt) > 0) { + const amount = ethers.utils.parseEther(burnTxt); + setBtnDisabled(true); + try { + const currentBurnFee = await currentVault?.getFee(amount); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + const tx = await currentVault?.burn(amount, { value: increasedFee }); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.burn-too-high")); + } + } + setBtnDisabled(false); + setBurnTxt("0"); + setBurnUSD("0"); + setBurnFee("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const maxBurnTCAP = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + const currentBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + const currentVaultDebtCall = await currentVaultRead?.vaults(vaultData.vaultId); + + // @ts-ignore + const [currentBalance, cVault] = await signer.ethcallProvider?.all([ + currentBalanceCall, + currentVaultDebtCall, + ]); + + let balanceFormat = "0"; + let balance; + if (currentBalance.lt(cVault.Debt)) { + balanceFormat = ethers.utils.formatEther(currentBalance); + balance = currentBalance; + } else { + balanceFormat = vaultDebt; + balance = cVault.Debt; + } + setBurnTxt(balanceFormat); + let usd = toUSD(currentAssetPrice, balanceFormat); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(balanceFormat) - parseFloat(balanceFormat); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); + changeVault(r); + setBurnUSD(usd.toString()); + + if (balanceFormat !== "0") { + const currentBurnFee = await currentVault?.getFee(balance); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + setBurnFee("0"); + } + }; + + const handleTokenChange = async (value: string) => { + setIsApproved(false); + setTokenBalance("0"); + setTokenBalanceUSD("0"); + + // Clean form + setAddCollateralTxt(""); + setAddCollateralUSD("0"); + setRemoveCollateralTxt(""); + setRemoveCollateralUSD("0"); + setMintTxt(""); + setMintUSD("0"); + setBurnTxt(""); + setBurnUSD("0"); + setBurnFee("0"); + + // Load values + // await loadVault(); + }; + + const ActionsDropdown = () => ( + setActiveAction(eventKey || "add")}> + +
+ {activeAction !== "" ? activeAction.toUpperCase() : "Actions"} +
+
+ + {actions.map((action) => ( + + {action.toUpperCase()} + + ))} + +
+ ); + + const AddCollateral = () => ( + + + + + + + + + + ); + + const RemoveCollateral = () => ( + + + + + + + + + + ); + + const MintAsset = () => ( + + + + + + + + + + ); + + const BurnAsset = () => ( + + + + + + + + + + ); + + const ActionControls = () => { + if (activeAction === "add") { + return ; + } + if (activeAction === "remove") { + return ; + } + if (activeAction === "mint") { + return ; + } + return ; + }; + + const MaxButton = () => { + if (activeAction === "add") { + return ( + + ); + } + if (activeAction === "remove") { + return ( + + ); + } + if (activeAction === "mint") { + return ( + + ); + } + return ( + + ); + }; + + const AssetDropdown = () => ( +
+
Asset
+ + +
+ + TCAP +
+
+ + {assetOptions.map((item) => ( + + + {item} + + ))} + +
+
+ ); + + const CollateralDropdown = () => ( +
+
Collateral
+ handleTokenChange(eventKey || "ETH")}> + +
+ + {vaultData.collateralSymbol.toUpperCase()} +
+
+ + {collateralOptions.map((item) => ( + + + {item} + + ))} + +
+
+ ); + + const AssetBalance = (isCollateral: boolean) => { + const aBalance = isCollateral ? tokenBalance : assetBalance; + + return ( +
+ Balance: + + + +
+ ); + }; + + const CollateralAmount = () => ( +
+ Collateral: + + + +
+ ); + + const MintedAmount = () => ( +
+ Debt: + + + +
+ ); + + const RenderCreateVault = () => ( +
+

+ <>{text} +

+ +
+ ); + + return ( +
+
+
+ {AssetBalance(false)} + {isApproved && } +
+
+ {AssetBalance(true)} + {isApproved && } +
+
+ {!isApproved ? ( + + ) : ( + <> +
+
+
+ + {activeAction !== "" && } +
+ {activeAction === actions[3] && ( +
+ + <>{t("vault.debt.fee")}: + + {" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} +
+ )} +
+ {activeAction !== "" && ( +
+ + + )} +
+
+
+
Ratio:
+
+
+
+

+ +

+
+ - +

+ {vaultStatus} +

+
+
+ + )} +
+ ); +}; + +export default VaultForm; diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx new file mode 100644 index 0000000..72689fb --- /dev/null +++ b/src/components/Vaults/vault/index.tsx @@ -0,0 +1,1199 @@ +import React, { useContext, useState, useEffect } from "react"; +import { ethers, BigNumber } from "ethers"; +import { + Button, + ButtonGroup, + Dropdown, + Form, + InputGroup, + OverlayTrigger, + ToggleButton, + Tooltip, +} from "react-bootstrap/esm"; +import { FaArrowLeft } from "react-icons/fa"; +import NumberFormat from "react-number-format"; +import { useTranslation } from "react-i18next"; +import "../../../styles/mintindex.scss"; +import { useVault } from "../../../hooks"; +import { networkContext, signerContext } from "../../../state"; +import { TokenIcon } from "../common"; +import { NETWORKS } from "../../../utils/constants"; +import { + errorNotification, + getDefaultProvider, + getRatio, + getSafeRemoveCollateral, + getSafeMint, + isInLayer1, + isOptimism, + isPolygon, + notifyUser, + toUSD, + isArbitrum, +} from "../../../utils/utils"; + +type VaultInitType = { + vaultId: string; + assetSymbol: string; + collateralSymbol: string; + isHardVault: boolean; +}; + +type props = { + currentAddress: string; + vaultInitData: VaultInitType; + updateInitVaultData: (data: VaultInitType) => void; + goBack: () => void; +}; + +const Vault = ({ currentAddress, vaultInitData, updateInitVaultData, goBack }: props) => { + const { t } = useTranslation(); + const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); + const [vaultMode, setVaultMode] = useState( + isInLayer1(currentNetwork.chainId) ? "hard" : "normal" + ); + + const { + currentCollateral, + currentVault, + currentAssetRead, + currentCollateralRead, + currentVaultRead, + currentCollateralOracleRead, + currentAssetOracleRead, + } = useVault( + vaultInitData.assetSymbol, + vaultInitData.collateralSymbol, + vaultInitData.isHardVault + ); + const [loadingMode, setLoadingMode] = useState(false); + const actions = ["add", "remove", "mint", "burn"]; + const radios = [ + { name: "Regular", value: "normal" }, + { name: "Hard", value: "hard" }, + ]; + + // Actions + const [title, setTitle] = useState(t("vault.create")); + const [text, setText] = useState(t("vault.create-text", { asset: vaultInitData.assetSymbol })); + const [isApproved, setIsApproved] = useState(false); + const [isLoading, setIsLoading] = useState(true); + const [btnDisabled, setBtnDisabled] = useState(false); + const [activeAction, setActiveAction] = useState(""); + + // Vault Data + const [assetOptions, setAssetOptions] = useState>([]); + const [collateralOptions, setCollateralOptions] = useState>([]); + const [vaultDebt, setVaultDebt] = useState("0"); + const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); + const [vaultCollateral, setVaultCollateral] = useState("0"); + const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); + const [vaultRatio, setVaultRatio] = useState("0"); + const [tempRatio, setTempRatio] = useState(""); + const [minRatio, setMinRatio] = useState("0"); + const [selectedVaultDecimals, setSelectedVaultDecimals] = useState(18); + + // General Data + const [assetBalance, setAssetBalance] = useState("0"); + const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); + const [tokenBalance, setTokenBalance] = useState("0"); + const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); + + // Inputs + const [addCollateralTxt, setAddCollateralTxt] = useState("0"); + const [addCollateralUSD, setAddCollateralUSD] = useState("0"); + const [removeCollateralTxt, setRemoveCollateralTxt] = useState("0"); + const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); + const [mintTxt, setMintTxt] = useState("0"); + const [mintUSD, setMintUSD] = useState("0"); + const [burnTxt, setBurnTxt] = useState("0"); + const [burnUSD, setBurnUSD] = useState("0"); + const [burnFee, setBurnFee] = useState("0"); + const [vaultStatus, setVaultStatus] = useState(""); + const isHardMode = () => vaultMode === "hard"; + // Infinite Approval + const approveValue = BigNumber.from("1157920892373161954235709850086879078532699"); + + async function loadVault() { + let balance; + const provider = getDefaultProvider( + currentNetwork.chainId || NETWORKS.mainnet.chainId, + currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.rinkeby.name + ); + + let currentVaultData: any; + if (currentVaultData.vaultId !== "0") { + // @ts-ignore + const vault = await currentVault.vaults(BigNumber.from(currentVaultData.vaultId)); + currentVaultData = { + vaultId: currentVaultData.vaultId, + collateral: vault.Collateral, + debt: vault.Debt, + }; + } + + if (currentVaultData.collateralSymbol !== "ETH") { + // @ts-ignore + balance = await currentCollateral.balanceOf(currentAddress); + } else { + balance = await provider.getBalance(currentAddress); + } + + let decimals = 18; + let currentCollateralPrice; + + if (currentVaultData) { + const { collateral, debt } = currentVaultData; + // @ts-ignore + const allowanceCall = await currentCollateralRead.allowance( + currentAddress, + // @ts-ignore + currentVault.address + ); + // @ts-ignore + const currentRatioCall = await currentVaultRead.getVaultRatio(currentVaultData.vaultId); + + // @ts-ignore + const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); + // @ts-ignore + const decimalsCall = await currentCollateralRead.decimals(); + // @ts-ignore + const currentCollateralPriceCall = await currentCollateralOracleRead.getLatestAnswer(); + // @ts-ignore + const currentMinRatioCall = await currentVaultRead.ratio(); + // @ts-ignore + const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + + // @ts-ignore + const [ + allowance, + currentRatio, + currentAssetPrice, + decimalsVal, + currentCollateralPriceVal, + currentMinRatio, + currentAssetBalance, + ] = await signer.ethcallProvider?.all([ + allowanceCall, + currentRatioCall, + currentAssetPriceCall, + decimalsCall, + currentCollateralPriceCall, + currentMinRatioCall, + currentAssetBalanceCall, + ]); + + decimals = decimalsVal; + currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + + const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); + setAssetBalance(cBalance); + + if (!allowance.isZero() || currentVaultData.collateralSymbol === "ETH") { + const safeValue = currentVaultData.isHardVault ? 20 : 50; + const warnValue = currentVaultData.isHardVault ? 10 : 30; + + setMinRatio(currentMinRatio.toString()); + setIsApproved(true); + setVaultRatio(currentRatio.toString()); + if (currentRatio.toString() === "0") { + setVaultStatus("N/A"); + } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + safeValue) { + setVaultStatus("safe"); + } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + warnValue) { + setVaultStatus("warning"); + } else { + setVaultStatus("danger"); + } + + const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); + setVaultCollateral(parsedCollateral); + const usdCollateral = toUSD(currentCollateralPrice, parsedCollateral); + setVaultCollateralUSD(usdCollateral.toString()); + + const currentAssetPriceFormat = ethers.utils.formatEther(currentAssetPrice); + const parsedDebt = ethers.utils.formatEther(debt); + setVaultDebt(parsedDebt); + const usdAsset = toUSD(currentAssetPriceFormat, parsedDebt); + setVaultDebtUSD(usdAsset.toString()); + } else { + setText(t("vault.approve-text", { asset: currentVaultData.assetSymbol })); + setTitle(t("vault.approve")); + setIsApproved(false); + } + } else { + // @ts-ignore + const decimalsCall = await currentCollateralRead.decimals(); + // @ts-ignore + const currentPriceCall = await currentCollateralOracleRead.getLatestAnswer(); + // @ts-ignore + const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + // @ts-ignore + const [decimalsVal, currentCollateralPriceVal, currentAssetBalance] = + await signer.ethcallProvider?.all([ + decimalsCall, + currentPriceCall, + currentAssetBalanceCall, + ]); + decimals = decimalsVal; + currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + + const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); + setAssetBalance(cBalance); + + setText(t("vault.create-text")); + setTitle(t("vault.create")); + setIsApproved(false); + } + + setSelectedVaultDecimals(decimals); + const currentBalance = ethers.utils.formatUnits(balance, decimals); + if (parseFloat(currentBalance) < 0.09) { + setTokenBalanceDecimals(4); + } else { + setTokenBalanceDecimals(2); + } + setTokenBalance(currentBalance); + const usdBalance = toUSD(currentCollateralPrice, currentBalance); + setTokenBalanceUSD(usdBalance.toString()); + setLoadingMode(false); + } + + useEffect( + () => { + const load = async () => { + if (currentAddress !== "" && currentCollateral !== null && currentAssetRead !== null) { + await loadVault(); + + let aOptions = ["TCAP"]; + if (isArbitrum(currentNetwork.chainId)) { + aOptions = ["JPEGz"]; + } + + let cOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; + if (isHardMode()) { + cOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; + } + if (isOptimism(currentNetwork.chainId) && !isHardMode()) { + cOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; + } + if (isPolygon(currentNetwork.chainId) && !isHardMode()) { + cOptions = ["MATIC", "DAI", "WBTC"]; + } + + setAssetOptions(aOptions); + setCollateralOptions(cOptions); + } + }; + load(); + }, + // eslint-disable-next-line + [currentAddress, currentCollateral, vaultInitData] + ); + + const assetPrice = async () => { + const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentAssetPrice] = await signer.ethcallProvider?.all([currentAssetPriceCall]); + return currentAssetPrice; + }; + + const collateralPrice = async () => { + const collateralPriceCall = await currentCollateralOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentCollateralPrice] = await signer.ethcallProvider?.all([collateralPriceCall]); + return currentCollateralPrice; + }; + + const isGasAsset = () => + (!isPolygon(currentNetwork.chainId) && vaultInitData.collateralSymbol === "ETH") || + (isPolygon(currentNetwork.chainId) && vaultInitData.collateralSymbol === "MATIC"); + + const refresh = async () => { + try { + await loadVault(); + } catch (error) { + console.log(error); + } + }; + + const resetFields = () => { + setBurnFee("0"); + setAddCollateralUSD("0"); + setAddCollateralTxt("0"); + setRemoveCollateralTxt("0"); + setRemoveCollateralUSD("0"); + setMintTxt("0"); + setMintUSD("0"); + setBurnUSD("0"); + setBurnTxt("0"); + }; + + const handleRadioBtnChange = async (value: string) => { + setLoadingMode(true); + setVaultMode(value); + setIsApproved(false); + setTokenBalance("0"); + setTokenBalanceUSD("0"); + + resetFields(); + await loadVault(); + }; + + const changeVault = async (newRatio: number, reset = false) => { + const safeValue = vaultInitData.isHardVault ? 20 : 50; + const warnValue = vaultInitData.isHardVault ? 10 : 30; + let r = newRatio; + + if (reset) { + r = parseFloat(tempRatio); + setVaultRatio(tempRatio); + setTempRatio(""); + resetFields(); + } else { + if (tempRatio === "") { + setTempRatio(vaultRatio); + } + r = newRatio; + setVaultRatio(r.toString()); + } + + if (r === 0) { + setVaultStatus(t("vault.status.na")); + } else if (r >= parseFloat(minRatio) + safeValue) { + setVaultStatus(t("vault.status.safe")); + } else if (r >= parseFloat(minRatio) + warnValue) { + setVaultStatus(t("vault.status.warning")); + } else if (r >= parseFloat(minRatio)) { + setVaultStatus(t("vault.status.danger")); + } else { + setVaultRatio("0"); + setVaultStatus(t("vault.status.error")); + } + }; + + // forms + const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { + if (vaultInitData.isHardVault) { + const d = parseFloat(vaultDebt); + let newDebt = 0; + if (isMint) { + newDebt = amount + d; + } else { + newDebt = d - amount; + } + return newDebt >= 20 || newDebt === 0; + } + return true; + }; + + const onChangeAddCollateral = async (event: React.ChangeEvent) => { + setAddCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); + const r = await getRatio( + newCollateral.toString(), + currentPrice, + vaultDebt, + currentAssetPrice + ); + changeVault(r); + setAddCollateralUSD(usd.toString()); + } else { + changeVault(0, false); + setAddCollateralUSD("0"); + } + }; + + const onFocusAddCollateral = () => { + if (addCollateralTxt && parseFloat(addCollateralTxt) === 0) { + setAddCollateralTxt(""); + } + }; + + const onBlurAddCollateral = () => { + if (!addCollateralTxt) { + setAddCollateralTxt("0"); + } + }; + + const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { + setRemoveCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); + const r = await getRatio( + newCollateral.toString(), + currentPrice, + vaultDebt, + currentAssetPrice + ); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + } else { + changeVault(0, false); + setRemoveCollateralUSD("0"); + } + }; + + const onFocusRemoveCollateral = () => { + if (removeCollateralTxt && parseFloat(removeCollateralTxt) === 0) { + setRemoveCollateralTxt(""); + } + }; + + const onBlurRemoveCollateral = () => { + if (!removeCollateralTxt) { + setRemoveCollateralTxt("0"); + } + }; + + const onChangeMint = async (event: React.ChangeEvent) => { + setMintTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentAssetPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); + const r = await getRatio( + vaultCollateral, + currentPrice, + newDebt.toString(), + currentAssetPrice + ); + changeVault(r); + setMintUSD(usd.toString()); + } else { + changeVault(0, false); + setMintUSD("0"); + } + }; + + const onFocusMint = () => { + if (mintTxt && parseFloat(mintTxt) === 0) { + setMintTxt(""); + } + }; + + const onBlurMint = () => { + if (!mintTxt) { + setMintTxt("0"); + } + }; + + const onChangeBurn = async (event: React.ChangeEvent) => { + try { + setBurnTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentAssetPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); + const r = await getRatio( + vaultCollateral, + currentPrice, + newDebt.toString(), + currentAssetPrice + ); + changeVault(r); + setBurnUSD(usd.toString()); + const currentBurnFee = await currentVaultRead?.getFee( + ethers.utils.parseEther(event.target.value) + ); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + changeVault(0, false); + setBurnUSD("0"); + setBurnFee("0"); + } + } catch (error) { + console.error(error); + changeVault(0, true); + setBurnUSD("0"); + setBurnFee("0"); + } + }; + + const onFocusBurn = () => { + if (burnTxt && parseFloat(burnTxt) === 0) { + setBurnTxt(""); + } + }; + + const onBlurBurn = () => { + if (!burnTxt) { + setBurnTxt("0"); + } + }; + + const addCollateral = async () => { + if (addCollateralTxt && parseFloat(addCollateralTxt) > 0) { + setBtnDisabled(true); + // fix decimals + const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); + try { + if (isGasAsset()) { + let tx; + if (vaultInitData.collateralSymbol === "ETH") { + tx = await currentVault?.addCollateralETH({ + value: amount, + }); + } else { + tx = await currentVault?.addCollateralMATIC({ + value: amount, + }); + } + notifyUser(tx, refresh); + } else { + const tx = await currentVault?.addCollateral(amount); + notifyUser(tx, refresh); + } + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("errors.no-funds")); + } + } + setBtnDisabled(false); + setAddCollateralTxt("0"); + setAddCollateralUSD("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const maxAddCollateral = async (e: React.MouseEvent) => { + e.preventDefault(); + let balance = "0"; + if (vaultInitData.collateralSymbol === "ETH") { + const provider = getDefaultProvider(currentNetwork.chainId, currentNetwork.name); + balance = ethers.utils.formatEther(await provider.getBalance(currentAddress)); + } else if (currentCollateral) { + const value = BigNumber.from(await currentCollateral.balanceOf(currentAddress)); + balance = ethers.utils.formatUnits(value, selectedVaultDecimals); + } + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + setAddCollateralTxt(balance); + let usd = toUSD(currentPrice, balance); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(balance) + parseFloat(vaultCollateral); + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); + changeVault(r); + setAddCollateralUSD(usd.toString()); + }; + + const removeCollateral = async () => { + if (removeCollateralTxt && parseFloat(removeCollateralTxt) > 0) { + const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); + setBtnDisabled(true); + try { + if (isGasAsset()) { + let tx; + if (vaultInitData.collateralSymbol === "ETH") { + tx = await currentCollateral?.removeCollateralETH(amount); + } else { + tx = await currentCollateral?.removeCollateralMATIC(amount); + } + notifyUser(tx, refresh); + } else { + const tx = await currentCollateral?.removeCollateral(amount); + notifyUser(tx, refresh); + } + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.tran-rejected")); + } + } + setBtnDisabled(false); + setRemoveCollateralTxt("0"); + setRemoveCollateralUSD("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const safeRemoveCollateral = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let collateralToRemove = await getSafeRemoveCollateral( + minRatio, + vaultCollateral, + currentPrice, + currentAssetPrice, + vaultDebt, + vaultInitData.isHardVault + ); + if (selectedVaultDecimals === 8) { + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); + } + setRemoveCollateralTxt(collateralToRemove.toString()); + let usd = toUSD(currentPrice, collateralToRemove.toString()); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - collateralToRemove; + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + }; + + const mintTCAP = async () => { + if (mintTxt && parseFloat(mintTxt) > 0) { + if (isMinRequiredTcap(parseFloat(mintTxt), true)) { + setBtnDisabled(true); + try { + const amount = ethers.utils.parseEther(mintTxt); + const tx = await currentVault?.mint(amount); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.no-collateral")); + } + } + setBtnDisabled(false); + setMintTxt("0"); + setMintUSD("0"); + } else { + errorNotification(t("vault.errors.min-tcap")); + } + } else { + errorNotification(t("errors.empty")); + } + }; + + const safeMintTCAP = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + const safeMint = await getSafeMint( + minRatio, + vaultCollateral, + currentPrice, + currentAssetPrice, + vaultDebt, + vaultInitData.isHardVault + ); + setMintTxt(safeMint.toString()); + let usd = toUSD(currentAssetPrice, safeMint.toString()); + if (!usd) { + usd = 0; + } + const newDebt = safeMint + parseFloat(vaultDebt); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); + changeVault(r); + setMintUSD(usd.toString()); + }; + + const burnTCAP = async () => { + if (burnTxt && parseFloat(burnTxt) > 0) { + const amount = ethers.utils.parseEther(burnTxt); + setBtnDisabled(true); + try { + const currentBurnFee = await currentVault?.getFee(amount); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + const tx = await currentVault?.burn(amount, { value: increasedFee }); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.burn-too-high")); + } + } + setBtnDisabled(false); + setBurnTxt("0"); + setBurnUSD("0"); + setBurnFee("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const maxBurnTCAP = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + const currentBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + const currentVaultDebtCall = await currentVaultRead?.vaults(vaultInitData.vaultId); + + // @ts-ignore + const [currentBalance, cVault] = await signer.ethcallProvider?.all([ + currentBalanceCall, + currentVaultDebtCall, + ]); + + let balanceFormat = "0"; + let balance; + if (currentBalance.lt(cVault.Debt)) { + balanceFormat = ethers.utils.formatEther(currentBalance); + balance = currentBalance; + } else { + balanceFormat = vaultDebt; + balance = cVault.Debt; + } + setBurnTxt(balanceFormat); + let usd = toUSD(currentAssetPrice, balanceFormat); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(balanceFormat) - parseFloat(balanceFormat); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); + changeVault(r); + setBurnUSD(usd.toString()); + + if (balanceFormat !== "0") { + const currentBurnFee = await currentVault?.getFee(balance); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + setBurnFee("0"); + } + }; + + const handleTokenChange = async (value: string) => { + setIsApproved(false); + setTokenBalance("0"); + setTokenBalanceUSD("0"); + + // Clean form + setAddCollateralTxt(""); + setAddCollateralUSD("0"); + setRemoveCollateralTxt(""); + setRemoveCollateralUSD("0"); + setMintTxt(""); + setMintUSD("0"); + setBurnTxt(""); + setBurnUSD("0"); + setBurnFee("0"); + + // Load values + await loadVault(); + }; + + const ActionsDropdown = () => ( + setActiveAction(eventKey || "add")}> + +
+ {activeAction !== "" ? activeAction.toUpperCase() : "Actions"} +
+
+ + {actions.map((action) => ( + + {action.toUpperCase()} + + ))} + +
+ ); + + const AddCollateral = () => ( + + + + + + + + + + ); + + const RemoveCollateral = () => ( + + + + + + + + + + ); + + const MintAsset = () => ( + + + + + + + + + + ); + + const BurnAsset = () => ( + + + + + + + + + + ); + + const ActionControls = () => { + if (activeAction === "add") { + return ; + } + if (activeAction === "remove") { + return ; + } + if (activeAction === "mint") { + return ; + } + return ; + }; + + const MaxButton = () => { + if (activeAction === "add") { + return ( + + ); + } + if (activeAction === "remove") { + return ( + + ); + } + if (activeAction === "mint") { + return ( + + ); + } + return ( + + ); + }; + + const AssetDropdown = () => ( +
+
Asset
+ + +
+ + TCAP +
+
+ + {assetOptions.map((item) => ( + + + {item} + + ))} + +
+
+ ); + + const CollateralDropdown = () => ( +
+
Collateral
+ handleTokenChange(eventKey || "ETH")}> + +
+ + {vaultInitData.collateralSymbol.toUpperCase()} +
+
+ + {collateralOptions.map((item) => ( + + + {item} + + ))} + +
+
+ ); + + const AssetBalance = (isCollateral: boolean) => { + const aBalance = isCollateral ? tokenBalance : assetBalance; + + return ( +
+ Balance: + + + +
+ ); + }; + + const CollateralAmount = () => ( +
+ Collateral: + + + +
+ ); + + const MintedAmount = () => ( +
+ Debt: + + + +
+ ); + + const RenderCreateVault = () => ( +
+

+ <>{text} +

+ +
+ ); + + return ( +
+
+
+
+ +
Vault
+
+
+ + {radios.map((radio, idx) => ( + handleRadioBtnChange(e.currentTarget.value)} + > + {radio.name} + + ))} + +
+
+
+
+
+
+ + {AssetBalance(false)} + {isApproved && } +
+
+ + {AssetBalance(true)} + {isApproved && } +
+
+ {!isApproved ? ( + + ) : ( + <> +
+
+
+ + {activeAction !== "" && } +
+ {activeAction === actions[3] && ( +
+ + <>{t("vault.debt.fee")}: + + {" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} +
+ )} +
+ {activeAction !== "" && ( +
+ + + )} +
+
+
+
Ratio:
+
+
+
+

+ +

+
+ - +

+ {vaultStatus} +

+
+
+ + )} +
+
+
+
+ ); +}; + +export default Vault; diff --git a/src/hooks/index.tsx b/src/hooks/index.tsx index f4f7904..1ace187 100644 --- a/src/hooks/index.tsx +++ b/src/hooks/index.tsx @@ -8,12 +8,18 @@ export * from "./useMushroomNft"; export * from "./useNetworks"; +export * from "./usePrices"; + export * from "./useOracles"; +export * from "./useRatios"; + export * from "./useRewards"; export * from "./useSigner"; export * from "./useTokens"; +export * from "./useVault"; + export * from "./useVaults"; diff --git a/src/components/Vaults/usePrices.tsx b/src/hooks/usePrices.tsx similarity index 97% rename from src/components/Vaults/usePrices.tsx rename to src/hooks/usePrices.tsx index 22bfbc5..e269ee6 100644 --- a/src/components/Vaults/usePrices.tsx +++ b/src/hooks/usePrices.tsx @@ -1,8 +1,8 @@ import { useContext, useEffect, useState } from "react"; import { ethers, BigNumber } from "ethers"; -import { oraclesContext, networkContext, signerContext } from "../../state/index"; -import { isInLayer1, isOptimism, isPolygon, validOracles } from "../../utils/utils"; -import { OraclePricesType } from "./types"; +import { oraclesContext, networkContext, signerContext } from "../state/index"; +import { isInLayer1, isOptimism, isPolygon, validOracles } from "../utils/utils"; +import { OraclePricesType } from "../components/Vaults/types"; export const usePrices = (): OraclePricesType => { const currentNetwork = useContext(networkContext); @@ -23,6 +23,7 @@ export const usePrices = (): OraclePricesType => { const loadPrices = async () => { if (signer && oracles && validOracles(currentNetwork.chainId || 1, oracles)) { + console.log("4. usePrices"); const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); diff --git a/src/components/Vaults/useRatios.tsx b/src/hooks/useRatios.tsx similarity index 96% rename from src/components/Vaults/useRatios.tsx rename to src/hooks/useRatios.tsx index f53fb2f..c6aa5e9 100644 --- a/src/components/Vaults/useRatios.tsx +++ b/src/hooks/useRatios.tsx @@ -1,7 +1,7 @@ import { useContext, useEffect, useState } from "react"; -import { hardVaultsContext, networkContext, signerContext, vaultsContext } from "../../state/index"; -import { isInLayer1, isOptimism, isPolygon, validVaults, validHardVaults } from "../../utils/utils"; -import { VaultsRatioType } from "./types"; +import { hardVaultsContext, networkContext, signerContext, vaultsContext } from "../state/index"; +import { isInLayer1, isOptimism, isPolygon, validVaults, validHardVaults } from "../utils/utils"; +import { VaultsRatioType } from "../components/Vaults/types"; export const useRatios = (): VaultsRatioType => { const currentNetwork = useContext(networkContext); diff --git a/src/hooks/useVault.tsx b/src/hooks/useVault.tsx new file mode 100644 index 0000000..7f20c4f --- /dev/null +++ b/src/hooks/useVault.tsx @@ -0,0 +1,186 @@ +import { useContext, useEffect, useState } from "react"; +import { ethers } from "ethers"; +import { Contract } from "ethers-multicall"; +import { + hardVaultsContext, + oraclesContext, + networkContext, + signerContext, + tokensContext, + vaultsContext, +} from "../state/index"; +import { validVaults, validHardVaults } from "../utils/utils"; +import { NETWORKS } from "../utils/constants"; + +type contractsType = { + currentAsset: ethers.Contract | null; + currentCollateral: ethers.Contract | null; + currentVault: ethers.Contract | null; + currentAssetRead: Contract | null; + currentCollateralRead: Contract | null; + currentVaultRead: Contract | null; + currentCollateralOracleRead: Contract | null; + currentAssetOracleRead: Contract | null; +}; + +export const useVault = ( + assetSymbol: string, + collateralSymbol: string, + isHardVault: boolean +): contractsType => { + const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); + const oracles = useContext(oraclesContext); + const hardVaults = useContext(hardVaultsContext); + const vaults = useContext(vaultsContext); + const tokens = useContext(tokensContext); + + const [currentAsset, setCurrentAsset] = useState(null); + const [currentCollateral, setCurrentCollateral] = useState(null); + const [currentVault, setCurrentVault] = useState(null); + const [currentAssetRead, setCurrentAssetRead] = useState(null); + const [currentCollateralRead, setCurrentCollateralRead] = useState(null); + const [currentVaultRead, setCurrentVaultRead] = useState(null); + const [currentOracleRead, setCurrentOracleRead] = useState(null); + const [currentAssetOracleRead, setCurrentAssetOracleRead] = useState(null); + + const loadContracts = async () => { + let cAsset = tokens.tcapToken; + let cAssetRead = tokens.tcapTokenRead; + let cCollateral = tokens.wethToken; + let cCollateralRead = tokens.wethTokenRead; + let cVault = hardVaults.wethVault; + let cVaultRead = hardVaults.wethVaultRead; + let cOracleRead = oracles.wethOracleRead; + let cAssetOracleRead = oracles.tcapOracleRead; + + if (isHardVault) { + cVault = hardVaults.wethVault; + cVaultRead = hardVaults.wethVaultRead; + } + if (assetSymbol === "JPEGz") { + cAsset = tokens.tcapToken; + cAssetRead = tokens.tcapTokenRead; + cAssetOracleRead = oracles.tcapOracleRead; + } + + switch (collateralSymbol) { + case "DAI": + if (isHardVault) { + cVault = hardVaults.daiVault; + cVaultRead = hardVaults.daiVaultRead; + } else { + cVault = vaults.daiVault; + cVaultRead = vaults.daiVaultRead; + } + cCollateral = tokens.daiToken; + cCollateralRead = tokens.daiTokenRead; + cOracleRead = oracles.daiOracleRead; + break; + case "AAVE": + cVault = vaults.aaveVault; + cVaultRead = vaults.aaveVaultRead; + cCollateral = tokens.aaveToken; + cCollateralRead = tokens.aaveTokenRead; + cOracleRead = oracles.aaveOracleRead; + break; + case "LINK": + cVault = vaults.linkVault; + cVaultRead = vaults.linkVaultRead; + cCollateral = tokens.daiToken; + cCollateralRead = tokens.daiTokenRead; + cOracleRead = oracles.linkOracleRead; + break; + case "SNX": + cVault = vaults.snxVault; + cVaultRead = vaults.snxVaultRead; + cCollateral = tokens.snxToken; + cCollateralRead = tokens.snxTokenRead; + cOracleRead = oracles.snxOracleRead; + break; + case "UNI": + cVault = vaults.uniVault; + cVaultRead = vaults.uniVaultRead; + cCollateral = tokens.uniToken; + cCollateralRead = tokens.uniTokenRead; + cOracleRead = oracles.uniOracleRead; + break; + case "MATIC": + cVault = vaults.maticVault; + cVaultRead = vaults.maticVaultRead; + cCollateral = tokens.maticToken; + cCollateralRead = tokens.maticTokenRead; + cOracleRead = oracles.maticOracleRead; + break; + case "WBTC": + cVault = vaults.wbtcVault; + cVaultRead = vaults.wbtcVaultRead; + cCollateral = tokens.wbtcToken; + cCollateralRead = tokens.wbtcTokenRead; + cOracleRead = oracles.wbtcOracleRead; + break; + case "USDC": + cVault = hardVaults.usdcVault; + cVaultRead = hardVaults.usdcVaultRead; + cCollateral = tokens.usdcToken; + cCollateralRead = tokens.usdcTokenRead; + cOracleRead = oracles.usdcOracleRead; + break; + default: + if (isHardVault) { + cVault = hardVaults.wethVault; + cVaultRead = hardVaults.wethVaultRead; + } else { + cVault = vaults.wethVault; + cVaultRead = vaults.wethVaultRead; + } + cCollateral = tokens.wethToken; + cCollateralRead = tokens.wethTokenRead; + cOracleRead = oracles.wethOracleRead; + break; + } + + // @ts-ignore + setCurrentAsset(cAsset); + // @ts-ignore + setCurrentCollateral(cCollateral); + // @ts-ignore + setCurrentAssetRead(cAssetRead); + // @ts-ignore + setCurrentCollateralRead(cCollateralRead); + // @ts-ignore + setCurrentVault(cVault); + // @ts-ignore + setCurrentVaultRead(cVaultRead); + // @ts-ignore + setCurrentOracleRead(cOracleRead); + // @ts-ignore + setCurrentAssetOracleRead(cAssetOracleRead); + }; + + useEffect(() => { + const load = async () => { + if ( + signer && + signer.signer && + validVaults(currentNetwork.chainId || NETWORKS.mainnet.chainId, vaults) && + validHardVaults(currentNetwork.chainId || NETWORKS.mainnet.chainId, hardVaults) + ) { + await loadContracts(); + } + }; + load(); + // eslint-disable-next-line + }, [signer.signer, collateralSymbol, isHardVault]); + + return { + currentAsset, + currentCollateral, + currentVault, + currentAssetRead, + currentCollateralRead, + currentVaultRead, + currentCollateralOracleRead: currentOracleRead, + currentAssetOracleRead, + }; +}; diff --git a/src/styles/_colors.scss b/src/styles/_colors.scss index 02fbdf9..9f94a53 100644 --- a/src/styles/_colors.scss +++ b/src/styles/_colors.scss @@ -4,8 +4,9 @@ $neon-highlight: rgba(223, 33, 254, 0.5); $purple: #7940f2; $dark: #494866; $darker: #212138; +$darkest: #281e31; $light: #9795b0; -$lighter: #bebcd4; +$lighter: #d6d5e3; $white: #ffffff; $off-white: #f5f5f5; $pink: #e440f2; diff --git a/src/styles/app.scss b/src/styles/app.scss index ff8bfec..e5bb329 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -24,10 +24,15 @@ h1, h2, h3, h4, -h5 { +h5, +h6 { color: $white; } +h6 { + margin-bottom: 0rem; +} + body { background-color: $primary; } @@ -57,12 +62,31 @@ body { color: $white; font-family: "Nineteen Ninety Seven"; border-width: 1px; + background-color: transparent; } .btn:disabled { color: $dark; } +.btn:hover { + background-color: $darker; +} + +.btn:active, +.btn-primary:active, +.btn-primary:focus, +.btn-primary:not(:disabled):not(.disabled):active +{ + background-color: $darker; + border: none; +} + +.btn-primary:focus, +.btn-primary:not(:disabled):not(.disabled):active:focus { + box-shadow: none; +} + .btn.neon-highlight { border: 1px solid $highlight; box-sizing: border-box; @@ -75,6 +99,10 @@ body { box-shadow: 0px 0px 39px -6px rgba(242, 128, 64, 0.4); border-radius: 2px; } +.btn.neon-pink { + background-color: $pink; +} + .input-group .btn.neon-orange { border: 1px solid $orange; @@ -101,6 +129,69 @@ body { box-shadow: 0px 6px 39px -6px rgba(241, 36, 255, 0.4); } +.dropdown { + border-radius: 5px; + .dropdown-toggle { + display: flex; + background-color: $darkest; + align-items: center; + justify-content: space-between; + height: 2.5rem; + width: 170px; + border: 1px solid #dfd1ea; + padding-right: 0.8rem; + border-radius: 5px; + div { + display: flex; + align-items: center; + flex: 1; + } + + span { + font-size: 1rem; + } + } + .dropdown-toggle:focus { + background-color: $darkest; + border: 1px solid #dfd1ea; + box-shadow: none; + } + .dropdown-toggle:active { + background-color: $darkest; + border: 1px solid #dfd1ea; + box-shadow: none; + } + .dropdown-menu { + background-color: $darkest; + + .dropdown-item { + color: $white; + } + + .dropdown-item.active { + background-color: rgba(121, 64, 242, 0.4); + } + + .dropdown-item:hover { + background-color: rgba(121, 64, 242, 0.3); + } + } +} +.show > .btn-secondary.dropdown-toggle { + background-color: $darkest; + border-color: #dfd1ea; +} +.show>.btn-secondary.dropdown-toggle:active { + background-color: $darkest; + border-color: #dfd1ea; + box-shadow: none; +} +.show>.btn-secondary.dropdown-toggle:focus { + background-color: $darkest; + border-color: #dfd1ea; + box-shadow: none; +} + .number.neon-highlight { text-shadow: 0px 4px 13px $neon-highlight; } @@ -259,6 +350,7 @@ textarea.neon-green:focus { } .wrapper::before { background-image: url("../assets/images/liquid.png"); + // background-color: black; background-repeat: no-repeat; background-size: cover; opacity: 0.3; @@ -375,6 +467,10 @@ form { } } +.btn:active { + background-color: transparent; +} + /* Safari */ @-webkit-keyframes spin { 0% { -webkit-transform: rotate(0deg); } diff --git a/src/styles/mint2.scss b/src/styles/mint2.scss new file mode 100644 index 0000000..c2ba95f --- /dev/null +++ b/src/styles/mint2.scss @@ -0,0 +1,543 @@ +@import "./colors"; +@import "./fonts"; + +.vault2 { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + padding-bottom: 0px; + + .alert-warning { + margin-top: 0rem; + margin-bottom: 0rem; + padding: 0.2rem 1rem; + height: 2rem; + width: 70%; + } + + .btn:active { + background-color: transparent; + } + + .vault-container { + display: flex; + flex-direction: column; + margin-top: 4rem; + width: 30%; + background-color: $darker; + } + + .vault { + + &-header { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + height: 4rem; + padding: 1.5rem 0.8rem; + background-color: $darker; + border-bottom: 0.5px solid $dark; + .header-col1 { + display: flex; + align-items: center; + } + .go-back { + // background-color: transparent; + border: none; + } + svg { + color: white; + } + } + + &-select { + display: flex; + justify-content: space-between; + margin-bottom: 2rem; + } + + &-controls { + background-color: $darker; + margin-bottom: 1rem; + padding: 0rem; + + label { + font-family: "Nineteen Ninety Seven"; + color: $white; + } + + .text-muted { + position: absolute; + text-align: left; + font-size: .85rem; + margin-top: -1.7rem; + padding-left: 1rem; + } + + .input-group { + background-color: #281e31; + border: 1px solid $dark; + border-radius: 5px; + + input[type="number"] { + font-size: 1rem; + padding-bottom: 1.8rem; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + border-color: transparent; + color: $white; + height: 3.7rem; + } + + .btn { + background-color: $darker; + width: 7.5rem; + height: 3.7rem; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + } + } + + .burn-fee.text-muted { + position: relative; + text-align: right; + font-size: 1rem; + margin-top: .5rem; + margin-right: .2rem; + margin-bottom: 0; + padding-bottom: 0; + font-size: .8rem; + color: #f5f5f5 !important; + } + } + + &-actios-container { + display: flex; + flex-direction: column; + margin-top: 1rem; + padding: 2rem; + background-color: $darker; + } + } + + .dd-collateral { + display: flex; + flex-direction: column; + border-radius: 10px; + margin-bottom: 1rem; + + h6 { + color: $white; + margin: 0px; + font-size: 0.9rem; + } + + .balance-container { + display: flex; + align-items: center; + margin: 0rem 1rem; + color: $light; + + .number { + margin-bottom: 0rem; + color: $light; + } + } + + .dropdown { + margin-top: 0.5rem; + + .btn { + margin-top: 0rem; + } + + .dropdown-toggle { + svg { + height: 23px; + margin-right: 5px; + } + .tcap { + width: 30px; + } + } + + .dropdown-toggle:active { + background-color: $darkest; + } + + .dropdown-menu { + width: 85%; + margin-top: 3px !important; + margin-right: 1rem; + } + + .dropdown-item { + display: flex; + align-items: center; + padding: 0.3rem 1.2rem; + svg { + margin-right: 10px; + width: 25px; + } + .eth { + width: 15px; + margin-left: 5px; + margin-right: 15px; + } + .dai { + width: 25px; + } + .usdc { + width: 25px; + } + .wbtc { + width: 25px; + } + } + } + } + + .vault-actions { + margin-top: 2rem; + background-color: $darker; + + .btn-max { + display: flex; + padding: 0.4rem 0.8rem; + border: 1px solid $green; + border-radius: 20px; + background-color: $darkest; + font-size: 0.7rem; + color: $green; + + &.orange { + border: 1px solid $orange; + color: $orange; + } + } + + .actions-options { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.6rem; + + .choices { + display: flex; + flex-direction: row; + } + + .burn-fee { + display: flex; + align-self: end; + margin-right: 0.4rem; + + span { + color: $off-white; + font-size: 0.85rem; + } + + .number { + color: $white; + padding: 0rem 0.3rem; + } + } + } + + .dropdown { + height: 100%; + width: 110px; + margin-right: 0.5rem; + + .dropdown-toggle { + padding-right: 1rem; + border-radius: 20px; + width: 100%; + height: 100%; + + span { + font-family: "space mono"; + font-size: 0.7rem; + } + } + } + } + + .actions-goback { + background-color: transparent; + border: 0px; + padding: 0rem; + padding-left: 0.2rem; + } + + .loading-container { + padding-top: 12.5%; + } + + .icon-container { + display: flex; + flex-direction: row; + // width: 30%; + + .btn-group { + width: fit-content; + border: 1px solid #dfd1ea; + border-radius: 5px; + margin-bottom: 0rem !important; + margin-right: 0.5rem; + + input[type="radio"] { + display: none; + } + + .btn-secondary { + margin-bottom: 0rem; + font-size: 0.7rem; + background-color: #281e31; + } + + .btn-secondary.active { + background-color: $neon-highlight; + } + + .radio-1 { + border-top-left-radius: 0px; + border-bottom-left-radius: 0px; + } + } + + .btn-dark { + margin-top: 0.3rem; + } + } + + .create-vault { + + .btn { + width: 13.4375rem; + height: 3.875rem; + border-radius: 1px; + margin-top: 1rem; + } + } + + .btn-group { + margin: 0.35rem; + background-color: #1d1d3c82; + border: 1px solid #dfd1ea; + border-radius: 5px; + padding-left: 1px; + + .btn-check { + display: none; + } + + .btn-secondary { + margin-bottom: 0rem; + background-color: #281e31; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + } + + .btn-check:checked+.btn { + background-color: $neon-highlight; + } + } + + .vault-assets { + display: flex; + flex-direction: column; + width: 100%; + background-color: transparent; + + svg.tcap { + width: 23px; + height: 23px; + } + + svg.small { + vertical-align: top; + width: 0.6rem; + filter: brightness(1118%) drop-shadow(0px 0px 5px $highlight); + + @supports (-webkit-touch-callout: none) { + height: intrinsic; + } + + &.btc.small { + margin-top: 0px; + width: 1.5rem; + } + + &.dai.small { + margin-top: 0px; + width: 1rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.aave.small { + margin-top: 2px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.link.small { + margin-top: 7px; + width: 1.4rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.uni.small { + margin-top: -5px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.snx.small { + margin-top: -3px; + width: 1.3rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.usdc.small { + margin-top: -5px; + width: 1.3rem; + } + } + + h5 { + font-size: 1rem; + } + + .assets-box-options { + display: flex; + flex-direction: row; + justify-content: space-between; + padding: 0rem 1rem; + } + .vault-form { + padding: 0rem 1rem; + } + .assets-balance { + display: flex; + flex-direction: row; + justify-content: space-between; + padding: 1rem 0.5rem; + border: 0.6px solid $light; + border-radius: 5px; + margin: 1.3rem 0rem; + + .balance { + display: flex; + flex-direction: column; + + &.collateral { + align-items: flex-end; + } + } + + .number { + font-size: 0.9rem; + margin-bottom: 0rem; + margin-left: 0rem; + + &-usd { + font-size: 0.8rem; + } + } + + .amount { + display: flex; + margin-bottom: 0.4rem; + } + } + + .asset-box-container { + display: flex; + flex-direction: row; + justify-content: space-between; + padding-bottom: 2rem; + // border-bottom: 0.5px solid #a540f254; + } + + &-box { + display: flex; + flex-direction: column; + background-color: $darker; + padding: 2rem 1.5rem; + margin-bottom: 1rem; + + h6 { + color: $white; + margin: 0px; + font-size: 0.9rem; + } + + .asset-box { + display: flex; + flex-direction: column; + background-color: $darker; + // border: 0.7px solid $light; + border-radius: 10px; + } + + .asset-box-balance { + display: flex; + justify-content: space-between; + width: 100%; + padding: 0.2rem 0.2rem; + + &-title { + color: $lighter; + font-size: 0.8rem; + } + + &-value { + font-size: 0.75rem; + color: $white; + text-shadow: 0px 4px 13px rgba(223, 33, 254, 0.8); + } + } + } + + .vault-ratio { + display: flex; + align-items: center; + flex-direction: row; + justify-content: space-between; + margin-top: 0.2rem; + border: 0.7px solid $white; + border-radius: 5px; + + h6 { + font-size: 0.9rem; + color: $white; + align-self: center; + margin-bottom: 0rem; + } + .title { + display: flex; + padding: 0.5rem 0.8rem; + width: 40%; + background-color: $darkest; + } + .values { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 0.5rem 0.8rem; + width: 60%; + .number { + font-size: 0.95rem; + margin-bottom: 0rem; + } + .ratio-status { + font-size: 0.95rem; + } + } + } + } + +} diff --git a/src/styles/mintindex.scss b/src/styles/mintindex.scss new file mode 100644 index 0000000..5df93c6 --- /dev/null +++ b/src/styles/mintindex.scss @@ -0,0 +1,546 @@ +@import "./colors"; +@import "./fonts"; + +.vault-index { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + padding-bottom: 0px; + + .alert-warning { + margin-top: 0rem; + margin-bottom: 0rem; + padding: 0.2rem 1rem; + height: 2rem; + width: 70%; + } + + .btn:active { + background-color: transparent; + } + + .vault-container { + display: flex; + flex-direction: column; + margin-top: 4rem; + width: 30%; + background-color: $darker; + } + + .vault { + + &-header { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + height: 4rem; + padding: 1.5rem 0.8rem; + background-color: $darker; + border-bottom: 0.5px solid $dark; + + .header-col1 { + display: flex; + align-items: center; + } + + .go-back { + // background-color: transparent; + border: none; + } + + svg { + color: white; + } + } + + &-select { + display: flex; + justify-content: space-between; + margin-bottom: 2rem; + } + + &-controls { + background-color: $darker; + margin-bottom: 1rem; + padding: 0rem; + + label { + font-family: "Nineteen Ninety Seven"; + color: $white; + } + + .text-muted { + position: absolute; + text-align: left; + font-size: .85rem; + margin-top: -1.7rem; + padding-left: 1rem; + } + + .input-group { + background-color: #281e31; + border: 1px solid $dark; + border-radius: 5px; + + input[type="number"] { + font-size: 1rem; + padding-bottom: 1.8rem; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + border-color: transparent; + color: $white; + height: 3.7rem; + } + + .btn { + background-color: $darker; + width: 7.5rem; + height: 3.7rem; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + } + } + + .burn-fee.text-muted { + position: relative; + text-align: right; + font-size: 1rem; + margin-top: .5rem; + margin-right: .2rem; + margin-bottom: 0; + padding-bottom: 0; + font-size: .8rem; + color: #f5f5f5 !important; + } + } + + &-actios-container { + display: flex; + flex-direction: column; + margin-top: 1rem; + padding: 2rem; + background-color: $darker; + } + } + + .dd-collateral { + display: flex; + flex-direction: column; + border-radius: 10px; + margin-bottom: 1rem; + + h6 { + color: $white; + margin: 0px; + font-size: 0.9rem; + } + + .balance-container { + display: flex; + align-items: center; + margin: 0rem 1rem; + color: $light; + + .number { + margin-bottom: 0rem; + color: $light; + } + } + + .dropdown { + margin-top: 0.5rem; + + .btn { + margin-top: 0rem; + } + + .dropdown-toggle { + svg { + height: 23px; + margin-right: 5px; + } + + .tcap { + width: 30px; + } + } + + .dropdown-toggle:active { + background-color: $darkest; + } + + .dropdown-menu { + width: 85%; + margin-top: 3px !important; + margin-right: 1rem; + } + + .dropdown-item { + display: flex; + align-items: center; + padding: 0.3rem 1.2rem; + + svg { + margin-right: 10px; + width: 25px; + } + + .eth { + width: 15px; + margin-left: 5px; + margin-right: 15px; + } + + .dai { + width: 25px; + } + + .usdc { + width: 25px; + } + + .wbtc { + width: 25px; + } + } + } + } + + .vault-actions { + margin-top: 2rem; + background-color: $darker; + + .btn-max { + display: flex; + padding: 0.4rem 0.8rem; + border: 1px solid $green; + border-radius: 20px; + background-color: $darkest; + font-size: 0.7rem; + color: $green; + + &.orange { + border: 1px solid $orange; + color: $orange; + } + } + + .actions-options { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.6rem; + + .choices { + display: flex; + flex-direction: row; + } + + .burn-fee { + display: flex; + align-self: end; + margin-right: 0.4rem; + + span { + color: $off-white; + font-size: 0.85rem; + } + + .number { + color: $white; + padding: 0rem 0.3rem; + } + } + } + + .dropdown { + height: 100%; + width: 110px; + margin-right: 0.5rem; + + .dropdown-toggle { + padding-right: 1rem; + border-radius: 20px; + width: 100%; + height: 100%; + + span { + font-family: "space mono"; + font-size: 0.7rem; + } + } + } + } + + .actions-goback { + background-color: transparent; + border: 0px; + padding: 0rem; + padding-left: 0.2rem; + } + + .loading-container { + padding-top: 12.5%; + } + + .icon-container { + display: flex; + flex-direction: row; + // width: 30%; + + .btn-group { + width: fit-content; + border: 1px solid #dfd1ea; + border-radius: 5px; + margin-bottom: 0rem !important; + margin-right: 0.5rem; + + input[type="radio"] { + display: none; + } + + .btn-secondary { + margin-bottom: 0rem; + font-size: 0.7rem; + background-color: #281e31; + } + + .btn-secondary.active { + background-color: $neon-highlight; + } + + .radio-1 { + border-top-left-radius: 0px; + border-bottom-left-radius: 0px; + } + } + + .btn-dark { + margin-top: 0.3rem; + } + } + + .create-vault { + + .btn { + width: 13.4375rem; + height: 3.875rem; + border-radius: 1px; + margin-top: 1rem; + } + } + + .btn-group { + margin: 0.35rem; + background-color: #1d1d3c82; + border: 1px solid #dfd1ea; + border-radius: 5px; + padding-left: 1px; + + .btn-check { + display: none; + } + + .btn-secondary { + margin-bottom: 0rem; + background-color: #281e31; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + } + + .btn-check:checked+.btn { + background-color: $neon-highlight; + } + } + + .vault-assets { + display: flex; + flex-direction: column; + width: 100%; + background-color: transparent; + + svg.tcap { + width: 23px; + height: 23px; + } + + svg.small { + vertical-align: top; + width: 0.6rem; + filter: brightness(1118%) drop-shadow(0px 0px 5px $highlight); + + @supports (-webkit-touch-callout: none) { + height: intrinsic; + } + + &.btc.small { + margin-top: 0px; + width: 1.5rem; + } + + &.dai.small { + margin-top: 0px; + width: 1rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.aave.small { + margin-top: 2px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.link.small { + margin-top: 7px; + width: 1.4rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.uni.small { + margin-top: -5px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.snx.small { + margin-top: -3px; + width: 1.3rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.usdc.small { + margin-top: -5px; + width: 1.3rem; + } + } + + h5 { + font-size: 1rem; + } + + .assets-balance { + display: flex; + flex-direction: row; + justify-content: space-between; + padding: 1rem 0.5rem; + border: 0.6px solid $light; + border-radius: 5px; + margin: 1.3rem 0rem; + + .balance { + display: flex; + flex-direction: column; + + &.collateral { + align-items: flex-end; + } + } + + .number { + font-size: 0.9rem; + margin-bottom: 0rem; + margin-left: 0rem; + + &-usd { + font-size: 0.8rem; + } + } + + .amount { + display: flex; + margin-bottom: 0.4rem; + } + } + + .asset-box-container { + display: flex; + flex-direction: row; + justify-content: space-between; + padding-bottom: 2rem; + // border-bottom: 0.5px solid #a540f254; + } + + &-box { + display: flex; + flex-direction: column; + background-color: $darker; + padding: 2rem 1.5rem; + margin-bottom: 1rem; + + h6 { + color: $white; + margin: 0px; + font-size: 0.9rem; + } + + .asset-box { + display: flex; + flex-direction: column; + background-color: $darker; + // border: 0.7px solid $light; + border-radius: 10px; + } + + .asset-box-balance { + display: flex; + justify-content: space-between; + width: 100%; + padding: 0.2rem 0.2rem; + + &-title { + color: $lighter; + font-size: 0.8rem; + } + + &-value { + font-size: 0.75rem; + color: $white; + text-shadow: 0px 4px 13px rgba(223, 33, 254, 0.8); + } + } + } + + .vault-ratio { + display: flex; + align-items: center; + flex-direction: row; + justify-content: space-between; + margin-top: 0.2rem; + border: 0.7px solid $white; + border-radius: 5px; + + h6 { + font-size: 0.9rem; + color: $white; + align-self: center; + margin-bottom: 0rem; + } + + .title { + display: flex; + padding: 0.5rem 0.8rem; + width: 40%; + background-color: $darkest; + } + + .values { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 0.5rem 0.8rem; + width: 60%; + + .number { + font-size: 0.95rem; + margin-bottom: 0rem; + } + + .ratio-status { + font-size: 0.95rem; + } + } + } + } +} diff --git a/src/styles/modal.scss b/src/styles/modal.scss index be6989b..d0304ce 100644 --- a/src/styles/modal.scss +++ b/src/styles/modal.scss @@ -41,7 +41,7 @@ margin-bottom: 0.5rem; } - .close { + .btn-close { margin-top: -2rem; margin-right: -1rem; color: $white; diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index e29a47d..7488219 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -3,7 +3,11 @@ .vault-monitoring { padding: 1rem 3rem; - + + .btn:active { + background-color: transparent; + } + .row { display: block; margin-top: 2rem; @@ -203,6 +207,9 @@ margin-top: 0px; padding: 0.3rem 0.6rem; } + .btn:active { + background-color: transparent; + } thead { th { text-align: center; From e93ac4bf2faf176b057be70e08760ac72f45b5d5 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 28 Nov 2022 10:05:35 -0600 Subject: [PATCH 182/278] added wbtc on vault list --- src/components/Vault/Monitoring/index.tsx | 3 +- yarn.lock | 1420 +++++++++++---------- 2 files changed, 768 insertions(+), 655 deletions(-) diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index d3bf622..6214e4c 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -674,7 +674,7 @@ export const Monitoring = () => { if (!showAllVaults) { addVault = v.tokenSymbol === "WETH" || v.tokenSymbol === "DAI"; } - if (addVault && v.tokenSymbol !== "WBTC") { + if (addVault) { let vaultUrl = ""; const symbol = v.tokenSymbol === "WETH" ? "ETH" : v.tokenSymbol; if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { @@ -773,6 +773,7 @@ export const Monitoring = () => { symbols.push({ key: "aave", name: "AAVE" }); symbols.push({ key: "link", name: "LINK" }); symbols.push({ key: "usdc", name: "USDC" }); + symbols.push({ key: "wbtc", name: "WBTC" }); } } else if (isOptimism(currentNetwork.chainId)) { symbols.push({ key: "eth", name: "ETH" }); diff --git a/yarn.lock b/yarn.lock index 6ec8ac2..321a82a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,9 +16,9 @@ "@jridgewell/trace-mapping" "^0.3.9" "@apollo/client@^3.2.5": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.0.tgz#1c26a04488f45b3a4779fa2562e4b706402cb876" - integrity sha512-hp4OvrH1ZIQACRYcIrh/C0WFnY7IM7G6nlTpC8DSTEWxfZQ2kvpvDY0I/hYmCs0oAVrg26g3ANEdOzGWTcYbPg== + version "3.7.1" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.1.tgz#86ce47c18a0714e229231148b0306562550c2248" + integrity sha512-xu5M/l7p9gT9Fx7nF3AQivp0XukjB7TM7tOd5wifIpI8RskYveL4I+rpTijzWrnqCPZabkbzJKH7WEAKdctt9w== dependencies: "@graphql-typed-document-node/core" "^3.1.1" "@wry/context" "^0.7.0" @@ -55,10 +55,10 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.3.tgz#707b939793f867f5a73b2666e6d9a3396eb03151" - integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" + integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== "@babel/core@7.12.3": version "7.12.3" @@ -83,32 +83,32 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.5", "@babel/core@^7.8.4", "@babel/core@^7.9.0": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" - integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" + integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.3" + "@babel/generator" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.5" + "@babel/parser" "^7.20.5" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.3.tgz#d7f4d1300485b4547cb6f94b27d10d237b42bf59" - integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ== +"@babel/generator@^7.12.1", "@babel/generator@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" + integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== dependencies: - "@babel/types" "^7.19.3" + "@babel/types" "^7.20.5" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -127,36 +127,36 @@ "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.0", "@babel/helper-compilation-targets@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" - integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== +"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== dependencies: - "@babel/compat-data" "^7.19.3" + "@babel/compat-data" "^7.20.0" "@babel/helper-validator-option" "^7.18.6" browserslist "^4.21.3" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz#bfd6904620df4e46470bae4850d66be1054c404b" - integrity sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.2", "@babel/helper-create-class-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz#327154eedfb12e977baa4ecc72e5806720a85a06" + integrity sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-member-expression-to-functions" "^7.18.9" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz#7976aca61c0984202baca73d84e2337a5424a41b" - integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" + regexpu-core "^5.2.1" "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" @@ -211,19 +211,19 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -232,10 +232,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" - integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== "@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" @@ -247,7 +247,7 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9", "@babel/helper-replace-supers@^7.19.1": +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== @@ -258,19 +258,19 @@ "@babel/traverse" "^7.19.1" "@babel/types" "^7.19.0" -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== +"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" - integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.20.0" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" @@ -279,10 +279,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" @@ -295,23 +295,23 @@ integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== "@babel/helper-wrap-function@^7.18.9": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" - integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: "@babel/helper-function-name" "^7.19.0" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" -"@babel/helpers@^7.12.1", "@babel/helpers@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" - integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== +"@babel/helpers@^7.12.1", "@babel/helpers@^7.20.5": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" + integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== dependencies: "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" @@ -322,10 +322,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.3", "@babel/parser@^7.7.0": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.3.tgz#8dd36d17c53ff347f9e55c328710321b49479a9a" - integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5", "@babel/parser@^7.7.0": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" + integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -343,10 +343,10 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-proposal-optional-chaining" "^7.18.9" -"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz#34f6f5174b688529342288cd264f80c9ea9fb4a7" - integrity sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q== +"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" + integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-plugin-utils" "^7.19.0" @@ -371,12 +371,12 @@ "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.19.3.tgz#c1977e4902a18cdf9051bf7bf08d97db2fd8b110" - integrity sha512-MbgXtNXqo7RTKYIXVchVJGPvaVufQH3pxvQyfbGvNw1DObIhph+PesYXJTcd8J4DdWibvf6Z2eanOyItX8WnJg== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.5.tgz#28ba1a0e5044664a512967a19407d7fc26925394" + integrity sha512-Lac7PpRJXcC3s9cKsBfl+uc+DYXU5FD06BrTFunQO6QIQT+DwyzDPURAowI3bcvD1dZF/ank1Z5rstUJn3Hn4Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/plugin-syntax-decorators" "^7.19.0" @@ -429,16 +429,16 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" - integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== +"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" + integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-parameters" "^7.20.1" "@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" @@ -466,13 +466,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" - integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" + integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": @@ -539,12 +539,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-syntax-import-assertions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" - integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -623,12 +623,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== +"@babel/plugin-syntax-typescript@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.18.6": version "7.18.6" @@ -653,25 +653,25 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" - integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== +"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz#401215f9dc13dc5262940e2e527c9536b3d7f237" + integrity sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz#0e61ec257fba409c41372175e7c1e606dc79bb20" - integrity sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A== +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" + integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.19.0" + "@babel/helper-compilation-targets" "^7.20.0" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" @@ -682,12 +682,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.18.13": - version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz#9e03bc4a94475d62b7f4114938e6c5c33372cbf5" - integrity sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow== +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" + integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" @@ -750,35 +750,32 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21" - integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== +"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" + integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" - integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== +"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" + integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-simple-access" "^7.19.4" -"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz#5f20b471284430f02d9c5059d9b9a16d4b085a1f" - integrity sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A== +"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz#59e2a84064b5736a4471b1aa7b13d4431d327e0d" + integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== dependencies: "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.19.0" + "@babel/helper-module-transforms" "^7.19.6" "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-validator-identifier" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.18.6": version "7.18.6" @@ -789,12 +786,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz#ec7455bab6cd8fb05c525a94876f435a48128888" - integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" @@ -811,12 +808,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" - integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz#f8f9186c681d10c3de7620c916156d893c8a019e" + integrity sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" @@ -826,11 +823,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-constant-elements@^7.9.0": - version "7.18.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz#edf3bec47eb98f14e84fa0af137fcc6aad8e0443" - integrity sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" + integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6": version "7.18.6" @@ -866,12 +863,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" - integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" "@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" @@ -881,9 +878,9 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-runtime@^7.16.4", "@babel/plugin-transform-runtime@^7.5.5": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.1.tgz#a3df2d7312eea624c7889a2dcd37fd1dfd25b2c6" - integrity sha512-2nJjTUFIzBMP/f/miLxEK9vxwW/KUXsdvN4sR//TmuDhe6yU2h57WmIOE12Gng3MDP/xpjUV/ToZRdcf8Yj4fA== + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" + integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== dependencies: "@babel/helper-module-imports" "^7.18.6" "@babel/helper-plugin-utils" "^7.19.0" @@ -929,13 +926,13 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.18.6": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz#4f1db1e0fe278b42ddbc19ec2f6cd2f8262e35d6" - integrity sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" + integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== dependencies: - "@babel/helper-create-class-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-typescript" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" "@babel/plugin-transform-unicode-escapes@^7.12.1", "@babel/plugin-transform-unicode-escapes@^7.18.10": version "7.18.10" @@ -1025,17 +1022,17 @@ semver "^5.5.0" "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.8.4", "@babel/preset-env@^7.9.5": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.19.3.tgz#52cd19abaecb3f176a4ff9cc5e15b7bf06bec754" - integrity sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== dependencies: - "@babel/compat-data" "^7.19.3" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-option" "^7.18.6" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.19.1" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" "@babel/plugin-proposal-class-properties" "^7.18.6" "@babel/plugin-proposal-class-static-block" "^7.18.6" "@babel/plugin-proposal-dynamic-import" "^7.18.6" @@ -1044,7 +1041,7 @@ "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.18.9" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" "@babel/plugin-proposal-optional-chaining" "^7.18.9" "@babel/plugin-proposal-private-methods" "^7.18.6" @@ -1055,7 +1052,7 @@ "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.18.6" + "@babel/plugin-syntax-import-assertions" "^7.20.0" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -1068,10 +1065,10 @@ "@babel/plugin-transform-arrow-functions" "^7.18.6" "@babel/plugin-transform-async-to-generator" "^7.18.6" "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.18.9" - "@babel/plugin-transform-classes" "^7.19.0" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.18.13" + "@babel/plugin-transform-destructuring" "^7.20.2" "@babel/plugin-transform-dotall-regex" "^7.18.6" "@babel/plugin-transform-duplicate-keys" "^7.18.9" "@babel/plugin-transform-exponentiation-operator" "^7.18.6" @@ -1079,14 +1076,14 @@ "@babel/plugin-transform-function-name" "^7.18.9" "@babel/plugin-transform-literals" "^7.18.9" "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.18.6" - "@babel/plugin-transform-modules-commonjs" "^7.18.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.0" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" "@babel/plugin-transform-modules-umd" "^7.18.6" "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" "@babel/plugin-transform-new-target" "^7.18.6" "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-parameters" "^7.20.1" "@babel/plugin-transform-property-literals" "^7.18.6" "@babel/plugin-transform-regenerator" "^7.18.6" "@babel/plugin-transform-reserved-words" "^7.18.6" @@ -1098,7 +1095,7 @@ "@babel/plugin-transform-unicode-escapes" "^7.18.10" "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.19.3" + "@babel/types" "^7.20.2" babel-plugin-polyfill-corejs2 "^0.3.3" babel-plugin-polyfill-corejs3 "^0.6.0" babel-plugin-polyfill-regenerator "^0.4.1" @@ -1138,19 +1135,19 @@ "@babel/plugin-transform-typescript" "^7.18.6" "@babel/runtime-corejs3@^7.10.2": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz#f0cbbe7edda7c4109cd253bb1dee99aba4594ad9" - integrity sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz#63dae945963539ab0ad578efbf3eff271e7067ae" + integrity sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ== dependencies: core-js-pure "^3.25.1" - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.11" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" - integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.9", "@babel/runtime@^7.19.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" + integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.11" "@babel/template@^7.10.4", "@babel/template@^7.18.10", "@babel/template@^7.3.3": version "7.18.10" @@ -1161,28 +1158,28 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.3.tgz#3a3c5348d4988ba60884e8494b0592b2f15a04b4" - integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" + integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" + "@babel/generator" "^7.20.5" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/parser" "^7.20.5" + "@babel/types" "^7.20.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624" - integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" + integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== dependencies: - "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" @@ -1484,10 +1481,10 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.1", "@ethersproject/providers@^5": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.1.tgz#b0799b616d5579cd1067a8ebf1fc1ec74c1e122c" - integrity sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ== +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" "@ethersproject/abstract-signer" "^5.7.0" @@ -1763,12 +1760,12 @@ "@types/node" "*" jest-mock "^26.6.2" -"@jest/expect-utils@^29.1.2": - version "29.1.2" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.1.2.tgz#66dbb514d38f7d21456bc774419c9ae5cca3f88d" - integrity sha512-4a48bhKfGj/KAH39u0ppzNTABXQ8QPccWAFUFobWBaEMSMp+sB31Z2fK/l47c4a/Mu1po2ffmfAIPxXbVTXdtg== +"@jest/expect-utils@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" + integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== dependencies: - jest-get-type "^29.0.0" + jest-get-type "^29.2.0" "@jest/fake-timers@^26.6.2": version "26.6.2" @@ -1892,10 +1889,10 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@jest/types@^29.1.2": - version "29.1.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.1.2.tgz#7442d32b16bcd7592d9614173078b8c334ec730a" - integrity sha512-DcXGtoTykQB5jiwCmVr8H4vdg2OJhQex3qPkG+ISyDO7xQXbt/4R6dowcRyPemRnkH7JoHvZuxPBdlq+9JxFCg== +"@jest/types@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" + integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== dependencies: "@jest/schemas" "^29.0.0" "@types/istanbul-lib-coverage" "^2.0.0" @@ -1921,7 +1918,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -1939,18 +1936,18 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@^0.3.9": - version "0.3.15" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" - integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" "@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": version "2.0.0" @@ -2095,14 +2092,14 @@ picomatch "^2.2.2" "@sinclair/typebox@^0.24.1": - version "0.24.44" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.44.tgz#0a0aa3bf4a155a678418527342a3ee84bd8caa5c" - integrity sha512-ka0W0KN5i6LfrSocduwliMMpqVgohtPFidKdMEOUjoOFCHcOOYkKsPRxfs5f15oPNHTm6ERAm0GV/+/LTKeiWg== + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== "@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + version "1.8.5" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.5.tgz#e280c94c95f206dcfd5aca00a43f2156b758c764" + integrity sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA== dependencies: type-detect "4.0.8" @@ -2274,17 +2271,17 @@ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@typeform/embed-react@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@typeform/embed-react/-/embed-react-2.1.0.tgz#a99a4ddbec0d0259635a0a14d513fe2c975ff94f" - integrity sha512-usjuo7gVbf/GdcAUxfVV5f0/VbSikdJaw2wYkSSaWQFVrgFewZ3yowhjSuJCTcOsOKwAb2IrTB+kHvNHNrJMlQ== + version "2.5.0" + resolved "https://registry.yarnpkg.com/@typeform/embed-react/-/embed-react-2.5.0.tgz#35203f6e3574041754a51c635c2515b591c57085" + integrity sha512-lLcLz4lI3spVgsvXRB2thumbEiSQQQyN9EkEioxDHSaKZEqvVr3c1JwVqpvV3gZh/ikWIze95l8dHiQWsEyGPw== dependencies: - "@typeform/embed" "2.0.1" + "@typeform/embed" "2.3.1" fast-deep-equal "^3.1.3" -"@typeform/embed@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@typeform/embed/-/embed-2.0.1.tgz#073f238ac3b05369a5d72f55e7bfc85db66887af" - integrity sha512-FeYgDtUAhFrCD7L7iAO65jzLUoPVXRbNjsXe7YQLgLinGpLeVXuwuOuzYagrVl3IQ3Ykmi4sA2LZr29LaMTA7w== +"@typeform/embed@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@typeform/embed/-/embed-2.3.1.tgz#848cc06d391d89640cd2a27d8ef577f18b89dedb" + integrity sha512-TVAPkaSrJzV/4NUwmfi78hG7s+cXy9SbGt3BaLucWoY91ZUR3uYvSqWWEq/40GURTY1O9DDvconIkGKLXSMdSQ== "@types/aria-query@^4.2.0": version "4.2.2" @@ -2292,9 +2289,9 @@ integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + version "7.1.20" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" + integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2406,9 +2403,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@*": - version "29.1.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.1.1.tgz#cf21a0835a1ba9a30ea1966019f1261c6a114c92" - integrity sha512-U9Ey07dGWl6fUFaIaUQUKWG5NoKi/zizeVQCGV8s4nSU0jPgqphVZvS64+8BtWYvrc3ZGw6wo943NSYPxkrp/g== + version "29.2.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.3.tgz#f5fd88e43e5a9e4221ca361e23790d48fcf0a211" + integrity sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2442,14 +2439,14 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": - version "18.8.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.8.2.tgz#17d42c6322d917764dd3d2d3a10d7884925de067" - integrity sha512-cRMwIgdDN43GO4xMWAfJAecYn8wV4JbsOGHNfNUIDiuYkUYAR5ec4Rj7IO2SAhFPEfpPtLtUTbbny/TCT7aDwA== + version "18.11.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" + integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== "@types/node@^14.14.2": - version "14.18.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.31.tgz#4b873dea3122e71af4f77e65ec5841397ff254d3" - integrity sha512-vQAnaReSQkEDa8uwAyQby8bYGKu84R/deEc6mg5T8fX6gzCn8QW6rziSgsti1fNvsrswKUKPnVTi7uoB+u62Mw== + version "14.18.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.33.tgz#8c29a0036771569662e4635790ffa9e057db379b" + integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2491,9 +2488,9 @@ "@types/react" "*" "@types/react-dom@^16.9.8": - version "16.9.16" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.16.tgz#c591f2ed1c6f32e9759dfa6eb4abfd8041f29e39" - integrity sha512-Oqc0RY4fggGA3ltEgyPLc3IV9T73IGoWjkONbsyJ3ZBn+UPPCYpU2ec0i3cEbJuEdZtkqcCF2l1zf2pBdgUGSg== + version "16.9.17" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.17.tgz#29100cbcc422d7b7dba7de24bb906de56680dd34" + integrity sha512-qSRyxEsrm5btPXnowDOs5jSkgT8ldAA0j6Qp+otHUh+xHzy3sXmgNfyhucZjAjkgpdAUw9rJe0QRtX/l+yaS4g== dependencies: "@types/react" "^16" @@ -2522,18 +2519,18 @@ "@types/react" "*" "@types/react@*", "@types/react@>=16.14.8", "@types/react@>=16.9.11": - version "18.0.21" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.21.tgz#b8209e9626bb00a34c76f55482697edd2b43cc67" - integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA== + version "18.0.25" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.25.tgz#8b1dcd7e56fe7315535a4af25435e0bb55c8ae44" + integrity sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/react@^16", "@types/react@^16.9.53": - version "16.14.32" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.32.tgz#d4e4fe5ece3c27fcb4608b1f4a614f7dec881392" - integrity sha512-hvEy4vGVADbtj/U6+CA5SRC5QFIjdxD7JslAie8EuAYZwhYY9bgforpXNyF1VFzhnkEOesDy1278t1wdjN74cw== + version "16.14.34" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.34.tgz#d129324ffda312044e1c47aab18696e4ed493282" + integrity sha512-b99nWeGGReLh6aKBppghVqp93dFJtgtDOzc8NXM6hewD8PQ2zZG5kBLgbx+VJr7Q7WBMjHxaIl3dwpwwPIUgyA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2581,9 +2578,9 @@ "@types/jest" "*" "@types/uglify-js@*": - version "3.17.0" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.0.tgz#95271e7abe0bf7094c60284f76ee43232aef43b9" - integrity sha512-3HO6rm0y+/cqvOyA8xcYLweF0TKXlAxmQASjbOi49Co51A1N4nR4bEwBgRoD9kNM+rqFGArjKr654SLp2CoGmQ== + version "3.17.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.1.tgz#e0ffcef756476410e5bce2cb01384ed878a195b5" + integrity sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g== dependencies: source-map "^0.6.1" @@ -2602,9 +2599,9 @@ source-map "^0.7.3" "@types/webpack@^4.41.8": - version "4.41.32" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212" - integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg== + version "4.41.33" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.33.tgz#16164845a5be6a306bcbe554a8e67f9cac215ffc" + integrity sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g== dependencies: "@types/node" "*" "@types/tapable" "^1" @@ -2626,9 +2623,9 @@ "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" - integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + version "17.0.14" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.14.tgz#0943473052c24bd8cf2d1de25f1a710259327237" + integrity sha512-9Pj7abXoW1RSTcZaL2Hk6G2XyLMlp5ECdVC/Zf2p/KBjC3srijLGgRAXOBjtFrJoIrvxdTKyKDA14bEcbxBaWw== dependencies: "@types/yargs-parser" "*" @@ -2770,28 +2767,32 @@ "@walletconnect/utils" "^1.8.0" "@walletconnect/crypto@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.2.tgz#3fcc2b2cde6f529a19eadd883dc555cd0e861992" - integrity sha512-+OlNtwieUqVcOpFTvLBvH+9J9pntEqH5evpINHfVxff1XIgwV55PpbdvkHu6r9Ib4WQDOFiD8OeeXs1vHw7xKQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.3.tgz#7b8dd4d7e2884fe3543c7c07aea425eef5ef9dd4" + integrity sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g== dependencies: - "@walletconnect/encoding" "^1.0.1" - "@walletconnect/environment" "^1.0.0" - "@walletconnect/randombytes" "^1.0.2" + "@walletconnect/encoding" "^1.0.2" + "@walletconnect/environment" "^1.0.1" + "@walletconnect/randombytes" "^1.0.3" aes-js "^3.1.2" hash.js "^1.1.7" + tslib "1.14.1" -"@walletconnect/encoding@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.1.tgz#93c18ce9478c3d5283dbb88c41eb2864b575269a" - integrity sha512-8opL2rs6N6E3tJfsqwS82aZQDL3gmupWUgmvuZ3CGU7z/InZs3R9jkzH8wmYtpbq0sFK3WkJkQRZFFk4BkrmFA== +"@walletconnect/encoding@^1.0.1", "@walletconnect/encoding@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.2.tgz#cb3942ad038d6a6bf01158f66773062dd25724da" + integrity sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag== dependencies: is-typedarray "1.0.0" + tslib "1.14.1" typedarray-to-buffer "3.1.5" -"@walletconnect/environment@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034" - integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ== +"@walletconnect/environment@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7" + integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== + dependencies: + tslib "1.14.1" "@walletconnect/http-connection@^1.8.0": version "1.8.0" @@ -2812,20 +2813,22 @@ "@walletconnect/types" "^1.8.0" "@walletconnect/utils" "^1.8.0" -"@walletconnect/jsonrpc-types@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.1.tgz#a96b4bb2bcc8838a70e06f15c1b5ab11c47d8e95" - integrity sha512-+6coTtOuChCqM+AoYyi4Q83p9l/laI6NvuM2/AHaZFuf0gT0NjW7IX2+86qGyizn7Ptq4AYZmfxurAxTnhefuw== +"@walletconnect/jsonrpc-types@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.2.tgz#b79519f679cd6a5fa4a1bea888f27c1916689a20" + integrity sha512-CZe8tjJX73OWdHjrBHy7HtAapJ2tT0Q3TYhPBhRxi3643lwPIQWC9En45ldY14TZwgSewkbZ0FtGBZK0G7Bbyg== dependencies: keyvaluestorage-interface "^1.0.0" + tslib "1.14.1" "@walletconnect/jsonrpc-utils@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.3.tgz#5bd49865eef0eae48e8b45a06731dc18691cf8c7" - integrity sha512-3yb49bPk16MNLk6uIIHPSHQCpD6UAo1OMOx1rM8cW/MPEAYAzrSW5hkhG7NEUwX9SokRIgnZK3QuQkiyNzBMhQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.4.tgz#2009ba3907b02516f2caacd2fb871ff0d472b2cb" + integrity sha512-y0+tDxcTZ9BHBBKBJbjZxLUXb+zQZCylf7y/jTvDPNx76J0hYYc+F9zHzyqBLeorSKepLTk6yI8hw3NXbAQB3g== dependencies: - "@walletconnect/environment" "^1.0.0" - "@walletconnect/jsonrpc-types" "^1.0.1" + "@walletconnect/environment" "^1.0.1" + "@walletconnect/jsonrpc-types" "^1.0.2" + tslib "1.14.1" "@walletconnect/mobile-registry@^1.4.0": version "1.4.0" @@ -2844,14 +2847,15 @@ preact "10.4.1" qrcode "1.4.4" -"@walletconnect/randombytes@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.2.tgz#95c644251a15e6675f58fbffc9513a01486da49c" - integrity sha512-ivgOtAyqQnN0rLQmOFPemsgYGysd/ooLfaDA/ACQ3cyqlca56t3rZc7pXfqJOIETx/wSyoF5XbwL+BqYodw27A== +"@walletconnect/randombytes@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.3.tgz#e795e4918367fd1e6a2215e075e64ab93e23985b" + integrity sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw== dependencies: - "@walletconnect/encoding" "^1.0.1" - "@walletconnect/environment" "^1.0.0" + "@walletconnect/encoding" "^1.0.2" + "@walletconnect/environment" "^1.0.1" randombytes "^2.1.0" + tslib "1.14.1" "@walletconnect/safe-json@1.0.0": version "1.0.0" @@ -2897,11 +2901,18 @@ "@walletconnect/utils" "^1.8.0" web3-provider-engine "16.0.1" -"@walletconnect/window-getters@1.0.0", "@walletconnect/window-getters@^1.0.0": +"@walletconnect/window-getters@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== +"@walletconnect/window-getters@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" + integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== + dependencies: + tslib "1.14.1" + "@walletconnect/window-metadata@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" @@ -3054,13 +3065,6 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" -"@wry/context@^0.6.0": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.1.tgz#c3c29c0ad622adb00f6a53303c4f965ee06ebeb2" - integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== - dependencies: - tslib "^2.3.0" - "@wry/context@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.0.tgz#be88e22c0ddf62aeb0ae9f95c3d90932c619a5c8" @@ -3153,9 +3157,9 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.5.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== address@1.1.2: version "1.1.2" @@ -3221,9 +3225,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + version "8.11.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" + integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -3310,9 +3314,9 @@ anymatch@^2.0.0: normalize-path "^2.1.1" anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -3351,9 +3355,11 @@ aria-query@^4.2.2: "@babel/runtime-corejs3" "^7.10.2" aria-query@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.2.tgz#0b8a744295271861e1d933f8feca13f9b70cfdc1" - integrity sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q== + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" arity-n@^1.0.4: version "1.0.4" @@ -3395,15 +3401,15 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.4, array-includes@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== +array-includes@^3.1.4, array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" is-string "^1.0.7" array-union@^1.0.1: @@ -3429,36 +3435,47 @@ array-unique@^0.3.2: integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== array.prototype.flat@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" - integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.reduce@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" - integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3618,6 +3635,11 @@ autoprefixer@^9.6.1: postcss "^7.0.32" postcss-value-parser "^4.1.0" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -3629,9 +3651,9 @@ aws4@^1.8.0: integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axe-core@^4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" - integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== + version "4.5.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.5.2.tgz#823fdf491ff717ac3c58a52631d4206930c1d9f7" + integrity sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA== axios@^0.18.0: version "0.18.1" @@ -3865,13 +3887,6 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - babel-plugin-istanbul@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -4507,10 +4522,10 @@ bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" content-type "~1.0.4" @@ -4520,7 +4535,7 @@ body-parser@1.20.0: http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.10.3" + qs "6.11.0" raw-body "2.5.1" type-is "~1.6.18" unpipe "1.0.0" @@ -4931,9 +4946,9 @@ camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== camelize@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" - integrity sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== caniuse-api@^3.0.0: version "3.0.0" @@ -4946,9 +4961,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001400: - version "1.0.30001416" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001416.tgz#29692af8a6a11412f2d3cf9a59d588fcdd21ce4c" - integrity sha512-06wzzdAkCPZO+Qm4e/eNghZBDfVNDsCgw33T27OwBH9unE9S478OYw//Q2L7Npf/zBzs7rjZOszIFQkwQKAEqA== + version "1.0.30001434" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz#ec1ec1cfb0a93a34a0600d37903853030520a4e5" + integrity sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA== capture-exit@^2.0.0: version "2.0.0" @@ -5009,9 +5024,9 @@ char-regex@^1.0.2: integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== check-types@^11.1.1: - version "11.1.2" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" - integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== + version "11.2.2" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.2.tgz#7afc0b6a860d686885062f2dba888ba5710335b4" + integrity sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA== checkpoint-store@^1.1.0: version "1.1.0" @@ -5075,9 +5090,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.4.0.tgz#b28484fd436cbc267900364f096c9dc185efb251" - integrity sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug== + version "3.7.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" + integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -5360,11 +5375,9 @@ convert-source-map@^0.3.3: integrity sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg== convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== cookie-signature@1.0.6: version "1.0.6" @@ -5399,23 +5412,23 @@ copy-descriptor@^0.1.0: integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== copy-to-clipboard@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz#5b263ec2366224b100181dded7ce0579b340c107" - integrity sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg== + version "3.3.3" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== dependencies: toggle-selection "^1.0.6" core-js-compat@^3.25.1, core-js-compat@^3.6.2: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.25.5.tgz#0016e8158c904f7b059486639e6e82116eafa7d9" - integrity sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA== + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" + integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== dependencies: browserslist "^4.21.4" core-js-pure@^3.25.1: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.5.tgz#79716ba54240c6aa9ceba6eee08cf79471ba184d" - integrity sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg== + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.1.tgz#653f4d7130c427820dcecd3168b594e8bb095a33" + integrity sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ== core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" @@ -5423,9 +5436,9 @@ core-js@^2.4.0, core-js@^2.5.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.6.5: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.25.5.tgz#e86f651a2ca8a0237a5f064c2fe56cef89646e27" - integrity sha512-nbm6eZSjm+ZuBQxCUPQKQCoUEfFOXjUZ8dTTyikyKaWrTYmAVbykQfwsKE5dBK88u3QCkCrzsx/PPlKfhsvgpw== + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e" + integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA== core-util-is@1.0.2: version "1.0.2" @@ -5448,9 +5461,9 @@ cosmiconfig@^5.0.0: parse-json "^4.0.0" cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -5875,9 +5888,9 @@ debug@^3.2.5, debug@^3.2.7: ms "^2.1.1" decamelize-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -5888,9 +5901,9 @@ decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.2.1: - version "10.4.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.1.tgz#be75eeac4a2281aace80c1a8753587c27ef053e7" - integrity sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw== + version "10.4.2" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.2.tgz#0341651d1d997d86065a2ce3a441fbd0d8e8b98e" + integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== decode-uri-component@^0.2.0: version "0.2.0" @@ -5921,6 +5934,27 @@ deep-equal@^1.0.1, deep-equal@~1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" +deep-equal@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.1.0.tgz#5ba60402cf44ab92c2c07f3f3312c3d857a0e1dd" + integrity sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.8" + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -5977,9 +6011,9 @@ define-property@^2.0.2: isobject "^3.0.1" defined@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== del@^4.1.1: version "4.1.1" @@ -6072,10 +6106,10 @@ diff-sequences@^26.6.2: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== -diff-sequences@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f" - integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA== +diff-sequences@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" + integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== diff@^4.0.1: version "4.0.2" @@ -6300,9 +6334,9 @@ ejs@^2.6.1: integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.251: - version "1.4.273" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.273.tgz#2a0276553172874617665807a40bea95711c2b9f" - integrity sha512-iEx72lv4P85PJ8HA9KEAss4o6ESK+hcxzM1cksZDo0H8KekaI+cloQyxOCASmHQO9ogmGyEELtBzxqqdeNwIgQ== + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== elliptic@6.5.2: version "6.5.2" @@ -6426,10 +6460,10 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: - version "1.20.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.3.tgz#90b143ff7aedc8b3d189bcfac7f1e3e3f81e9da1" - integrity sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw== +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.20.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -6441,7 +6475,7 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19 has-property-descriptors "^1.0.0" has-symbols "^1.0.3" internal-slot "^1.0.3" - is-callable "^1.2.6" + is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" @@ -6461,6 +6495,20 @@ es-array-method-boxes-properly@^1.0.0: resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-get-iterator@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -6673,24 +6721,25 @@ eslint-plugin-react-hooks@^4.2.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.21.5: - version "7.31.8" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz#3a4f80c10be1bcbc8197be9e8b641b2a3ef219bf" - integrity sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw== + version "7.31.11" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" + integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== dependencies: - array-includes "^3.1.5" - array.prototype.flatmap "^1.3.0" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.1" - object.values "^1.1.5" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" prop-types "^15.8.1" resolve "^2.0.0-next.3" semver "^6.3.0" - string.prototype.matchall "^4.0.7" + string.prototype.matchall "^4.0.8" eslint-plugin-testing-library@^3.9.2: version "3.10.2" @@ -7350,9 +7399,9 @@ ethers@4.0.47: xmlhttprequest "1.8.0" ethers@^5.0.0, ethers@^5.5.2: - version "5.7.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.1.tgz#48c83a44900b5f006eb2f65d3ba6277047fd4f33" - integrity sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q== + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" "@ethersproject/abstract-provider" "5.7.0" @@ -7372,7 +7421,7 @@ ethers@^5.0.0, ethers@^5.5.2: "@ethersproject/networks" "5.7.1" "@ethersproject/pbkdf2" "5.7.0" "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.1" + "@ethersproject/providers" "5.7.2" "@ethersproject/random" "5.7.0" "@ethersproject/rlp" "5.7.0" "@ethersproject/sha2" "5.7.0" @@ -7493,24 +7542,24 @@ expect@^26.6.0, expect@^26.6.2: jest-regex-util "^26.0.0" expect@^29.0.0: - version "29.1.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.1.2.tgz#82f8f28d7d408c7c68da3a386a490ee683e1eced" - integrity sha512-AuAGn1uxva5YBbBlXb+2JPxJRuemZsmlGcapPXWNSBNsQtAULfjioREGBWuI0EOvYUKjDnrCy8PW5Zlr1md5mw== + version "29.3.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" + integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== dependencies: - "@jest/expect-utils" "^29.1.2" - jest-get-type "^29.0.0" - jest-matcher-utils "^29.1.2" - jest-message-util "^29.1.2" - jest-util "^29.1.2" + "@jest/expect-utils" "^29.3.1" + jest-get-type "^29.2.0" + jest-matcher-utils "^29.3.1" + jest-message-util "^29.3.1" + jest-util "^29.3.1" express@^4.17.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.0" + body-parser "1.20.1" content-disposition "0.5.4" content-type "~1.0.4" cookie "0.5.0" @@ -7529,7 +7578,7 @@ express@^4.17.1: parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.10.3" + qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.18.0" @@ -7836,7 +7885,7 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== -for-each@~0.3.3: +for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== @@ -8182,9 +8231,9 @@ globals@^12.1.0: type-fest "^0.8.1" globals@^13.6.0, globals@^13.9.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + version "13.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" + integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== dependencies: type-fest "^0.20.2" @@ -8237,6 +8286,13 @@ globule@^1.0.0: lodash "^4.17.21" minimatch "~3.0.2" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -8634,23 +8690,23 @@ human-signals@^1.1.1: integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== i18next-browser-languagedetector@^6.1.3: - version "6.1.5" - resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-6.1.5.tgz#ed8c9319a8d246995d8ec8fccb5bf5f4248d0fb1" - integrity sha512-11t7b39oKeZe4uyMxLSPnfw28BCPNLZgUk7zyufex0zKXZ+Bv+JnmJgoB+IfQLZwDt1d71PM8vwBX1NCgliY3g== + version "6.1.8" + resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-6.1.8.tgz#8e9c61b32a4dfe9b959b38bc9d2a8b95f799b27c" + integrity sha512-Svm+MduCElO0Meqpj1kJAriTC6OhI41VhlT/A0UPjGoPZBhAHIaGE5EfsHlTpgdH09UVX7rcc72pSDDBeKSQQA== dependencies: - "@babel/runtime" "^7.18.9" + "@babel/runtime" "^7.19.0" i18next-http-backend@^1.3.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/i18next-http-backend/-/i18next-http-backend-1.4.4.tgz#9f372f704975a5e96ce74e4247698bcbd00d148f" - integrity sha512-M4gLPe6JKZ2p1UmE6t4rzWV/sAxgrLThW7ztXAsTpFwFqXoyzhTzX8eYxVv9KjpCQh4K9nwxnEjEi+74C4Thbg== + version "1.4.5" + resolved "https://registry.yarnpkg.com/i18next-http-backend/-/i18next-http-backend-1.4.5.tgz#4803eb071eb6ffb147c36bdd42ba6f64b3198ac2" + integrity sha512-tLuHWuLWl6CmS07o+UB6EcQCaUjrZ1yhdseIN7sfq0u7phsMePJ8pqlGhIAdRDPF/q7ooyo5MID5DRFBCH+x5w== dependencies: cross-fetch "3.1.5" i18next@^21.6.6: - version "21.9.2" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-21.9.2.tgz#3f7c5594393eb27117c1db4c38f5ec766e68de0e" - integrity sha512-00fVrLQOwy45nm3OtC9l1WiLK3nJlIYSljgCt0qzTaAy65aciMdRy9GsuW+a2AtKtdg9/njUGfRH30LRupV7ZQ== + version "21.10.0" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-21.10.0.tgz#85429af55fdca4858345d0e16b584ec29520197d" + integrity sha512-YeuIBmFsGjUfO3qBmMOc0rQaun4mIpGKET5WDwvu8lU7gvwpcariZLNtL0Fzj+zazcHUrlXHiptcFhBMFaxzfg== dependencies: "@babel/runtime" "^7.17.2" @@ -8698,9 +8754,9 @@ ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + version "5.2.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" + integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== immediate@^3.2.3: version "3.3.0" @@ -8891,7 +8947,7 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arguments@^1.0.4: +is-arguments@^1.0.4, is-arguments@^1.1.0, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -8958,7 +9014,7 @@ is-buffer@^2.0.2: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.6: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -8983,9 +9039,9 @@ is-color-stop@^1.0.0: rgba-regex "^1.0.0" is-core-module@^2.0.0, is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" @@ -9003,7 +9059,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -9111,6 +9167,11 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -9209,6 +9270,11 @@ is-root@2.1.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -9240,6 +9306,17 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typedarray@1.0.0, is-typedarray@^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" @@ -9250,6 +9327,11 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -9257,6 +9339,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -9284,7 +9374,7 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== -isarray@^2.0.1: +isarray@^2.0.1, isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== @@ -9452,15 +9542,15 @@ jest-diff@^26.0.0, jest-diff@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-diff@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.1.2.tgz#bb7aaf5353227d6f4f96c5e7e8713ce576a607dc" - integrity sha512-4GQts0aUopVvecIT4IwD/7xsBaMhKTYoM4/njE/aVw9wpw+pIUVp8Vab/KnSzSilr84GnLBkaP3JLDnQYCKqVQ== +jest-diff@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" + integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== dependencies: chalk "^4.0.0" - diff-sequences "^29.0.0" - jest-get-type "^29.0.0" - pretty-format "^29.1.2" + diff-sequences "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" jest-docblock@^26.0.0: version "26.0.0" @@ -9510,10 +9600,10 @@ jest-get-type@^26.3.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== -jest-get-type@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.0.0.tgz#843f6c50a1b778f7325df1129a0fd7aa713aef80" - integrity sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw== +jest-get-type@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" + integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== jest-haste-map@^26.6.2: version "26.6.2" @@ -9578,15 +9668,15 @@ jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-matcher-utils@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.1.2.tgz#e68c4bcc0266e70aa1a5c13fb7b8cd4695e318a1" - integrity sha512-MV5XrD3qYSW2zZSHRRceFzqJ39B2z11Qv0KPyZYxnzDHFeYZGJlgGi0SW+IXSJfOewgJp/Km/7lpcFT+cgZypw== +jest-matcher-utils@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" + integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== dependencies: chalk "^4.0.0" - jest-diff "^29.1.2" - jest-get-type "^29.0.0" - pretty-format "^29.1.2" + jest-diff "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" jest-message-util@^26.6.0, jest-message-util@^26.6.2: version "26.6.2" @@ -9603,18 +9693,18 @@ jest-message-util@^26.6.0, jest-message-util@^26.6.2: slash "^3.0.0" stack-utils "^2.0.2" -jest-message-util@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.1.2.tgz#c21a33c25f9dc1ebfcd0f921d89438847a09a501" - integrity sha512-9oJ2Os+Qh6IlxLpmvshVbGUiSkZVc2FK+uGOm6tghafnB2RyjKAxMZhtxThRMxfX1J1SOMhTn9oK3/MutRWQJQ== +jest-message-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" + integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.1.2" + "@jest/types" "^29.3.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.1.2" + pretty-format "^29.3.1" slash "^3.0.0" stack-utils "^2.0.3" @@ -9627,9 +9717,9 @@ jest-mock@^26.6.2: "@types/node" "*" jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^26.0.0: version "26.0.0" @@ -9774,12 +9864,12 @@ jest-util@^26.6.0, jest-util@^26.6.2: is-ci "^2.0.0" micromatch "^4.0.2" -jest-util@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.1.2.tgz#ac5798e93cb6a6703084e194cfa0898d66126df1" - integrity sha512-vPCk9F353i0Ymx3WQq3+a4lZ07NXu9Ca8wya6o4Fe4/aO1e1awMMprZ3woPFpKwghEOW+UXgd15vVotuNN9ONQ== +jest-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" + integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== dependencies: - "@jest/types" "^29.1.2" + "@jest/types" "^29.3.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -10021,11 +10111,11 @@ json-stable-stringify-without-jsonify@^1.0.1: integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" + integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== dependencies: - jsonify "~0.0.0" + jsonify "^0.0.1" json-stringify-safe@~5.0.1: version "5.0.1" @@ -10070,10 +10160,10 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA== +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== jsprim@^1.2.2: version "1.4.2" @@ -10306,18 +10396,18 @@ loader-utils@2.0.0: json5 "^2.1.2" loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^1.0.1" loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" @@ -10397,9 +10487,9 @@ lodash.uniq@^4.5.0: integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loglevel@^1.6.8: - version "1.8.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" - integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== + version "1.8.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" + integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" @@ -10778,9 +10868,9 @@ minimist-options@^3.0.1: is-plain-obj "^1.1.0" minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6, minimist@~1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== minipass-collect@^1.0.2: version "1.0.2" @@ -10804,9 +10894,9 @@ minipass-pipeline@^1.2.2: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: - version "3.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" - integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" @@ -10911,9 +11001,9 @@ multimatch@^4.0.0: minimatch "^3.0.4" nan@^2.12.1, nan@^2.13.2, nan@^2.14.0, nan@^2.2.1: - version "2.16.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" - integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== nanoid@^3.3.4: version "3.3.4" @@ -11245,7 +11335,7 @@ object-inspect@^1.12.2, object-inspect@^1.9.0, object-inspect@~1.12.2: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-is@^1.0.1: +object-is@^1.0.1, object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -11270,7 +11360,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -11280,41 +11370,41 @@ object.assign@^4.1.0, object.assign@^4.1.2, object.assign@^4.1.3, object.assign@ has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.0, object.entries@^1.1.2, object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== +object.entries@^1.1.0, object.entries@^1.1.2, object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.4" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" - integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== + version "2.1.5" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" + integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== dependencies: - array.prototype.reduce "^1.0.4" + array.prototype.reduce "^1.0.5" call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.20.1" + es-abstract "^1.20.4" -object.hasown@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" - integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== dependencies: define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" object.pick@^1.3.0: version "1.3.0" @@ -11323,14 +11413,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== +object.values@^1.1.0, object.values@^1.1.5, object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -11379,11 +11469,11 @@ opn@^5.5.0: is-wsl "^1.1.0" optimism@^0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" - integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== + version "0.16.2" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.2.tgz#519b0c78b3b30954baed0defe5143de7776bf081" + integrity sha512-zWNbgWj+3vLEjZNIh/okkY2EUfX+vB9TJopzIZwT1xxaMqC5hRLLraePod4c5n4He08xuXNH+zhKFFCu390wiQ== dependencies: - "@wry/context" "^0.6.0" + "@wry/context" "^0.7.0" "@wry/trie" "^0.3.0" optimize-css-assets-webpack-plugin@5.0.4: @@ -12428,9 +12518,9 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: uniq "^1.0.1" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + version "6.0.11" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -12490,9 +12580,9 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po source-map "^0.6.1" postcss@^8.1.0: - version "8.4.17" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.17.tgz#f87863ec7cd353f81f7ab2dec5d67d861bbb1be5" - integrity sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q== + version "8.4.19" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" + integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" @@ -12504,9 +12594,9 @@ preact@10.4.1: integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== preact@^10.5.9: - version "10.11.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.1.tgz#35fdad092de8b2ad29df3a0bef9af1f4fdd2256b" - integrity sha512-1Wz5PCRm6Fg+6BTXWJHhX4wRK9MZbZBHuwBqfZlOdVm2NqPe8/rjYpufvYCwJSGb9layyzB2jTTXfpCTynLqFQ== + version "10.11.3" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19" + integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== precond@0.2: version "0.2.3" @@ -12536,9 +12626,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.1.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + version "2.8.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" + integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== pretty-bytes@^5.3.0: version "5.6.0" @@ -12563,10 +12653,10 @@ pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.1.2.tgz#b1f6b75be7d699be1a051f5da36e8ae9e76a8e6a" - integrity sha512-CGJ6VVGXVRP2o2Dorl4mAwwvDWT25luIsYhkyVQW32E4nL+TgW939J7LlKT/npq5Cpq6j3s+sy+13yk7xYpBmg== +pretty-format@^29.0.0, pretty-format@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" + integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== dependencies: "@jest/schemas" "^29.0.0" ansi-styles "^5.0.0" @@ -12618,9 +12708,9 @@ promise-to-callback@^1.0.0: set-immediate-shim "^1.0.1" promise@^8.1.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.2.0.tgz#a1f6280ab67457fbfc8aad2b198c9497e9e5c806" - integrity sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg== + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" @@ -12750,10 +12840,10 @@ qrcode@1.4.4: pngjs "^3.3.0" yargs "^13.2.4" -qs@6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" @@ -12965,9 +13055,9 @@ react-i18next@^11.15.3: html-parse-stringify "^3.0.1" react-icons@^4.3.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.4.0.tgz#a13a8a20c254854e1ec9aecef28a95cdf24ef703" - integrity sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg== + version "4.6.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.6.0.tgz#f83eda179af5d02c047449a20b702c858653d397" + integrity sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g== react-is@^16.13.1, react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" @@ -13308,10 +13398,10 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.7: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regenerator-transform@^0.10.0: version "0.10.1" @@ -13322,10 +13412,10 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" -regenerator-transform@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" - integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" @@ -13342,7 +13432,7 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== @@ -13365,17 +13455,17 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.1.tgz#a69c26f324c1e962e9ffd0b88b055caba8089139" - integrity sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ== +regexpu-core@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" + integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" regjsgen@^0.2.0: version "0.2.0" @@ -13798,9 +13888,9 @@ sass-loader@8.0.2: semver "^6.3.0" sass-loader@^10.0.4: - version "10.3.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.3.1.tgz#a45f0d1dd7ea90de7eb099239a18c83dea6e6341" - integrity sha512-y2aBdtYkbqorVavkC3fcJIUDGIegzDWPn3/LAFhsf3G+MzPKTJx37sROf5pXtUeggSVbNbmfj8TgRaSLMelXRA== + version "10.4.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.4.1.tgz#bea4e173ddf512c9d7f53e9ec686186146807cbf" + integrity sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ== dependencies: klona "^2.0.4" loader-utils "^2.0.0" @@ -13809,9 +13899,9 @@ sass-loader@^10.0.4: semver "^7.3.2" sass@^1.27.0: - version "1.55.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.55.0.tgz#0c4d3c293cfe8f8a2e8d3b666e1cf1bff8065d1c" - integrity sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A== + version "1.56.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.1.tgz#94d3910cd468fd075fa87f5bb17437a0b617d8a7" + integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -14407,9 +14497,9 @@ stable@^0.1.8: integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^2.0.2, stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" @@ -14538,46 +14628,46 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.matchall@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" - integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" has-symbols "^1.0.3" internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" + regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" string.prototype.trim@~1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz#824960787db37a9e24711802ed0c1d1c0254f83e" - integrity sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ== + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -14825,9 +14915,9 @@ table@^5.2.3: string-width "^3.0.0" table@^6.0.9: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -14871,9 +14961,9 @@ tar@^2.0.0: inherits "2" tar@^6.0.2: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + version "6.1.12" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.12.tgz#3b742fb05669b55671fb769ab67a7791ea1a62e6" + integrity sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -14944,9 +15034,9 @@ terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.3.4: - version "5.15.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.1.tgz#8561af6e0fd6d839669c73b92bdd5777d870ed6c" - integrity sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw== + version "5.16.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.0.tgz#29362c6f5506e71545c73b069ccd199bb28f7f54" + integrity sha512-KjTV81QKStSfwbNiwlBXfcgMcOloyuRdb62/iLFPGBcVNF4EXjhdYBhYHmbJpiBrVxZhDvltE11j+LBQUxEEJg== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -15181,15 +15271,15 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@1.14.1, tslib@^1.10.0, tslib@^1.8.1, 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== tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" @@ -15342,10 +15432,10 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" @@ -15768,9 +15858,9 @@ web3-utils@1.2.1: utf8 "3.0.0" web3-utils@^1.3.4: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.0.tgz#0a506f8c6af9a2ad6ba79689892662769534fc03" - integrity sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ== + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.1.tgz#f2f7ca7eb65e6feb9f3d61056d0de6bbd57125ff" + integrity sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ== dependencies: bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" @@ -15781,9 +15871,9 @@ web3-utils@^1.3.4: utf8 "3.0.0" web3modal@^1.9.5: - version "1.9.9" - resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.9.tgz#1a09771e1b9264842ab98d42c620568f470ff96b" - integrity sha512-ML1C4xH+JTSHHkKbjxuF+f5B3cDUOCnrdQZ8Mlzippq7zRKHf3NBeuIvDdNjtVclJ2S4zYYVmVqRWrgB11ej8A== + version "1.9.10" + resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.10.tgz#ab7836ff27c6a16b9ca881ba0e8008bd33cb0dff" + integrity sha512-gRByp+toRiADwkJLLGRXsnIVbLS1aJB71sJyryS6C7cF6jJ3cRN1LbPYEMObMyJkyjOZonx0CNZVAYGiD099aA== dependencies: detect-browser "^5.1.0" prop-types "^15.7.2" @@ -15983,11 +16073,33 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== +which-typed-array@^1.1.8: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" From 2628b301cd79807fee24a29828ae304ec354ab0c Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 28 Nov 2022 11:01:21 -0600 Subject: [PATCH 183/278] updated --- yarn.lock | 1445 ++++++++++++++++++++++++++++------------------------- 1 file changed, 768 insertions(+), 677 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5445ca8..4be69f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,10 +15,10 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@apollo/client@^3.2.5": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.0.tgz#1c26a04488f45b3a4779fa2562e4b706402cb876" - integrity sha512-hp4OvrH1ZIQACRYcIrh/C0WFnY7IM7G6nlTpC8DSTEWxfZQ2kvpvDY0I/hYmCs0oAVrg26g3ANEdOzGWTcYbPg== +"@apollo/client@^3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.1.tgz#86ce47c18a0714e229231148b0306562550c2248" + integrity sha512-xu5M/l7p9gT9Fx7nF3AQivp0XukjB7TM7tOd5wifIpI8RskYveL4I+rpTijzWrnqCPZabkbzJKH7WEAKdctt9w== dependencies: "@graphql-typed-document-node/core" "^3.1.1" "@wry/context" "^0.7.0" @@ -55,10 +55,10 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.3.tgz#707b939793f867f5a73b2666e6d9a3396eb03151" - integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" + integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== "@babel/core@7.12.3": version "7.12.3" @@ -83,32 +83,32 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.5", "@babel/core@^7.8.4", "@babel/core@^7.9.0": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" - integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" + integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.3" + "@babel/generator" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.5" + "@babel/parser" "^7.20.5" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.3.tgz#d7f4d1300485b4547cb6f94b27d10d237b42bf59" - integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ== +"@babel/generator@^7.12.1", "@babel/generator@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" + integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== dependencies: - "@babel/types" "^7.19.3" + "@babel/types" "^7.20.5" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -127,36 +127,36 @@ "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.0", "@babel/helper-compilation-targets@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" - integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== +"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== dependencies: - "@babel/compat-data" "^7.19.3" + "@babel/compat-data" "^7.20.0" "@babel/helper-validator-option" "^7.18.6" browserslist "^4.21.3" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz#bfd6904620df4e46470bae4850d66be1054c404b" - integrity sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.2", "@babel/helper-create-class-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz#327154eedfb12e977baa4ecc72e5806720a85a06" + integrity sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-member-expression-to-functions" "^7.18.9" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz#7976aca61c0984202baca73d84e2337a5424a41b" - integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" + regexpu-core "^5.2.1" "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" @@ -211,19 +211,19 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -232,10 +232,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" - integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== "@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" @@ -247,7 +247,7 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9", "@babel/helper-replace-supers@^7.19.1": +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== @@ -258,19 +258,19 @@ "@babel/traverse" "^7.19.1" "@babel/types" "^7.19.0" -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== +"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" - integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.20.0" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" @@ -279,10 +279,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" @@ -295,23 +295,23 @@ integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== "@babel/helper-wrap-function@^7.18.9": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" - integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: "@babel/helper-function-name" "^7.19.0" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" -"@babel/helpers@^7.12.1", "@babel/helpers@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" - integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== +"@babel/helpers@^7.12.1", "@babel/helpers@^7.20.5": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" + integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== dependencies: "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" @@ -322,10 +322,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.3", "@babel/parser@^7.7.0": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.3.tgz#8dd36d17c53ff347f9e55c328710321b49479a9a" - integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5", "@babel/parser@^7.7.0": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" + integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -343,10 +343,10 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-proposal-optional-chaining" "^7.18.9" -"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz#34f6f5174b688529342288cd264f80c9ea9fb4a7" - integrity sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q== +"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" + integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-plugin-utils" "^7.19.0" @@ -371,12 +371,12 @@ "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.19.3.tgz#c1977e4902a18cdf9051bf7bf08d97db2fd8b110" - integrity sha512-MbgXtNXqo7RTKYIXVchVJGPvaVufQH3pxvQyfbGvNw1DObIhph+PesYXJTcd8J4DdWibvf6Z2eanOyItX8WnJg== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.5.tgz#28ba1a0e5044664a512967a19407d7fc26925394" + integrity sha512-Lac7PpRJXcC3s9cKsBfl+uc+DYXU5FD06BrTFunQO6QIQT+DwyzDPURAowI3bcvD1dZF/ank1Z5rstUJn3Hn4Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/plugin-syntax-decorators" "^7.19.0" @@ -429,16 +429,16 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" - integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== +"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" + integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-parameters" "^7.20.1" "@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" @@ -466,13 +466,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" - integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" + integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": @@ -539,12 +539,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-syntax-import-assertions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" - integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -623,12 +623,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== +"@babel/plugin-syntax-typescript@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.18.6": version "7.18.6" @@ -653,25 +653,25 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" - integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== +"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz#401215f9dc13dc5262940e2e527c9536b3d7f237" + integrity sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz#0e61ec257fba409c41372175e7c1e606dc79bb20" - integrity sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A== +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" + integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.19.0" + "@babel/helper-compilation-targets" "^7.20.0" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" @@ -682,12 +682,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.18.13": - version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz#9e03bc4a94475d62b7f4114938e6c5c33372cbf5" - integrity sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow== +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" + integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" @@ -750,35 +750,32 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21" - integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== +"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" + integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" - integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== +"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" + integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-simple-access" "^7.19.4" -"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz#5f20b471284430f02d9c5059d9b9a16d4b085a1f" - integrity sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A== +"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz#59e2a84064b5736a4471b1aa7b13d4431d327e0d" + integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== dependencies: "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.19.0" + "@babel/helper-module-transforms" "^7.19.6" "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-validator-identifier" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.18.6": version "7.18.6" @@ -789,12 +786,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz#ec7455bab6cd8fb05c525a94876f435a48128888" - integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" @@ -811,12 +808,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" - integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz#f8f9186c681d10c3de7620c916156d893c8a019e" + integrity sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" @@ -826,11 +823,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-constant-elements@^7.9.0": - version "7.18.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz#edf3bec47eb98f14e84fa0af137fcc6aad8e0443" - integrity sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" + integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6": version "7.18.6" @@ -866,12 +863,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" - integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" "@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" @@ -881,9 +878,9 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-runtime@^7.16.4", "@babel/plugin-transform-runtime@^7.5.5": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.1.tgz#a3df2d7312eea624c7889a2dcd37fd1dfd25b2c6" - integrity sha512-2nJjTUFIzBMP/f/miLxEK9vxwW/KUXsdvN4sR//TmuDhe6yU2h57WmIOE12Gng3MDP/xpjUV/ToZRdcf8Yj4fA== + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" + integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== dependencies: "@babel/helper-module-imports" "^7.18.6" "@babel/helper-plugin-utils" "^7.19.0" @@ -929,13 +926,13 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.18.6": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz#4f1db1e0fe278b42ddbc19ec2f6cd2f8262e35d6" - integrity sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" + integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== dependencies: - "@babel/helper-create-class-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-typescript" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" "@babel/plugin-transform-unicode-escapes@^7.12.1", "@babel/plugin-transform-unicode-escapes@^7.18.10": version "7.18.10" @@ -1025,17 +1022,17 @@ semver "^5.5.0" "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.8.4", "@babel/preset-env@^7.9.5": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.19.3.tgz#52cd19abaecb3f176a4ff9cc5e15b7bf06bec754" - integrity sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== dependencies: - "@babel/compat-data" "^7.19.3" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-option" "^7.18.6" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.19.1" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" "@babel/plugin-proposal-class-properties" "^7.18.6" "@babel/plugin-proposal-class-static-block" "^7.18.6" "@babel/plugin-proposal-dynamic-import" "^7.18.6" @@ -1044,7 +1041,7 @@ "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.18.9" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" "@babel/plugin-proposal-optional-chaining" "^7.18.9" "@babel/plugin-proposal-private-methods" "^7.18.6" @@ -1055,7 +1052,7 @@ "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.18.6" + "@babel/plugin-syntax-import-assertions" "^7.20.0" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -1068,10 +1065,10 @@ "@babel/plugin-transform-arrow-functions" "^7.18.6" "@babel/plugin-transform-async-to-generator" "^7.18.6" "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.18.9" - "@babel/plugin-transform-classes" "^7.19.0" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.18.13" + "@babel/plugin-transform-destructuring" "^7.20.2" "@babel/plugin-transform-dotall-regex" "^7.18.6" "@babel/plugin-transform-duplicate-keys" "^7.18.9" "@babel/plugin-transform-exponentiation-operator" "^7.18.6" @@ -1079,14 +1076,14 @@ "@babel/plugin-transform-function-name" "^7.18.9" "@babel/plugin-transform-literals" "^7.18.9" "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.18.6" - "@babel/plugin-transform-modules-commonjs" "^7.18.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.0" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" "@babel/plugin-transform-modules-umd" "^7.18.6" "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" "@babel/plugin-transform-new-target" "^7.18.6" "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-parameters" "^7.20.1" "@babel/plugin-transform-property-literals" "^7.18.6" "@babel/plugin-transform-regenerator" "^7.18.6" "@babel/plugin-transform-reserved-words" "^7.18.6" @@ -1098,7 +1095,7 @@ "@babel/plugin-transform-unicode-escapes" "^7.18.10" "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.19.3" + "@babel/types" "^7.20.2" babel-plugin-polyfill-corejs2 "^0.3.3" babel-plugin-polyfill-corejs3 "^0.6.0" babel-plugin-polyfill-regenerator "^0.4.1" @@ -1138,26 +1135,19 @@ "@babel/plugin-transform-typescript" "^7.18.6" "@babel/runtime-corejs3@^7.10.2": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz#f0cbbe7edda7c4109cd253bb1dee99aba4594ad9" - integrity sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz#63dae945963539ab0ad578efbf3eff271e7067ae" + integrity sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ== dependencies: core-js-pure "^3.25.1" - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" - integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== - dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.11" -"@babel/runtime@^7.18.3", "@babel/runtime@^7.6.2": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" - integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.19.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" + integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== dependencies: - regenerator-runtime "^0.13.10" + regenerator-runtime "^0.13.11" "@babel/template@^7.10.4", "@babel/template@^7.18.10", "@babel/template@^7.3.3": version "7.18.10" @@ -1168,28 +1158,28 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.3.tgz#3a3c5348d4988ba60884e8494b0592b2f15a04b4" - integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" + integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" + "@babel/generator" "^7.20.5" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/parser" "^7.20.5" + "@babel/types" "^7.20.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624" - integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" + integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== dependencies: - "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" @@ -1491,10 +1481,10 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.1", "@ethersproject/providers@^5": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.1.tgz#b0799b616d5579cd1067a8ebf1fc1ec74c1e122c" - integrity sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ== +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" "@ethersproject/abstract-signer" "^5.7.0" @@ -1770,12 +1760,12 @@ "@types/node" "*" jest-mock "^26.6.2" -"@jest/expect-utils@^29.1.2": - version "29.1.2" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.1.2.tgz#66dbb514d38f7d21456bc774419c9ae5cca3f88d" - integrity sha512-4a48bhKfGj/KAH39u0ppzNTABXQ8QPccWAFUFobWBaEMSMp+sB31Z2fK/l47c4a/Mu1po2ffmfAIPxXbVTXdtg== +"@jest/expect-utils@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" + integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== dependencies: - jest-get-type "^29.0.0" + jest-get-type "^29.2.0" "@jest/fake-timers@^26.6.2": version "26.6.2" @@ -1899,10 +1889,10 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@jest/types@^29.1.2": - version "29.1.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.1.2.tgz#7442d32b16bcd7592d9614173078b8c334ec730a" - integrity sha512-DcXGtoTykQB5jiwCmVr8H4vdg2OJhQex3qPkG+ISyDO7xQXbt/4R6dowcRyPemRnkH7JoHvZuxPBdlq+9JxFCg== +"@jest/types@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" + integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== dependencies: "@jest/schemas" "^29.0.0" "@types/istanbul-lib-coverage" "^2.0.0" @@ -1928,7 +1918,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -1946,18 +1936,18 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@^0.3.9": - version "0.3.15" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" - integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" "@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": version "2.0.0" @@ -2057,9 +2047,9 @@ pocket-js-core "0.0.3" "@react-aria/ssr@^3.2.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.3.0.tgz#25e81daf0c7a270a4a891159d8d984578e4512d8" - integrity sha512-yNqUDuOVZIUGP81R87BJVi/ZUZp/nYOBXbPsRe7oltJOfErQZD+UezMpw4vM2KRz18cURffvmC8tJ6JTeyDtaQ== + version "3.4.0" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.4.0.tgz#a2b9a170214f56e41d3c4c933d0d8fcffa07a12a" + integrity sha512-qzuGk14/fUyUAoW/EBwgFcuMkVNXJVGlezTgZ1HovpCZ+p9844E7MUFHE7CuzFzPEIkVeqhBNIoIu+VJJ8YCOA== dependencies: "@babel/runtime" "^7.6.2" @@ -2075,10 +2065,10 @@ dependencies: dequal "^2.0.2" -"@restart/ui@^1.3.1": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.4.0.tgz#8333294fefb045f58852d5bb34367c3323e2edb3" - integrity sha512-5dDj5uDzUgK1iijWPRg6AnxjkHM04XhTQDJirM1h/8tIc7KyLtF9YyjcCpNEn259hPMXswpkfXKNgiag0skPFg== +"@restart/ui@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.4.1.tgz#c9057915f0708c411824eeb16c03d0108c0208d2" + integrity sha512-J7wFOx2DcmkBqCqiZgDsggLO7faiNh4Nv1/v80FmbRgP+MYpwaVDKKXLC69DA4+ejgNIsBP5ORtC74EZqO1j8A== dependencies: "@babel/runtime" "^7.18.3" "@popperjs/core" "^2.11.5" @@ -2119,14 +2109,14 @@ picomatch "^2.2.2" "@sinclair/typebox@^0.24.1": - version "0.24.44" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.44.tgz#0a0aa3bf4a155a678418527342a3ee84bd8caa5c" - integrity sha512-ka0W0KN5i6LfrSocduwliMMpqVgohtPFidKdMEOUjoOFCHcOOYkKsPRxfs5f15oPNHTm6ERAm0GV/+/LTKeiWg== + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== "@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + version "1.8.5" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.5.tgz#e280c94c95f206dcfd5aca00a43f2156b758c764" + integrity sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA== dependencies: type-detect "4.0.8" @@ -2303,9 +2293,9 @@ integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + version "7.1.20" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" + integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2412,9 +2402,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@*": - version "29.1.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.1.1.tgz#cf21a0835a1ba9a30ea1966019f1261c6a114c92" - integrity sha512-U9Ey07dGWl6fUFaIaUQUKWG5NoKi/zizeVQCGV8s4nSU0jPgqphVZvS64+8BtWYvrc3ZGw6wo943NSYPxkrp/g== + version "29.2.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.3.tgz#f5fd88e43e5a9e4221ca361e23790d48fcf0a211" + integrity sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2448,14 +2438,14 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": - version "18.8.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.8.2.tgz#17d42c6322d917764dd3d2d3a10d7884925de067" - integrity sha512-cRMwIgdDN43GO4xMWAfJAecYn8wV4JbsOGHNfNUIDiuYkUYAR5ec4Rj7IO2SAhFPEfpPtLtUTbbny/TCT7aDwA== + version "18.11.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" + integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== "@types/node@^14.14.2": - version "14.18.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.31.tgz#4b873dea3122e71af4f77e65ec5841397ff254d3" - integrity sha512-vQAnaReSQkEDa8uwAyQby8bYGKu84R/deEc6mg5T8fX6gzCn8QW6rziSgsti1fNvsrswKUKPnVTi7uoB+u62Mw== + version "14.18.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.33.tgz#8c29a0036771569662e4635790ffa9e057db379b" + integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2497,9 +2487,9 @@ "@types/react" "*" "@types/react-dom@^18.0.8": - version "18.0.8" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.8.tgz#d2606d855186cd42cc1b11e63a71c39525441685" - integrity sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw== + version "18.0.9" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.9.tgz#ffee5e4bfc2a2f8774b15496474f8e7fe8d0b504" + integrity sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg== dependencies: "@types/react" "*" @@ -2527,19 +2517,10 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@>=16.9.11": - version "18.0.21" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.21.tgz#b8209e9626bb00a34c76f55482697edd2b43cc67" - integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^18.0.24": - version "18.0.24" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.24.tgz#2f79ed5b27f08d05107aab45c17919754cc44c20" - integrity sha512-wRJWT6ouziGUy+9uX0aW4YOJxAY0bG6/AOk5AW5QSvZqI7dk6VBIbXvcVgIw/W5Jrl24f77df98GEKTJGOLx7Q== +"@types/react@*", "@types/react@>=16.9.11", "@types/react@^18.0.24": + version "18.0.25" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.25.tgz#8b1dcd7e56fe7315535a4af25435e0bb55c8ae44" + integrity sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2587,9 +2568,9 @@ "@types/jest" "*" "@types/uglify-js@*": - version "3.17.0" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.0.tgz#95271e7abe0bf7094c60284f76ee43232aef43b9" - integrity sha512-3HO6rm0y+/cqvOyA8xcYLweF0TKXlAxmQASjbOi49Co51A1N4nR4bEwBgRoD9kNM+rqFGArjKr654SLp2CoGmQ== + version "3.17.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.1.tgz#e0ffcef756476410e5bce2cb01384ed878a195b5" + integrity sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g== dependencies: source-map "^0.6.1" @@ -2608,9 +2589,9 @@ source-map "^0.7.3" "@types/webpack@^4.41.8": - version "4.41.32" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212" - integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg== + version "4.41.33" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.33.tgz#16164845a5be6a306bcbe554a8e67f9cac215ffc" + integrity sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g== dependencies: "@types/node" "*" "@types/tapable" "^1" @@ -2632,9 +2613,9 @@ "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" - integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + version "17.0.14" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.14.tgz#0943473052c24bd8cf2d1de25f1a710259327237" + integrity sha512-9Pj7abXoW1RSTcZaL2Hk6G2XyLMlp5ECdVC/Zf2p/KBjC3srijLGgRAXOBjtFrJoIrvxdTKyKDA14bEcbxBaWw== dependencies: "@types/yargs-parser" "*" @@ -2776,28 +2757,32 @@ "@walletconnect/utils" "^1.8.0" "@walletconnect/crypto@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.2.tgz#3fcc2b2cde6f529a19eadd883dc555cd0e861992" - integrity sha512-+OlNtwieUqVcOpFTvLBvH+9J9pntEqH5evpINHfVxff1XIgwV55PpbdvkHu6r9Ib4WQDOFiD8OeeXs1vHw7xKQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.3.tgz#7b8dd4d7e2884fe3543c7c07aea425eef5ef9dd4" + integrity sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g== dependencies: - "@walletconnect/encoding" "^1.0.1" - "@walletconnect/environment" "^1.0.0" - "@walletconnect/randombytes" "^1.0.2" + "@walletconnect/encoding" "^1.0.2" + "@walletconnect/environment" "^1.0.1" + "@walletconnect/randombytes" "^1.0.3" aes-js "^3.1.2" hash.js "^1.1.7" + tslib "1.14.1" -"@walletconnect/encoding@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.1.tgz#93c18ce9478c3d5283dbb88c41eb2864b575269a" - integrity sha512-8opL2rs6N6E3tJfsqwS82aZQDL3gmupWUgmvuZ3CGU7z/InZs3R9jkzH8wmYtpbq0sFK3WkJkQRZFFk4BkrmFA== +"@walletconnect/encoding@^1.0.1", "@walletconnect/encoding@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.2.tgz#cb3942ad038d6a6bf01158f66773062dd25724da" + integrity sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag== dependencies: is-typedarray "1.0.0" + tslib "1.14.1" typedarray-to-buffer "3.1.5" -"@walletconnect/environment@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034" - integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ== +"@walletconnect/environment@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7" + integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== + dependencies: + tslib "1.14.1" "@walletconnect/http-connection@^1.8.0": version "1.8.0" @@ -2818,20 +2803,22 @@ "@walletconnect/types" "^1.8.0" "@walletconnect/utils" "^1.8.0" -"@walletconnect/jsonrpc-types@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.1.tgz#a96b4bb2bcc8838a70e06f15c1b5ab11c47d8e95" - integrity sha512-+6coTtOuChCqM+AoYyi4Q83p9l/laI6NvuM2/AHaZFuf0gT0NjW7IX2+86qGyizn7Ptq4AYZmfxurAxTnhefuw== +"@walletconnect/jsonrpc-types@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.2.tgz#b79519f679cd6a5fa4a1bea888f27c1916689a20" + integrity sha512-CZe8tjJX73OWdHjrBHy7HtAapJ2tT0Q3TYhPBhRxi3643lwPIQWC9En45ldY14TZwgSewkbZ0FtGBZK0G7Bbyg== dependencies: keyvaluestorage-interface "^1.0.0" + tslib "1.14.1" "@walletconnect/jsonrpc-utils@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.3.tgz#5bd49865eef0eae48e8b45a06731dc18691cf8c7" - integrity sha512-3yb49bPk16MNLk6uIIHPSHQCpD6UAo1OMOx1rM8cW/MPEAYAzrSW5hkhG7NEUwX9SokRIgnZK3QuQkiyNzBMhQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.4.tgz#2009ba3907b02516f2caacd2fb871ff0d472b2cb" + integrity sha512-y0+tDxcTZ9BHBBKBJbjZxLUXb+zQZCylf7y/jTvDPNx76J0hYYc+F9zHzyqBLeorSKepLTk6yI8hw3NXbAQB3g== dependencies: - "@walletconnect/environment" "^1.0.0" - "@walletconnect/jsonrpc-types" "^1.0.1" + "@walletconnect/environment" "^1.0.1" + "@walletconnect/jsonrpc-types" "^1.0.2" + tslib "1.14.1" "@walletconnect/mobile-registry@^1.4.0": version "1.4.0" @@ -2850,14 +2837,15 @@ preact "10.4.1" qrcode "1.4.4" -"@walletconnect/randombytes@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.2.tgz#95c644251a15e6675f58fbffc9513a01486da49c" - integrity sha512-ivgOtAyqQnN0rLQmOFPemsgYGysd/ooLfaDA/ACQ3cyqlca56t3rZc7pXfqJOIETx/wSyoF5XbwL+BqYodw27A== +"@walletconnect/randombytes@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.3.tgz#e795e4918367fd1e6a2215e075e64ab93e23985b" + integrity sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw== dependencies: - "@walletconnect/encoding" "^1.0.1" - "@walletconnect/environment" "^1.0.0" + "@walletconnect/encoding" "^1.0.2" + "@walletconnect/environment" "^1.0.1" randombytes "^2.1.0" + tslib "1.14.1" "@walletconnect/safe-json@1.0.0": version "1.0.0" @@ -2903,11 +2891,18 @@ "@walletconnect/utils" "^1.8.0" web3-provider-engine "16.0.1" -"@walletconnect/window-getters@1.0.0", "@walletconnect/window-getters@^1.0.0": +"@walletconnect/window-getters@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== +"@walletconnect/window-getters@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" + integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== + dependencies: + tslib "1.14.1" + "@walletconnect/window-metadata@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" @@ -3060,13 +3055,6 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" -"@wry/context@^0.6.0": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.1.tgz#c3c29c0ad622adb00f6a53303c4f965ee06ebeb2" - integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== - dependencies: - tslib "^2.3.0" - "@wry/context@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.0.tgz#be88e22c0ddf62aeb0ae9f95c3d90932c619a5c8" @@ -3159,9 +3147,9 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.5.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== address@1.1.2: version "1.1.2" @@ -3227,9 +3215,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + version "8.11.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" + integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -3316,9 +3304,9 @@ anymatch@^2.0.0: normalize-path "^2.1.1" anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -3357,9 +3345,11 @@ aria-query@^4.2.2: "@babel/runtime-corejs3" "^7.10.2" aria-query@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.2.tgz#0b8a744295271861e1d933f8feca13f9b70cfdc1" - integrity sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q== + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" arity-n@^1.0.4: version "1.0.4" @@ -3401,15 +3391,15 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.4, array-includes@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== +array-includes@^3.1.4, array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" is-string "^1.0.7" array-union@^1.0.1: @@ -3435,36 +3425,47 @@ array-unique@^0.3.2: integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== array.prototype.flat@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" - integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.reduce@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" - integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3624,6 +3625,11 @@ autoprefixer@^9.6.1: postcss "^7.0.32" postcss-value-parser "^4.1.0" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -3635,9 +3641,9 @@ aws4@^1.8.0: integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axe-core@^4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" - integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== + version "4.5.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.5.2.tgz#823fdf491ff717ac3c58a52631d4206930c1d9f7" + integrity sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA== axios@^0.18.0: version "0.18.1" @@ -3871,13 +3877,6 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - babel-plugin-istanbul@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -4513,10 +4512,10 @@ bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" content-type "~1.0.4" @@ -4526,7 +4525,7 @@ body-parser@1.20.0: http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.10.3" + qs "6.11.0" raw-body "2.5.1" type-is "~1.6.18" unpipe "1.0.0" @@ -4937,9 +4936,9 @@ camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== camelize@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" - integrity sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== caniuse-api@^3.0.0: version "3.0.0" @@ -4952,9 +4951,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001400: - version "1.0.30001416" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001416.tgz#29692af8a6a11412f2d3cf9a59d588fcdd21ce4c" - integrity sha512-06wzzdAkCPZO+Qm4e/eNghZBDfVNDsCgw33T27OwBH9unE9S478OYw//Q2L7Npf/zBzs7rjZOszIFQkwQKAEqA== + version "1.0.30001434" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz#ec1ec1cfb0a93a34a0600d37903853030520a4e5" + integrity sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA== capture-exit@^2.0.0: version "2.0.0" @@ -5015,9 +5014,9 @@ char-regex@^1.0.2: integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== check-types@^11.1.1: - version "11.1.2" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" - integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== + version "11.2.2" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.2.tgz#7afc0b6a860d686885062f2dba888ba5710335b4" + integrity sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA== checkpoint-store@^1.1.0: version "1.1.0" @@ -5081,9 +5080,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.4.0.tgz#b28484fd436cbc267900364f096c9dc185efb251" - integrity sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug== + version "3.7.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" + integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -5366,11 +5365,9 @@ convert-source-map@^0.3.3: integrity sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg== convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== cookie-signature@1.0.6: version "1.0.6" @@ -5405,23 +5402,23 @@ copy-descriptor@^0.1.0: integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== copy-to-clipboard@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz#5b263ec2366224b100181dded7ce0579b340c107" - integrity sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg== + version "3.3.3" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== dependencies: toggle-selection "^1.0.6" core-js-compat@^3.25.1, core-js-compat@^3.6.2: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.25.5.tgz#0016e8158c904f7b059486639e6e82116eafa7d9" - integrity sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA== + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" + integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== dependencies: browserslist "^4.21.4" core-js-pure@^3.25.1: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.5.tgz#79716ba54240c6aa9ceba6eee08cf79471ba184d" - integrity sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg== + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.1.tgz#653f4d7130c427820dcecd3168b594e8bb095a33" + integrity sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ== core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" @@ -5429,9 +5426,9 @@ core-js@^2.4.0, core-js@^2.5.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.6.5: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.25.5.tgz#e86f651a2ca8a0237a5f064c2fe56cef89646e27" - integrity sha512-nbm6eZSjm+ZuBQxCUPQKQCoUEfFOXjUZ8dTTyikyKaWrTYmAVbykQfwsKE5dBK88u3QCkCrzsx/PPlKfhsvgpw== + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e" + integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA== core-util-is@1.0.2: version "1.0.2" @@ -5454,9 +5451,9 @@ cosmiconfig@^5.0.0: parse-json "^4.0.0" cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -5881,9 +5878,9 @@ debug@^3.2.5, debug@^3.2.7: ms "^2.1.1" decamelize-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -5894,9 +5891,9 @@ decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.2.1: - version "10.4.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.1.tgz#be75eeac4a2281aace80c1a8753587c27ef053e7" - integrity sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw== + version "10.4.2" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.2.tgz#0341651d1d997d86065a2ce3a441fbd0d8e8b98e" + integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== decode-uri-component@^0.2.0: version "0.2.0" @@ -5927,6 +5924,27 @@ deep-equal@^1.0.1, deep-equal@~1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" +deep-equal@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.1.0.tgz#5ba60402cf44ab92c2c07f3f3312c3d857a0e1dd" + integrity sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.8" + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -5983,9 +6001,9 @@ define-property@^2.0.2: isobject "^3.0.1" defined@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== del@^4.1.1: version "4.1.1" @@ -6078,10 +6096,10 @@ diff-sequences@^26.6.2: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== -diff-sequences@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f" - integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA== +diff-sequences@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" + integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== diff@^4.0.1: version "4.0.2" @@ -6306,9 +6324,9 @@ ejs@^2.6.1: integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.251: - version "1.4.273" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.273.tgz#2a0276553172874617665807a40bea95711c2b9f" - integrity sha512-iEx72lv4P85PJ8HA9KEAss4o6ESK+hcxzM1cksZDo0H8KekaI+cloQyxOCASmHQO9ogmGyEELtBzxqqdeNwIgQ== + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== elliptic@6.5.2: version "6.5.2" @@ -6432,10 +6450,10 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: - version "1.20.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.3.tgz#90b143ff7aedc8b3d189bcfac7f1e3e3f81e9da1" - integrity sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw== +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.20.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -6447,7 +6465,7 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19 has-property-descriptors "^1.0.0" has-symbols "^1.0.3" internal-slot "^1.0.3" - is-callable "^1.2.6" + is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" @@ -6467,6 +6485,20 @@ es-array-method-boxes-properly@^1.0.0: resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-get-iterator@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -6679,24 +6711,25 @@ eslint-plugin-react-hooks@^4.2.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.21.5: - version "7.31.8" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz#3a4f80c10be1bcbc8197be9e8b641b2a3ef219bf" - integrity sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw== + version "7.31.11" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" + integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== dependencies: - array-includes "^3.1.5" - array.prototype.flatmap "^1.3.0" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.1" - object.values "^1.1.5" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" prop-types "^15.8.1" resolve "^2.0.0-next.3" semver "^6.3.0" - string.prototype.matchall "^4.0.7" + string.prototype.matchall "^4.0.8" eslint-plugin-testing-library@^3.9.2: version "3.10.2" @@ -7356,9 +7389,9 @@ ethers@4.0.47: xmlhttprequest "1.8.0" ethers@^5.0.0, ethers@^5.5.2: - version "5.7.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.1.tgz#48c83a44900b5f006eb2f65d3ba6277047fd4f33" - integrity sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q== + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" "@ethersproject/abstract-provider" "5.7.0" @@ -7378,7 +7411,7 @@ ethers@^5.0.0, ethers@^5.5.2: "@ethersproject/networks" "5.7.1" "@ethersproject/pbkdf2" "5.7.0" "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.1" + "@ethersproject/providers" "5.7.2" "@ethersproject/random" "5.7.0" "@ethersproject/rlp" "5.7.0" "@ethersproject/sha2" "5.7.0" @@ -7499,24 +7532,24 @@ expect@^26.6.0, expect@^26.6.2: jest-regex-util "^26.0.0" expect@^29.0.0: - version "29.1.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.1.2.tgz#82f8f28d7d408c7c68da3a386a490ee683e1eced" - integrity sha512-AuAGn1uxva5YBbBlXb+2JPxJRuemZsmlGcapPXWNSBNsQtAULfjioREGBWuI0EOvYUKjDnrCy8PW5Zlr1md5mw== + version "29.3.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" + integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== dependencies: - "@jest/expect-utils" "^29.1.2" - jest-get-type "^29.0.0" - jest-matcher-utils "^29.1.2" - jest-message-util "^29.1.2" - jest-util "^29.1.2" + "@jest/expect-utils" "^29.3.1" + jest-get-type "^29.2.0" + jest-matcher-utils "^29.3.1" + jest-message-util "^29.3.1" + jest-util "^29.3.1" express@^4.17.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.0" + body-parser "1.20.1" content-disposition "0.5.4" content-type "~1.0.4" cookie "0.5.0" @@ -7535,7 +7568,7 @@ express@^4.17.1: parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.10.3" + qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.18.0" @@ -7842,7 +7875,7 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== -for-each@~0.3.3: +for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== @@ -8188,9 +8221,9 @@ globals@^12.1.0: type-fest "^0.8.1" globals@^13.6.0, globals@^13.9.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + version "13.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" + integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== dependencies: type-fest "^0.20.2" @@ -8243,6 +8276,13 @@ globule@^1.0.0: lodash "^4.17.21" minimatch "~3.0.2" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -8640,23 +8680,23 @@ human-signals@^1.1.1: integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== i18next-browser-languagedetector@^6.1.3: - version "6.1.5" - resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-6.1.5.tgz#ed8c9319a8d246995d8ec8fccb5bf5f4248d0fb1" - integrity sha512-11t7b39oKeZe4uyMxLSPnfw28BCPNLZgUk7zyufex0zKXZ+Bv+JnmJgoB+IfQLZwDt1d71PM8vwBX1NCgliY3g== + version "6.1.8" + resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-6.1.8.tgz#8e9c61b32a4dfe9b959b38bc9d2a8b95f799b27c" + integrity sha512-Svm+MduCElO0Meqpj1kJAriTC6OhI41VhlT/A0UPjGoPZBhAHIaGE5EfsHlTpgdH09UVX7rcc72pSDDBeKSQQA== dependencies: - "@babel/runtime" "^7.18.9" + "@babel/runtime" "^7.19.0" i18next-http-backend@^1.3.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/i18next-http-backend/-/i18next-http-backend-1.4.4.tgz#9f372f704975a5e96ce74e4247698bcbd00d148f" - integrity sha512-M4gLPe6JKZ2p1UmE6t4rzWV/sAxgrLThW7ztXAsTpFwFqXoyzhTzX8eYxVv9KjpCQh4K9nwxnEjEi+74C4Thbg== + version "1.4.5" + resolved "https://registry.yarnpkg.com/i18next-http-backend/-/i18next-http-backend-1.4.5.tgz#4803eb071eb6ffb147c36bdd42ba6f64b3198ac2" + integrity sha512-tLuHWuLWl6CmS07o+UB6EcQCaUjrZ1yhdseIN7sfq0u7phsMePJ8pqlGhIAdRDPF/q7ooyo5MID5DRFBCH+x5w== dependencies: cross-fetch "3.1.5" i18next@^21.6.6: - version "21.9.2" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-21.9.2.tgz#3f7c5594393eb27117c1db4c38f5ec766e68de0e" - integrity sha512-00fVrLQOwy45nm3OtC9l1WiLK3nJlIYSljgCt0qzTaAy65aciMdRy9GsuW+a2AtKtdg9/njUGfRH30LRupV7ZQ== + version "21.10.0" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-21.10.0.tgz#85429af55fdca4858345d0e16b584ec29520197d" + integrity sha512-YeuIBmFsGjUfO3qBmMOc0rQaun4mIpGKET5WDwvu8lU7gvwpcariZLNtL0Fzj+zazcHUrlXHiptcFhBMFaxzfg== dependencies: "@babel/runtime" "^7.17.2" @@ -8704,9 +8744,9 @@ ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + version "5.2.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" + integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== immediate@^3.2.3: version "3.3.0" @@ -8897,7 +8937,7 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arguments@^1.0.4: +is-arguments@^1.0.4, is-arguments@^1.1.0, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -8964,7 +9004,7 @@ is-buffer@^2.0.2: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.6: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -8989,9 +9029,9 @@ is-color-stop@^1.0.0: rgba-regex "^1.0.0" is-core-module@^2.0.0, is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" @@ -9009,7 +9049,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -9117,6 +9157,11 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -9215,6 +9260,11 @@ is-root@2.1.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -9246,6 +9296,17 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typedarray@1.0.0, is-typedarray@^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" @@ -9256,6 +9317,11 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -9263,6 +9329,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -9290,7 +9364,7 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== -isarray@^2.0.1: +isarray@^2.0.1, isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== @@ -9458,15 +9532,15 @@ jest-diff@^26.0.0, jest-diff@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-diff@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.1.2.tgz#bb7aaf5353227d6f4f96c5e7e8713ce576a607dc" - integrity sha512-4GQts0aUopVvecIT4IwD/7xsBaMhKTYoM4/njE/aVw9wpw+pIUVp8Vab/KnSzSilr84GnLBkaP3JLDnQYCKqVQ== +jest-diff@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" + integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== dependencies: chalk "^4.0.0" - diff-sequences "^29.0.0" - jest-get-type "^29.0.0" - pretty-format "^29.1.2" + diff-sequences "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" jest-docblock@^26.0.0: version "26.0.0" @@ -9516,10 +9590,10 @@ jest-get-type@^26.3.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== -jest-get-type@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.0.0.tgz#843f6c50a1b778f7325df1129a0fd7aa713aef80" - integrity sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw== +jest-get-type@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" + integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== jest-haste-map@^26.6.2: version "26.6.2" @@ -9584,15 +9658,15 @@ jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-matcher-utils@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.1.2.tgz#e68c4bcc0266e70aa1a5c13fb7b8cd4695e318a1" - integrity sha512-MV5XrD3qYSW2zZSHRRceFzqJ39B2z11Qv0KPyZYxnzDHFeYZGJlgGi0SW+IXSJfOewgJp/Km/7lpcFT+cgZypw== +jest-matcher-utils@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" + integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== dependencies: chalk "^4.0.0" - jest-diff "^29.1.2" - jest-get-type "^29.0.0" - pretty-format "^29.1.2" + jest-diff "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" jest-message-util@^26.6.0, jest-message-util@^26.6.2: version "26.6.2" @@ -9609,18 +9683,18 @@ jest-message-util@^26.6.0, jest-message-util@^26.6.2: slash "^3.0.0" stack-utils "^2.0.2" -jest-message-util@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.1.2.tgz#c21a33c25f9dc1ebfcd0f921d89438847a09a501" - integrity sha512-9oJ2Os+Qh6IlxLpmvshVbGUiSkZVc2FK+uGOm6tghafnB2RyjKAxMZhtxThRMxfX1J1SOMhTn9oK3/MutRWQJQ== +jest-message-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" + integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.1.2" + "@jest/types" "^29.3.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.1.2" + pretty-format "^29.3.1" slash "^3.0.0" stack-utils "^2.0.3" @@ -9633,9 +9707,9 @@ jest-mock@^26.6.2: "@types/node" "*" jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^26.0.0: version "26.0.0" @@ -9780,12 +9854,12 @@ jest-util@^26.6.0, jest-util@^26.6.2: is-ci "^2.0.0" micromatch "^4.0.2" -jest-util@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.1.2.tgz#ac5798e93cb6a6703084e194cfa0898d66126df1" - integrity sha512-vPCk9F353i0Ymx3WQq3+a4lZ07NXu9Ca8wya6o4Fe4/aO1e1awMMprZ3woPFpKwghEOW+UXgd15vVotuNN9ONQ== +jest-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" + integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== dependencies: - "@jest/types" "^29.1.2" + "@jest/types" "^29.3.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -10027,11 +10101,11 @@ json-stable-stringify-without-jsonify@^1.0.1: integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" + integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== dependencies: - jsonify "~0.0.0" + jsonify "^0.0.1" json-stringify-safe@~5.0.1: version "5.0.1" @@ -10076,10 +10150,10 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA== +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== jsprim@^1.2.2: version "1.4.2" @@ -10312,18 +10386,18 @@ loader-utils@2.0.0: json5 "^2.1.2" loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^1.0.1" loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" @@ -10403,9 +10477,9 @@ lodash.uniq@^4.5.0: integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loglevel@^1.6.8: - version "1.8.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" - integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== + version "1.8.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" + integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" @@ -10784,9 +10858,9 @@ minimist-options@^3.0.1: is-plain-obj "^1.1.0" minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6, minimist@~1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== minipass-collect@^1.0.2: version "1.0.2" @@ -10810,9 +10884,9 @@ minipass-pipeline@^1.2.2: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: - version "3.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" - integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" @@ -10917,9 +10991,9 @@ multimatch@^4.0.0: minimatch "^3.0.4" nan@^2.12.1, nan@^2.13.2, nan@^2.14.0, nan@^2.2.1: - version "2.16.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" - integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== nanoid@^3.3.4: version "3.3.4" @@ -11251,7 +11325,7 @@ object-inspect@^1.12.2, object-inspect@^1.9.0, object-inspect@~1.12.2: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-is@^1.0.1: +object-is@^1.0.1, object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -11276,7 +11350,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -11286,41 +11360,41 @@ object.assign@^4.1.0, object.assign@^4.1.2, object.assign@^4.1.3, object.assign@ has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.0, object.entries@^1.1.2, object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== +object.entries@^1.1.0, object.entries@^1.1.2, object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.4" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" - integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== + version "2.1.5" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" + integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== dependencies: - array.prototype.reduce "^1.0.4" + array.prototype.reduce "^1.0.5" call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.20.1" + es-abstract "^1.20.4" -object.hasown@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" - integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== dependencies: define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" object.pick@^1.3.0: version "1.3.0" @@ -11329,14 +11403,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== +object.values@^1.1.0, object.values@^1.1.5, object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -11385,11 +11459,11 @@ opn@^5.5.0: is-wsl "^1.1.0" optimism@^0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" - integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== + version "0.16.2" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.2.tgz#519b0c78b3b30954baed0defe5143de7776bf081" + integrity sha512-zWNbgWj+3vLEjZNIh/okkY2EUfX+vB9TJopzIZwT1xxaMqC5hRLLraePod4c5n4He08xuXNH+zhKFFCu390wiQ== dependencies: - "@wry/context" "^0.6.0" + "@wry/context" "^0.7.0" "@wry/trie" "^0.3.0" optimize-css-assets-webpack-plugin@5.0.4: @@ -12434,9 +12508,9 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: uniq "^1.0.1" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + version "6.0.11" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -12496,9 +12570,9 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po source-map "^0.6.1" postcss@^8.1.0: - version "8.4.17" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.17.tgz#f87863ec7cd353f81f7ab2dec5d67d861bbb1be5" - integrity sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q== + version "8.4.19" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" + integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" @@ -12510,9 +12584,9 @@ preact@10.4.1: integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== preact@^10.5.9: - version "10.11.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.1.tgz#35fdad092de8b2ad29df3a0bef9af1f4fdd2256b" - integrity sha512-1Wz5PCRm6Fg+6BTXWJHhX4wRK9MZbZBHuwBqfZlOdVm2NqPe8/rjYpufvYCwJSGb9layyzB2jTTXfpCTynLqFQ== + version "10.11.3" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19" + integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== precond@0.2: version "0.2.3" @@ -12542,9 +12616,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.1.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + version "2.8.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" + integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== pretty-bytes@^5.3.0: version "5.6.0" @@ -12569,10 +12643,10 @@ pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.1.2.tgz#b1f6b75be7d699be1a051f5da36e8ae9e76a8e6a" - integrity sha512-CGJ6VVGXVRP2o2Dorl4mAwwvDWT25luIsYhkyVQW32E4nL+TgW939J7LlKT/npq5Cpq6j3s+sy+13yk7xYpBmg== +pretty-format@^29.0.0, pretty-format@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" + integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== dependencies: "@jest/schemas" "^29.0.0" ansi-styles "^5.0.0" @@ -12624,9 +12698,9 @@ promise-to-callback@^1.0.0: set-immediate-shim "^1.0.1" promise@^8.1.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.2.0.tgz#a1f6280ab67457fbfc8aad2b198c9497e9e5c806" - integrity sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg== + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" @@ -12756,10 +12830,10 @@ qrcode@1.4.4: pngjs "^3.3.0" yargs "^13.2.4" -qs@6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" @@ -12886,13 +12960,13 @@ react-blockies@^1.4.1: prop-types "^15.5.10" react-bootstrap@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.5.0.tgz#e25e649e37f080d38eeb92ad5b4ed562a1d7de62" - integrity sha512-j/aLR+okzbYk61TM3eDOU1NqOqnUdwyVrF+ojoCRUxPdzc2R0xXvqyRsjSoyRoCo7n82Fs/LWjPCin/QJNdwvA== + version "2.6.0" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.6.0.tgz#bd125889cc9d2bbd7c89334a7c54980ff0a65b94" + integrity sha512-WnDgN6PR8WZKo2Og5J8EafFi4BsABjc96lNuMNfksrgiPDCw18/woWQCNhAeHFZQWTQ/PijkOrQ9ncTWwO//AA== dependencies: "@babel/runtime" "^7.17.2" "@restart/hooks" "^0.4.6" - "@restart/ui" "^1.3.1" + "@restart/ui" "^1.4.1" "@types/react-transition-group" "^4.4.4" classnames "^2.3.1" dom-helpers "^5.2.1" @@ -12965,9 +13039,9 @@ react-i18next@^11.15.3: html-parse-stringify "^3.0.1" react-icons@^4.3.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.4.0.tgz#a13a8a20c254854e1ec9aecef28a95cdf24ef703" - integrity sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg== + version "4.6.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.6.0.tgz#f83eda179af5d02c047449a20b702c858653d397" + integrity sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g== react-is@^16.13.1, react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" @@ -13293,15 +13367,10 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.10: - version "0.13.10" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== - -regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.7: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regenerator-transform@^0.10.0: version "0.10.1" @@ -13312,10 +13381,10 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" -regenerator-transform@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" - integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" @@ -13332,7 +13401,7 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== @@ -13355,17 +13424,17 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.1.tgz#a69c26f324c1e962e9ffd0b88b055caba8089139" - integrity sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ== +regexpu-core@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" + integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" regjsgen@^0.2.0: version "0.2.0" @@ -13788,9 +13857,9 @@ sass-loader@8.0.2: semver "^6.3.0" sass-loader@^10.0.4: - version "10.3.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.3.1.tgz#a45f0d1dd7ea90de7eb099239a18c83dea6e6341" - integrity sha512-y2aBdtYkbqorVavkC3fcJIUDGIegzDWPn3/LAFhsf3G+MzPKTJx37sROf5pXtUeggSVbNbmfj8TgRaSLMelXRA== + version "10.4.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.4.1.tgz#bea4e173ddf512c9d7f53e9ec686186146807cbf" + integrity sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ== dependencies: klona "^2.0.4" loader-utils "^2.0.0" @@ -13799,9 +13868,9 @@ sass-loader@^10.0.4: semver "^7.3.2" sass@^1.27.0: - version "1.55.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.55.0.tgz#0c4d3c293cfe8f8a2e8d3b666e1cf1bff8065d1c" - integrity sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A== + version "1.56.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.1.tgz#94d3910cd468fd075fa87f5bb17437a0b617d8a7" + integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -14396,9 +14465,9 @@ stable@^0.1.8: integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^2.0.2, stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" @@ -14527,46 +14596,46 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.matchall@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" - integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" has-symbols "^1.0.3" internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" + regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" string.prototype.trim@~1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz#824960787db37a9e24711802ed0c1d1c0254f83e" - integrity sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ== + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -14814,9 +14883,9 @@ table@^5.2.3: string-width "^3.0.0" table@^6.0.9: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -14860,9 +14929,9 @@ tar@^2.0.0: inherits "2" tar@^6.0.2: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + version "6.1.12" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.12.tgz#3b742fb05669b55671fb769ab67a7791ea1a62e6" + integrity sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -14933,9 +15002,9 @@ terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.3.4: - version "5.15.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.1.tgz#8561af6e0fd6d839669c73b92bdd5777d870ed6c" - integrity sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw== + version "5.16.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.0.tgz#29362c6f5506e71545c73b069ccd199bb28f7f54" + integrity sha512-KjTV81QKStSfwbNiwlBXfcgMcOloyuRdb62/iLFPGBcVNF4EXjhdYBhYHmbJpiBrVxZhDvltE11j+LBQUxEEJg== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -15170,15 +15239,15 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@1.14.1, tslib@^1.10.0, tslib@^1.8.1, 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== tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" @@ -15331,10 +15400,10 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" @@ -15757,9 +15826,9 @@ web3-utils@1.2.1: utf8 "3.0.0" web3-utils@^1.3.4: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.0.tgz#0a506f8c6af9a2ad6ba79689892662769534fc03" - integrity sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ== + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.1.tgz#f2f7ca7eb65e6feb9f3d61056d0de6bbd57125ff" + integrity sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ== dependencies: bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" @@ -15770,9 +15839,9 @@ web3-utils@^1.3.4: utf8 "3.0.0" web3modal@^1.9.5: - version "1.9.9" - resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.9.tgz#1a09771e1b9264842ab98d42c620568f470ff96b" - integrity sha512-ML1C4xH+JTSHHkKbjxuF+f5B3cDUOCnrdQZ8Mlzippq7zRKHf3NBeuIvDdNjtVclJ2S4zYYVmVqRWrgB11ej8A== + version "1.9.10" + resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.10.tgz#ab7836ff27c6a16b9ca881ba0e8008bd33cb0dff" + integrity sha512-gRByp+toRiADwkJLLGRXsnIVbLS1aJB71sJyryS6C7cF6jJ3cRN1LbPYEMObMyJkyjOZonx0CNZVAYGiD099aA== dependencies: detect-browser "^5.1.0" prop-types "^15.7.2" @@ -15972,11 +16041,33 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== +which-typed-array@^1.1.8: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" From aa7c51c15c3f86b6dd9c0d976f5d14019107367d Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 28 Nov 2022 11:47:16 -0600 Subject: [PATCH 184/278] fixed wbtc hard vault status --- src/components/Vault/Monitoring/index.tsx | 28 ++++++++++++++++++----- src/components/Vault/Monitoring/types.tsx | 1 + yarn.lock | 6 ++--- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 6214e4c..308dcec 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -309,12 +309,14 @@ export const Monitoring = () => { const hardWethRatioCall = await hardVaults.wethVaultRead?.ratio(); const hardDaiRatioCall = await hardVaults.daiVaultRead?.ratio(); const hardUsdcRatioCall = await hardVaults.usdcVaultRead?.ratio(); + const hardWbtcRatioCall = await hardVaults.wbtcVaultRead?.ratio(); ethcalls.push(wethRatioCall); ethcalls.push(aaveRatioCall); ethcalls.push(linkRatioCall); ethcalls.push(hardWethRatioCall); ethcalls.push(hardDaiRatioCall); ethcalls.push(hardUsdcRatioCall); + ethcalls.push(hardWbtcRatioCall); } if (isOptimism(currentNetwork.chainId)) { const wethRatioCall = await vaults.wethVaultRead?.ratio(); @@ -343,10 +345,19 @@ export const Monitoring = () => { let hardEthRatio = 0; let hardDaiRatio = 0; let hardUsdcRatio = 0; + let hardWbtcRatio = 0; if (isInLayer1(currentNetwork.chainId)) { // @ts-ignore - [daiRatio, ethRatio, aaveRatio, linkRatio, hardEthRatio, hardDaiRatio, hardUsdcRatio] = - await signer.ethcallProvider?.all(ethcalls); + [ + daiRatio, + ethRatio, + aaveRatio, + linkRatio, + hardEthRatio, + hardDaiRatio, + hardUsdcRatio, + hardWbtcRatio, + ] = await signer.ethcallProvider?.all(ethcalls); } else if (isOptimism(currentNetwork.chainId)) { // @ts-ignore [daiRatio, ethRatio, linkRatio, snxRatio, uniRatio] = await signer.ethcallProvider?.all( @@ -370,6 +381,7 @@ export const Monitoring = () => { hardWethRatio: hardEthRatio, hardDaiRatio, hardUsdcRatio, + hardWbtcRatio, }); } }; @@ -425,14 +437,14 @@ export const Monitoring = () => { break; case "WETH": if (isHardVault) { - minRatio = vaultsRatio?.hardWethRatio || 110; + minRatio = vaultsRatio?.hardWethRatio || 125; } else { minRatio = vaultsRatio?.ethRatio || 200; } break; case "DAI": if (isHardVault) { - minRatio = vaultsRatio?.hardDaiRatio || 110; + minRatio = vaultsRatio?.hardDaiRatio || 125; } else { minRatio = vaultsRatio?.daiRatio || 200; } @@ -453,10 +465,14 @@ export const Monitoring = () => { minRatio = vaultsRatio?.maticRatio || 200; break; case "WBTC": - minRatio = vaultsRatio?.wbtcRatio || 200; + if (isHardVault) { + minRatio = vaultsRatio?.hardWbtcRatio || 125; + } else { + minRatio = vaultsRatio?.wbtcRatio || 200; + } break; case "USDC": - minRatio = vaultsRatio?.hardUsdcRatio || 110; + minRatio = vaultsRatio?.hardUsdcRatio || 125; break; default: break; diff --git a/src/components/Vault/Monitoring/types.tsx b/src/components/Vault/Monitoring/types.tsx index e4883a8..61de5b7 100644 --- a/src/components/Vault/Monitoring/types.tsx +++ b/src/components/Vault/Monitoring/types.tsx @@ -36,6 +36,7 @@ export type VaultsRatioType = { hardWethRatio: number; hardDaiRatio: number; hardUsdcRatio: number; + hardWbtcRatio: number; }; export type VaultsType = { diff --git a/yarn.lock b/yarn.lock index 321a82a..9fc5ce6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2315,9 +2315,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz#235bf339d17185bdec25e024ca19cce257cc7309" - integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== + version "7.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== dependencies: "@babel/types" "^7.3.0" From f426c4c332c7fdb0c25911d76558a8046f81f2b2 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 28 Nov 2022 12:56:44 -0600 Subject: [PATCH 185/278] update ratio label --- public/locales/es/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index b63aac5..3eca4e9 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -100,7 +100,7 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", - "hard-mode-info": "Hard mode vaults have a minimum required ratio of 110%.", + "hard-mode-info": "Hard mode vaults have a minimum required ratio of 125%.", "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", From 19c7cddcea69c3d8dd5f40c0e4038f9e55d9f142 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 1 Dec 2022 23:41:56 -0600 Subject: [PATCH 186/278] fixing design --- public/locales/es/translation.json | 4 +- src/App.tsx | 80 +- src/components/Header.tsx | 12 +- src/components/Sidebar.tsx | 107 +- src/components/Vault/Monitoring/index.tsx | 4 +- src/components/Vaults/common.tsx | 59 +- src/components/Vaults/index.tsx | 1 - src/components/Vaults/monitoring/Vaults.tsx | 41 +- src/components/Vaults/monitoring/index.tsx | 137 ++- src/components/Vaults/vault/Vault2.tsx | 1158 +++++++++++++++++- src/components/Vaults/vault/VaultForm.tsx | 321 ++--- src/components/Vaults/vault/index.tsx | 1174 ++----------------- src/components/Welcome/Protocol.tsx | 11 +- src/components/Welcome/Summary.tsx | 13 +- src/components/Welcome/index.tsx | 6 +- src/contracts/cryptex.json | 1111 +++--------------- src/hooks/usePrices.tsx | 2 +- src/hooks/useVault.tsx | 2 +- src/state/Web3ModalContext.tsx | 5 +- src/styles/app.scss | 12 +- src/styles/header.scss | 1 - src/styles/mint2.scss | 58 +- src/styles/vault-monitoring.scss | 49 +- src/utils/constants.tsx | 45 +- src/utils/utils.tsx | 12 +- yarn.lock | 18 +- 26 files changed, 1865 insertions(+), 2578 deletions(-) diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index b63aac5..47bdcdd 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -94,9 +94,9 @@ "subtitle1": "Select your Collateral", "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", "approve": "Approve Vault", - "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", + "approve-text": "Vault not approved. Please approve your collateral to start minting {{asset}} tokens.", "create": "Create Vault", - "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", + "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting {{asset}} tokens.", "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", diff --git a/src/App.tsx b/src/App.tsx index e8bdfdb..5b71fbe 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -68,7 +68,7 @@ const App = () => { const [showSidebar, setShowSidebar] = useState(true); const [apolloClient, setApolloClient] = useState( clientOracle( - process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.rinkeby + process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.goerli ) ); const networks = hooks.useNetworks(); @@ -95,9 +95,9 @@ const App = () => { cNetwork = NETWORKS.mainnet; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); break; - case NETWORKS.rinkeby.chainId: - cNetwork = NETWORKS.rinkeby; - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.rinkeby)); + case NETWORKS.goerli.chainId: + cNetwork = NETWORKS.goerli; + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.goerli)); break; case NETWORKS.arbitrum.chainId: cNetwork = NETWORKS.arbitrum; @@ -135,24 +135,25 @@ const App = () => { if (walletName !== "") networks.setCurrentWallet(walletName); }; - const setMushroomContracts = async (currentSigner: ethers.Signer) => { + const setMushroomContracts = async (chainId: number, currentSigner: ethers.Signer) => { + let mushroomNftAddress = NETWORKS.mainnet.mushroomNft; + if (isGoerli(chainId)) { + mushroomNftAddress = NETWORKS.goerli.mushroomNft; + } + // Set Mushroom contracts - const currentMushroomNft = new ethers.Contract( - NETWORKS.mainnet.mushroomNft, - Mushroom.abi, - currentSigner - ); + const currentMushroomNft = new ethers.Contract(mushroomNftAddress, Mushroom.abi, currentSigner); mushroomNft.setCurrentMushroomNft(currentMushroomNft); - const currentMushroomNftRead = new Contract(NETWORKS.mainnet.mushroomNft, Mushroom.abi); + const currentMushroomNftRead = new Contract(mushroomNftAddress, Mushroom.abi); mushroomNft.setCurrentMushroomNftRead(currentMushroomNftRead); }; const setEthereumContracts = async (chainId: number, currentSigner: ethers.Signer) => { let contracts; - let ethPoolAddress = NETWORKS.rinkeby.ethPool; - let daiPoolAddress = NETWORKS.rinkeby.daiPool; - let ctxPoolAddress = NETWORKS.rinkeby.ctxPool; + let ethPoolAddress; + let daiPoolAddress; + let ctxPoolAddress; switch (chainId) { case 1: contracts = cryptexJson[1].mainnet.contracts; @@ -160,11 +161,11 @@ const App = () => { daiPoolAddress = NETWORKS.mainnet.daiPool; ctxPoolAddress = NETWORKS.mainnet.ctxPool; break; - case 4: - contracts = cryptexJson[4].rinkeby.contracts; + case 5: + contracts = cryptexJson[5].goerli.contracts; break; default: - contracts = cryptexJson[4].rinkeby.contracts; + contracts = cryptexJson[5].goerli.contracts; break; } @@ -436,9 +437,7 @@ const App = () => { toFragment(contracts.Timelock.abi) ); governance.setCurrentTimelockRead(currentTimelockRead); - if (chainId === 1) { - await setMushroomContracts(currentSigner); - } + await setMushroomContracts(chainId, currentSigner); }; const setArbitrumContracts = async ( @@ -733,22 +732,6 @@ const App = () => { oracles.setCurrentWBTCOracleRead(currentWBTCOracleRead); }; - const setGoerliContracts = async (currentSigner: ethers.Signer, ethcallProvider: Provider) => { - await ethcallProvider.init(); - signer.setCurrentEthcallProvider(ethcallProvider); - - // Set Mushroom contracts - const currentMushroomNft = new ethers.Contract( - NETWORKS.goerli.mushroomNft, - Mushroom.abi, - currentSigner - ); - mushroomNft.setCurrentMushroomNft(currentMushroomNft); - - const currentMushroomNftRead = new Contract(NETWORKS.goerli.mushroomNft, Mushroom.abi); - mushroomNft.setCurrentMushroomNftRead(currentMushroomNftRead); - }; - const setContracts = async ( currentSigner: ethers.Signer, ethcallProvider: Provider, @@ -767,10 +750,10 @@ const App = () => { daiAddress = NETWORKS.mainnet.dai; linkAddress = contracts.LINK.address; break; - case NETWORKS.rinkeby.chainId: - contracts = cryptexJson[4].rinkeby.contracts; - wethAddress = NETWORKS.rinkeby.weth; - daiAddress = NETWORKS.rinkeby.dai; + case NETWORKS.goerli.chainId: + contracts = cryptexJson[5].goerli.contracts; + wethAddress = NETWORKS.goerli.weth; + daiAddress = NETWORKS.goerli.dai; linkAddress = contracts.LINK.address; break; case NETWORKS.optimism.chainId: @@ -786,9 +769,9 @@ const App = () => { linkAddress = ""; break; default: - contracts = cryptexJson[4].rinkeby.contracts; - wethAddress = NETWORKS.rinkeby.weth; - daiAddress = NETWORKS.rinkeby.dai; + contracts = cryptexJson[5].goerli.contracts; + wethAddress = NETWORKS.goerli.weth; + daiAddress = NETWORKS.goerli.dai; linkAddress = contracts.LINK.address; break; } @@ -923,10 +906,8 @@ const App = () => { await setArbitrumContracts(network.chainId, currentSigner, ethcallProvider); } else if (isPolygon(network.chainId)) { await setPolygonContracts(network.chainId, currentSigner, ethcallProvider); - } else if (isGoerli(network.chainId)) { - await setGoerliContracts(currentSigner, ethcallProvider); } else { - await setContracts(currentSigner, ethcallProvider, network.chainId || 4); + await setContracts(currentSigner, ethcallProvider, network.chainId || 5); } const isBrowserWallet = @@ -963,14 +944,11 @@ const App = () => { } } else { setLoadingContracts(true); - const chainId = process.env.REACT_APP_NETWORK_ID || "4"; + const chainId = process.env.REACT_APP_NETWORK_ID || "5"; let networkName = NETWORKS.mainnet.name; if (isGoerli(parseInt(chainId))) { networkName = NETWORKS.goerli.name; } - if (chainId === "4") { - networkName = NETWORKS.rinkeby.name; - } const provider = getDefaultProvider(parseInt(chainId), networkName); const randomSigner = ethers.Wallet.createRandom().connect(provider); const ethcallProvider = new Provider(randomSigner.provider); @@ -978,8 +956,6 @@ const App = () => { setArbitrumContracts(parseInt(chainId), randomSigner, ethcallProvider); } else if (isPolygon(parseInt(chainId))) { setPolygonContracts(parseInt(chainId), randomSigner, ethcallProvider); - } else if (isGoerli(parseInt(chainId))) { - setGoerliContracts(randomSigner, ethcallProvider); } else { setContracts(randomSigner, ethcallProvider, parseInt(chainId)); } diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 63153d3..0ba66fe 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -174,7 +174,7 @@ const Header = ({ signerAddress, isMobile }: props) => { const ArbitrumToggle = () => { <> -
{process.env.REACT_APP_NETWORK_ID === "1" ? "Arbitrum" : "Goerli"}
+
{process.env.REACT_APP_NETWORK_ID === "1" ? "Arbitrum" : "Arbitrum Goerli"}
; }; @@ -198,21 +198,13 @@ const Header = ({ signerAddress, isMobile }: props) => { const EthereumToggle = () => ( <> - {process.env.REACT_APP_NETWORK_ID === "5" ? ( -
Goerli
- ) : ( -
{process.env.REACT_APP_NETWORK_ID === "1" ? "Ethereum" : "Rinkeby"}
- )} +
{process.env.REACT_APP_NETWORK_ID === "1" ? "Ethereum" : "Goerli"}
); const EthereumOpt = () => { let { chainId } = NETWORKS.mainnet; let { hexChainId } = NETWORKS.mainnet; - if (process.env.REACT_APP_NETWORK_ID === "4") { - chainId = NETWORKS.rinkeby.chainId; - hexChainId = NETWORKS.rinkeby.hexChainId; - } if (process.env.REACT_APP_NETWORK_ID === "5") { chainId = NETWORKS.goerli.chainId; hexChainId = NETWORKS.goerli.hexChainId; diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index f8516ec..3b118e0 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -5,12 +5,11 @@ import "../styles/sidebar.scss"; import { Link, useLocation } from "react-router-dom"; import { Web3ModalContext } from "../state/Web3ModalContext"; import { networkContext } from "../state"; -import { isInLayer1 } from "../utils/utils"; +import { isGoerli, isInLayer1 } from "../utils/utils"; import { ReactComponent as Logo } from "../assets/images/favicon.svg"; import { ReactComponent as MenuLogo } from "../assets/images/menu.svg"; import { ReactComponent as DashboardIcon } from "../assets/images/welcome/dashboard.svg"; import { ReactComponent as VaultIcon } from "../assets/images/welcome/vault.svg"; -import { ReactComponent as VaultMonitoringIcon } from "../assets/images/welcome/vault-monitoring.svg"; import { ReactComponent as LogoutIcon } from "../assets/images/welcome/logout.svg"; import { ReactComponent as StakeIcon } from "../assets/images/welcome/stake.svg"; import { ReactComponent as FarmIcon } from "../assets/images/welcome/farm.svg"; @@ -84,71 +83,59 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { { - setActive("vault"); + setActive("vaults"); }} > - Mint - - - - { - setActive("vault-monitoring"); - }} - > - - - Monitor - - - - - { - setActive("farm"); - }} - > - - Farm + Vaults + {!isGoerli(currentNetwork.chainId) && ( + + { + setActive("farm"); + }} + > + + Farm + + + )} + {isInLayer1(currentNetwork.chainId) && !isGoerli(currentNetwork.chainId) && ( + + { + setActive("governance"); + }} + > + + Delegate + + + )} {isInLayer1(currentNetwork.chainId) && ( - <> - - { - setActive("governance"); - }} - > - - Delegate - - - - { - setActive("sewagefruitz"); - }} - > - - - Sewagefruitz - - - - + + { + setActive("sewagefruitz"); + }} + > + + + Sewagefruitz + + + )} {
- <>{t("collateral")}: + <>{t("collateral")}
{ {isInLayer1(currentNetwork.chainId) && (
- <>{t("mode")}: + <>{t("mode")}
{ let minRatio = 200; switch (symbol) { @@ -142,7 +169,7 @@ export const TokenIcon = ({ name }: iconProps) => { }; export const TokenIconSmall = ({ name }: iconProps) => { - switch (name) { + switch (name.toLowerCase()) { case "eth": return ; case "weth": @@ -170,6 +197,36 @@ export const TokenIconSmall = ({ name }: iconProps) => { } }; +export const findNewMainnetVaultCollateral = (collaterals: Array): [string, boolean] => { + let diff = MAINNET_HARD_COLLATERALS.filter((x) => !collaterals.includes(x)); + let isHardVault = true; + if (diff.length === 0) { + diff = MAINNET_COLLATERALS.filter((x) => !collaterals.includes(x)); + if (diff.length === 0) { + return ["ETH", isHardVault]; + } + isHardVault = false; + } + return [diff[0], isHardVault]; +}; + +export const findNewOptimismVaultCollateral = (collaterals: Array): string => { + const diff = OPTIMISM_COLLATERALS.filter((x) => !collaterals.includes(x)); + if (diff.length === 0) { + return "ETH"; + } + return diff[0]; +}; + +export const findNewArbitrumVaultCollateral = (collaterals: Array): string => { + const diff = ARBITRUM_COLLATERALS.filter((x) => !collaterals.includes(x)); + if (diff.length === 0) { + return "ETH"; + } + + return diff[0]; +}; + export const sortCollateralAsc = (a: VaultsType, b: VaultsType) => parseFloat(a.collateralValue) - parseFloat(b.collateralValue); diff --git a/src/components/Vaults/index.tsx b/src/components/Vaults/index.tsx index a110e86..3576cab 100644 --- a/src/components/Vaults/index.tsx +++ b/src/components/Vaults/index.tsx @@ -1,6 +1,5 @@ import React, { useContext, useEffect, useState } from "react"; import Monitoring from "./monitoring"; -import Vault from "./vault"; import Vault2 from "./vault/Vault2"; import { signerContext } from "../../state"; import { VaultToUpdateType } from "./types"; diff --git a/src/components/Vaults/monitoring/Vaults.tsx b/src/components/Vaults/monitoring/Vaults.tsx index 3d5a65f..18d43c0 100644 --- a/src/components/Vaults/monitoring/Vaults.tsx +++ b/src/components/Vaults/monitoring/Vaults.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useContext, useState } from "react"; import Button from "react-bootstrap/esm/Button"; import Table from "react-bootstrap/Table"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; @@ -10,8 +10,9 @@ import { ReactComponent as SortIcon } from "../../../assets/images/sort.svg"; import { ReactComponent as SortUpIcon } from "../../../assets/images/sort-up.svg"; import { ReactComponent as SortDownIcon } from "../../../assets/images/sort-down.svg"; import Liquidate from "./Liquidate"; +import { networkContext } from "../../../state"; import { PaginationType, VaultsType, VaultToUpdateType } from "../types"; -import { numberFormatStr } from "../../../utils/utils"; +import { isArbitrum, numberFormatStr } from "../../../utils/utils"; import { capitalize, TokenIcon, @@ -26,6 +27,7 @@ import { sortRewardDesc, sortRewardAsc, } from "../common"; +import { TOKENS_SYMBOLS } from "../../../utils/constants"; type dataType = { currentAddress: string; @@ -55,6 +57,7 @@ export const Vaults = ({ myVaults, }: dataType) => { const { t } = useTranslation(); + const currentNetwork = useContext(networkContext); const [showLiquidate, setShowLiquidate] = useState(false); const [vaultIndex, setVaultIndex] = useState(-1); const [liqVault, setLiqVault] = useState(null); @@ -174,11 +177,11 @@ export const Vaults = ({ return {capitalize(v.status)}; }; - const vaultButtonLink = (index: number, v: VaultsType) => { + const vaultButtonLink = (v: VaultsType) => { const vtu = { vaultId: v.id, - assetSymbol: "tcap", - collateralSymbol: v.collateralSymbol, + assetSymbol: isArbitrum(currentNetwork.chainId) ? TOKENS_SYMBOLS.JPEGz : TOKENS_SYMBOLS.TCAP, + collateralSymbol: v.collateralSymbol !== "WETH" ? v.collateralSymbol : "ETH", isHardVault: v.isHardVault, }; return ( @@ -188,6 +191,16 @@ export const Vaults = ({ ); }; + const newVault = () => { + const initData = { + vaultId: "0", + assetSymbol: "TCAP", + collateralSymbol: "ETH", + isHardVault: true, + }; + setVaultToUpdate(initData); + }; + return ( <>
- DescriptionRange (TCAP per WETH) + Position + + Position Min and Max price represents TCAP per WETH.
+ Current price is{" "} + + {numberFormatStr(cumulativePrice.toString(), 4, 4)} + {" "} + TCAP per WETH + + } + > + +
+
Status Staked: LP token is staked and earning rewards.
+ Out of range: You aren't earning + rewards beacause the price is out of your position range. } > @@ -323,26 +355,32 @@ const Rewards = ({ -
- - TCAP/WETH Pool
Uniswap -
-
-
- Min: {numberFormatStr(position.tickUpperPrice1.toString(), 4, 4)} +
+
+
+ Min: {numberFormatStr(position.tickUpperPrice1.toString(), 4, 4)} +
+ +
+ Max: {numberFormatStr(position.tickLowerPrice1.toString(), 4, 4)} +
-
- Max: {numberFormatStr(position.tickLowerPrice1.toString(), 4, 4)} +
+ TCAP/WETH Pool + Uniswap
- - {position.status === StakeStatus.not_approved - ? "Pending" - : capitalize(position.status)} - + {position.priceInRange ? ( + + {position.status === StakeStatus.not_approved + ? "Pending" + : capitalize(position.status)} + + ) : ( + Out of range + )}
diff --git a/src/components/Farm/UniV3Rewards/index.tsx b/src/components/Farm/UniV3Rewards/index.tsx index e317189..e0c3a16 100644 --- a/src/components/Farm/UniV3Rewards/index.tsx +++ b/src/components/Farm/UniV3Rewards/index.tsx @@ -4,6 +4,7 @@ import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; import UniswapV3Staker from "../../../contracts/UniswapV3Staker.json"; import NonfungiblePositionManager from "../../../contracts/NonfungiblePositionManager.json"; +import UniV3Pool from "../../../contracts/UniV3Pool.json"; import NetworkContext from "../../../state/NetworkContext"; import { SignerContext } from "../../../state/SignerContext"; import { NETWORKS } from "../../../utils/constants"; @@ -29,6 +30,7 @@ const UniV3Rewards = ({ signer }: props) => { const [stakerContractRead, setStakerContractRead] = useState(); const [nfpmContract, setNfpmContract] = useState(); const [nfpmContractRead, setNfpmContractRead] = useState(); + const [poolContractRead, setPoolContractRead] = useState(); const [apolloClient, setApolloClient] = useState( clientOracle( process.env.REACT_APP_NETWORK_ID === "1" @@ -62,11 +64,13 @@ const UniV3Rewards = ({ signer }: props) => { NonfungiblePositionManager, signer.signer ); + const poolRead = new Contract(UNIV3.rinkeby.tcapPool.id, toFragment(UniV3Pool)); setStakerContractRead(stakerRead); setStakerContract(staker); setNfpmContract(nfpm); setNfpmContractRead(nfpmRead); + setPoolContractRead(poolRead); const oAddress = await signer.signer.getAddress(); setOwnerAddress(oAddress); } @@ -84,6 +88,7 @@ const UniV3Rewards = ({ signer }: props) => { stakerContractRead={stakerContractRead} nfpmContract={nfpmContract} nfpmContractRead={nfpmContractRead} + poolContractRead={poolContractRead} /> ); diff --git a/src/components/Farm/UniV3Rewards/types.tsx b/src/components/Farm/UniV3Rewards/types.tsx index 2707946..d778dc9 100644 --- a/src/components/Farm/UniV3Rewards/types.tsx +++ b/src/components/Farm/UniV3Rewards/types.tsx @@ -3,6 +3,7 @@ export const StakeStatus = { empty: "empty", deposited: "deposited", staked: "staked", + out_range: "out_range", }; export type IncentiveType = { @@ -23,7 +24,24 @@ export type PositionType = { tickUpper: number; tickUpperPrice0: number; tickUpperPrice1: number; + priceInRange: boolean; incetiveId: string; reward: number; status: string; }; + +export const positionDefaultValues = { + lpTokenId: 0, + poolId: "", + liquidity: "0.00", + tickLower: 0, + tickLowerPrice0: 1, + tickLowerPrice1: 1, + tickUpper: 0, + tickUpperPrice0: 1, + tickUpperPrice1: 1, + priceInRange: true, + incetiveId: "", + reward: 0, + status: StakeStatus.empty, +}; diff --git a/src/contracts/UniV3Pool.json b/src/contracts/UniV3Pool.json new file mode 100644 index 0000000..c87d64d --- /dev/null +++ b/src/contracts/UniV3Pool.json @@ -0,0 +1,988 @@ +[ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "name": "Burn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount0", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount1", + "type": "uint128" + } + ], + "name": "Collect", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount0", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount1", + "type": "uint128" + } + ], + "name": "CollectProtocol", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "paid0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "paid1", + "type": "uint256" + } + ], + "name": "Flash", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "observationCardinalityNextOld", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "observationCardinalityNextNew", + "type": "uint16" + } + ], + "name": "IncreaseObservationCardinalityNext", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + }, + { + "indexed": false, + "internalType": "int24", + "name": "tick", + "type": "int24" + } + ], + "name": "Initialize", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "feeProtocol0Old", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "feeProtocol1Old", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "feeProtocol0New", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "feeProtocol1New", + "type": "uint8" + } + ], + "name": "SetFeeProtocol", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "int256", + "name": "amount0", + "type": "int256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "amount1", + "type": "int256" + }, + { + "indexed": false, + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "int24", + "name": "tick", + "type": "int24" + } + ], + "name": "Swap", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "uint128", + "name": "amount", + "type": "uint128" + } + ], + "name": "burn", + "outputs": [ + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "uint128", + "name": "amount0Requested", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1Requested", + "type": "uint128" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint128", + "name": "amount0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1", + "type": "uint128" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint128", + "name": "amount0Requested", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1Requested", + "type": "uint128" + } + ], + "name": "collectProtocol", + "outputs": [ + { + "internalType": "uint128", + "name": "amount0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1", + "type": "uint128" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fee", + "outputs": [ + { + "internalType": "uint24", + "name": "", + "type": "uint24" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feeGrowthGlobal0X128", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feeGrowthGlobal1X128", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "flash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "observationCardinalityNext", + "type": "uint16" + } + ], + "name": "increaseObservationCardinalityNext", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidity", + "outputs": [ + { + "internalType": "uint128", + "name": "", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxLiquidityPerTick", + "outputs": [ + { + "internalType": "uint128", + "name": "", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "observations", + "outputs": [ + { + "internalType": "uint32", + "name": "blockTimestamp", + "type": "uint32" + }, + { + "internalType": "int56", + "name": "tickCumulative", + "type": "int56" + }, + { + "internalType": "uint160", + "name": "secondsPerLiquidityCumulativeX128", + "type": "uint160" + }, + { + "internalType": "bool", + "name": "initialized", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32[]", + "name": "secondsAgos", + "type": "uint32[]" + } + ], + "name": "observe", + "outputs": [ + { + "internalType": "int56[]", + "name": "tickCumulatives", + "type": "int56[]" + }, + { + "internalType": "uint160[]", + "name": "secondsPerLiquidityCumulativeX128s", + "type": "uint160[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "positions", + "outputs": [ + { + "internalType": "uint128", + "name": "_liquidity", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "feeGrowthInside0LastX128", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "feeGrowthInside1LastX128", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "tokensOwed0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "tokensOwed1", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolFees", + "outputs": [ + { + "internalType": "uint128", + "name": "token0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "token1", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "feeProtocol0", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "feeProtocol1", + "type": "uint8" + } + ], + "name": "setFeeProtocol", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "slot0", + "outputs": [ + { + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + }, + { + "internalType": "int24", + "name": "tick", + "type": "int24" + }, + { + "internalType": "uint16", + "name": "observationIndex", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "observationCardinality", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "observationCardinalityNext", + "type": "uint16" + }, + { + "internalType": "uint8", + "name": "feeProtocol", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "unlocked", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + } + ], + "name": "snapshotCumulativesInside", + "outputs": [ + { + "internalType": "int56", + "name": "tickCumulativeInside", + "type": "int56" + }, + { + "internalType": "uint160", + "name": "secondsPerLiquidityInsideX128", + "type": "uint160" + }, + { + "internalType": "uint32", + "name": "secondsInside", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "zeroForOne", + "type": "bool" + }, + { + "internalType": "int256", + "name": "amountSpecified", + "type": "int256" + }, + { + "internalType": "uint160", + "name": "sqrtPriceLimitX96", + "type": "uint160" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "swap", + "outputs": [ + { + "internalType": "int256", + "name": "amount0", + "type": "int256" + }, + { + "internalType": "int256", + "name": "amount1", + "type": "int256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int16", + "name": "wordPosition", + "type": "int16" + } + ], + "name": "tickBitmap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tickSpacing", + "outputs": [ + { + "internalType": "int24", + "name": "", + "type": "int24" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int24", + "name": "tick", + "type": "int24" + } + ], + "name": "ticks", + "outputs": [ + { + "internalType": "uint128", + "name": "liquidityGross", + "type": "uint128" + }, + { + "internalType": "int128", + "name": "liquidityNet", + "type": "int128" + }, + { + "internalType": "uint256", + "name": "feeGrowthOutside0X128", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "feeGrowthOutside1X128", + "type": "uint256" + }, + { + "internalType": "int56", + "name": "tickCumulativeOutside", + "type": "int56" + }, + { + "internalType": "uint160", + "name": "secondsPerLiquidityOutsideX128", + "type": "uint160" + }, + { + "internalType": "uint32", + "name": "secondsOutside", + "type": "uint32" + }, + { + "internalType": "bool", + "name": "initialized", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token0", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token1", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/src/styles/app.scss b/src/styles/app.scss index 6d070ff..d96cfb1 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -302,7 +302,10 @@ html, text-shadow: 0 0 4px #e440f2,0 0 10px #e98ff1,0 0 20px #e440f2,0 -10px 40px #b626c4; } .not_approved { - text-shadow: 0 0 4px #c33,0 0 10px rgb(236, 97, 97),0 0 20px #c33,0 -10px 40px #c33; + text-shadow: 0 0 4px #eeb173,0 0 10px rgb(236, 97, 97),0 0 20px #eeb173,0 -10px 40px #c33; + } + .out_range { + text-shadow: 0 0 4px rgb(233, 42, 42),0 0 10px rgb(236, 97, 97),0 0 20px rgb(233, 42, 42),0 -10px 40px #c33; } } diff --git a/src/styles/farm.scss b/src/styles/farm.scss index aa65be7..881575c 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -368,6 +368,41 @@ } } } + .position { + padding-right: 4rem; + .description{ + display: flex; + align-items: center; + font-weight: bold; + small { + margin-left: 10px; + } + } + .tokens { + font-size: 0.9rem; + color: $purple ; + } + .status { + font-size: 0.6rem; + font-family: "Space Mono"; + background-color: #281e31; + padding: 0.2rem; + border-radius: 5px; + border: 1px solid #38d6b2; + } + .ranges { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + .min-range { + font-size: 1rem; + } + .max-range { + font-size: 1rem; + } + } + } .empty { text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; } @@ -378,7 +413,10 @@ text-shadow: 0 0 4px #e440f2,0 0 10px #e98ff1,0 0 20px #e440f2,0 -10px 40px #b626c4; } .not_approved { - text-shadow: 0 0 4px #c33,0 0 10px rgb(236, 97, 97),0 0 20px #c33,0 -10px 40px #c33; + text-shadow: 0 0 4px #eeb173,0 0 10px rgb(236, 97, 97),0 0 20px #eeb173,0 -10px 40px #c33; + } + .out_range { + text-shadow: 0 0 4px rgb(233, 42, 42),0 0 10px rgb(236, 97, 97),0 0 20px rgb(233, 42, 42),0 -10px 40px #c33; } .empty-lp{ display: flex; @@ -394,7 +432,10 @@ padding: 15px; } .icons { + display: flex; + align-items: center; padding: 5px; + padding-top: 0px; } .description { margin-left: 10px; @@ -422,7 +463,7 @@ .btn:hover { color: $white; } - .small { + small { margin-left: -10px; } } diff --git a/src/styles/tower.scss b/src/styles/tower.scss new file mode 100644 index 0000000..6ad1123 --- /dev/null +++ b/src/styles/tower.scss @@ -0,0 +1,88 @@ +/* First lets set a background */ +.bg{ + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: url('https://images.unsplash.com/photo-1431352832634-845fad190fbd?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&s=ec80c41e488dc2b99ed543df2f3f0919'); + background-position: center center; + background-origin: content-box; + background-size: cover; + background-attachment: fixed; + z-index: -2; +} + +/* Now the same background, but with brightness filters*/ +.lightning{ + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: url('https://images.unsplash.com/photo-1431352832634-845fad190fbd?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&s=ec80c41e488dc2b99ed543df2f3f0919'); + background-position: center center; + background-origin: content-box; + background-size: cover; + background-attachment: fixed; + -webkit-filter: brightness(3); + filter: brightness(3); + -o-filter: brightness(3); + -moz-filter: brightness(3); + z-index: -1; +} + +/*Now just a opacity animation*/ +.flashit{ +-webkit-animation: flash ease-out 7s infinite; +-moz-animation: flash ease-out 7s infinite; +animation: flash ease-out 7s infinite; +animation-delay: 2s; +} + +@-webkit-keyframes flash { + from { opacity: 0; } + 92% { opacity: 0; } + 93% { opacity: 0.6; } + 94% { opacity: 0.2; } + 96% { opacity: 0.9; } + to { opacity: 0; } +} + +@keyframes flash { + from { opacity: 0; } + 92% { opacity: 0; } + 93% { opacity: 0.6; } + 94% { opacity: 0.2; } + 96% { opacity: 1; } + to { opacity: 0; } +} +/*End! is that simple! */ + +/*Now just some stupid logo to get some look and feel */ +#logo{ + z-index:1000; + width: 100%; + font-size: 6rem; + color: white; + position: fixed; + top: 50%; + left: 50%; + margin-left: -18rem; + margin-top: -2rem; + font-weight: 900; +} +#logo span{ font-weight: 100;} + +html , body{ + font-family: "Titillium Web", "lato" , sans-serif; +} +@import url(https://fonts.googleapis.com/css?family=Titillium+Web:200,900|Lato:100,300,900); + +@media screen and (max-width: 630px){ + #logo{ + font-size: 3rem; + margin-left: -9rem; + margin-top: -1rem; + } +} \ No newline at end of file diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 8e486f9..f82fc71 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { ethers, utils } from "ethers"; +import { BigNumber, ethers, utils } from "ethers"; import { Fragment, JsonFragment } from "@ethersproject/abi"; import { toast } from "react-toastify"; import toasty from "../assets/images/toasty.png"; @@ -398,3 +398,17 @@ export const numberFormatStr = ( } return numberFormat.format(parseFloat(value)); }; + +// token0 = TCAP, and token1 = WETH +export const calculateCumulativePrice = ( + tickCumulative0: BigNumber, + tickCumulative1: BigNumber, + timeElapsed: number +): number => { + const difference = tickCumulative1.sub(tickCumulative0); + const tickReading = difference.div(BigNumber.from(timeElapsed)); + // p(i) = 1.0001**i + const price = 1.0001 ** tickReading.toNumber(); + + return price; +}; From 3b7fc51610f270f982ef9b4e7cc784934298ada4 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 13 Apr 2022 09:18:24 -0600 Subject: [PATCH 089/278] not nee to phase env --- src/components/Farm/index.tsx | 578 +++++++++++++++++----------------- 1 file changed, 288 insertions(+), 290 deletions(-) diff --git a/src/components/Farm/index.tsx b/src/components/Farm/index.tsx index b727407..d974525 100644 --- a/src/components/Farm/index.tsx +++ b/src/components/Farm/index.tsx @@ -450,343 +450,341 @@ const Farm = () => { {isInLayer1(currentNetwork.chainId) && } - {phase > 1 && ( - -

{t("farming.liquidity")}

- - - - - - - + +
- {t("description")}{t("balance")}{t("stake")} -
-
{t("farming.unlocked")}
-
- - {t("farming.unlocked-info")} - - } - > - - -
+ +

{t("farming.liquidity")}

+ + + + + + + - + {" "} - - - - - - - - + + + + + + + + + + - + - - - + - - - - - - + + + + + {" "} + + {" "} + {" "} - - + {" "} - - + - - - -
+ {t("description")}{t("balance")}{t("stake")} +
+
{t("farming.unlocked")}
+
+ + {t("farming.unlocked-info")} + + } + > + +
-
-
-
{t("farming.locked")}
-
- - {t("farming.locked-info")} - - } - > - - -
+
+
+
+
{t("farming.locked")}
+
+ + {t("farming.locked-info")} + + } + > + +
-
APY -
- - - - - {t("farming.eth-tcap-pool")}
SushiSwap -
-
+ + {" "} + APY +
+ + + + + {t("farming.eth-tcap-pool")}
SushiSwap +
+
+ {" "} + + {" "} + + {" "} + CTX + +
{" "} -
+ CTX + +
+ + {tsToDateString(vestingEndTime)} + +
+
+ {" "} - - {" "} - CTX - -
- {" "} - CTX -
-
- - {tsToDateString(vestingEndTime)} - -
-
- - + % + + + {address === "" ? ( + <> + + + + + ) : ( + <> + - {address === "" ? ( - <> - - - - - ) : ( - <> + onClick={() => { + setStakeBalance(ethPoolBalance); + setSelectedPoolTitle("SushiSwap ETH/TCAP Pool"); + if (rewards.wethPoolReward) { + setSelectedPool(rewards.wethPoolReward); + setSelectedPoolToken(tokens.wethPoolToken); + } + setStakeShow(true); + }} + > + {t("stake")} + + {ethVestAmount.eq(0) ? ( - {ethVestAmount.eq(0) ? ( - - ) : ( - - )} + ) : ( - - )} -
- - - - - {t("farming.eth-ctx-pool")}
SushiSwap -
-
+ )} + + + )} +
+ + + + + {t("farming.eth-ctx-pool")}
SushiSwap +
+
+ {" "} + + {" "} + + {" "} + CTX + +
{" "} -
- {" "} - + CTX + +
+ + {tsToDateString(ctxVestingEndTime)} + +
+
+ {" "} - CTX - -
- {" "} - CTX -
-
- - {tsToDateString(ctxVestingEndTime)} - -
-
- - + % + + + {address === "" ? ( + <> + + + + + ) : ( + <> + - {address === "" ? ( - <> - - - - - ) : ( - <> + onClick={() => { + setStakeBalance(ctxPoolBalance); + setSelectedPoolTitle("SushiSwap ETH/CTX Pool"); + if (rewards.ctxPoolReward) { + setSelectedPool(rewards.ctxPoolReward); + setSelectedPoolToken(tokens.ctxPoolToken); + } + setStakeShow(true); + }} + > + {t("stake")} + + {ctxVestAmount.gt(0) && showCtxClaimVest() ? ( - {ctxVestAmount.gt(0) && showCtxClaimVest() ? ( - - ) : ( - - )} + ) : ( - - )} -
-
- )} + )} + + + )} + +
+
From c29a9faf44adcaa44ff54b1d030dea9fa6d715ed Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 14 Apr 2022 11:26:53 -0600 Subject: [PATCH 090/278] new keeper added --- src/components/Governance/data.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/components/Governance/data.tsx b/src/components/Governance/data.tsx index b4d0860..3e2a2f8 100644 --- a/src/components/Governance/data.tsx +++ b/src/components/Governance/data.tsx @@ -132,4 +132,14 @@ export const delegatorsInfo = [ discord: "PlayChessAndScrew#4369", twitter: "", }, + { + address: "0x3DE2EE1A6f7397653C8C7981ca7473487dE30c39", + name: "Noon", + eth_name: "0x3DE2EE1A6f7397653C8C7981ca7473487dE30c39", + image: "", + expertise: ["Brand", "Market and Customer Analysis"], + why: "My academic background is in logical analysis and psychology. My professional expertise is market management and customer analysis via bleeding edge psychometric science in conjunction with psychoanalytic pragmatics.My essential aim is to ensure that the Cryptex system is continually moving towards a higher intrinsic value to the crypto community through rigorous analysis of its potential use cases. I believe Cryptex has not only the potential to become a fundamental institution of the future of finance, but it is incumbent upon it to do so as a consequence of its profoundly innovative architecture.What are my principles?1. My first and foremost priority is the development of potential use cases for the Cryptex system2. Priority two is the in-depth analysis of the needs of the Crypto community as it pertains to the potential use cases of the Cryptex System that are most desirable to it3. Priority three is ensuring the long term stability and profitability of Cryptex as a decentralized platform through", + discord: "Noon#0954", + twitter: "", + }, ]; From 7d79c9df9130ae37bd2d389a9d8f60d98bb72d8c Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 14 Apr 2022 11:28:18 -0600 Subject: [PATCH 091/278] enable keepers api --- src/utils/constants.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index be3fbf8..3b71e5f 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -85,7 +85,7 @@ export const GRAPHQL_ENDPOINT = { }; export const FEATURES = { - KEEPERS_API: false, + KEEPERS_API: true, NEW_VAULTS: true, OPTIMISM: true, POLYGON: true, From 9d0156f216ee7f301524c8f315cd88aa3c1cb722 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 14 Apr 2022 12:03:29 -0600 Subject: [PATCH 092/278] new keeper image --- public/images/noontide.png | Bin 0 -> 43889 bytes src/components/Governance/data.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 public/images/noontide.png diff --git a/public/images/noontide.png b/public/images/noontide.png new file mode 100644 index 0000000000000000000000000000000000000000..63465778b6b8fdf8fc3800c67a82360fe9445318 GIT binary patch literal 43889 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 Date: Mon, 18 Apr 2022 22:14:25 -0600 Subject: [PATCH 093/278] added new hard vaults --- src/App.tsx | 41 + src/assets/images/vault/usdc.svg | 4 + src/components/Vault/Details.tsx | 638 +- src/components/Vault/Monitoring/index.tsx | 84 +- src/components/Vault/Monitoring/types.tsx | 6 + src/contracts/cryptex.json | 22214 +++++++++++++------- src/hooks/useHardVaults.tsx | 25 + src/hooks/useOracles.tsx | 12 + src/hooks/useTokens.tsx | 12 + src/state/HardVaultsContext.tsx | 12 + src/state/OraclesContext.tsx | 6 + src/state/TokensContext.tsx | 6 + src/styles/vault.scss | 12 + 13 files changed, 14785 insertions(+), 8287 deletions(-) create mode 100644 src/assets/images/vault/usdc.svg diff --git a/src/App.tsx b/src/App.tsx index cb2c217..511712f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -155,6 +155,18 @@ const App = () => { currentSigner ); hardVaults.setCurrentWETHVault(currentHardWETHVault); + const currentHardDAIVault = new ethers.Contract( + contracts.HardDaiVaultHandler.address, + contracts.HardDaiVaultHandler.abi, + currentSigner + ); + hardVaults.setCurrentDAIVault(currentHardDAIVault); + const currentHardUSDCVault = new ethers.Contract( + contracts.HardUSDCVaultHandler.address, + contracts.HardUSDCVaultHandler.abi, + currentSigner + ); + hardVaults.setCurrentUSDCVault(currentHardUSDCVault); const currentAVEEVaultRead = new Contract( contracts.AaveVaultHandler.address, @@ -166,6 +178,16 @@ const App = () => { toFragment(contracts.HardWETHVaultHandler.abi) ); hardVaults.setCurrentWETHVaultRead(currentHardWETHVaultRead); + const currentHardDAIVaultRead = new Contract( + contracts.HardDaiVaultHandler.address, + toFragment(contracts.HardDaiVaultHandler.abi) + ); + hardVaults.setCurrentDAIVaultRead(currentHardDAIVaultRead); + const currentHardUSDCVaultRead = new Contract( + contracts.HardUSDCVaultHandler.address, + toFragment(contracts.HardUSDCVaultHandler.abi) + ); + hardVaults.setCurrentUSDCVaultRead(currentHardUSDCVaultRead); // Tokens const currentAAVEToken = new ethers.Contract( @@ -174,9 +196,17 @@ const App = () => { currentSigner ); tokens.setCurrentAAVEToken(currentAAVEToken); + const currentUSDCToken = new ethers.Contract( + contracts.USDC.address, + contracts.USDC.abi, + currentSigner + ); + tokens.setCurrentUSDCToken(currentUSDCToken); const currentAAVETokenRead = new Contract(contracts.AAVE.address, contracts.AAVE.abi); tokens.setCurrentAAVETokenRead(currentAAVETokenRead); + const currentUSDCTokenRead = new Contract(contracts.USDC.address, contracts.USDC.abi); + tokens.setCurrentUSDCTokenRead(currentUSDCTokenRead); // Set Rewards const currentWETHReward = new ethers.Contract( @@ -247,11 +277,22 @@ const App = () => { currentSigner ); oracles.setCurrentAAVEOracle(currentAAVEOracle); + const currentUSDCOracle = new ethers.Contract( + contracts.USDCOracle.address, + contracts.USDCOracle.abi, + currentSigner + ); + oracles.setCurrentUSDCOracle(currentUSDCOracle); const currentAAVEOracleRead = new Contract( contracts.AaveOracle.address, contracts.AaveOracle.abi ); oracles.setCurrentAAVEOracleRead(currentAAVEOracleRead); + const currentUSDCOracleRead = new Contract( + contracts.USDCOracle.address, + contracts.USDCOracle.abi + ); + oracles.setCurrentUSDCOracleRead(currentUSDCOracleRead); // Set Governance const currentDelegatorFactory = new ethers.Contract( diff --git a/src/assets/images/vault/usdc.svg b/src/assets/images/vault/usdc.svg new file mode 100644 index 0000000..650001e --- /dev/null +++ b/src/assets/images/vault/usdc.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index aedf440..b661f93 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -28,6 +28,7 @@ import { ReactComponent as UNIIconSmall } from "../../assets/images/vault/uni.sv import { ReactComponent as SNXIconSmall } from "../../assets/images/vault/snx2.svg"; import { ReactComponent as POLYGONIconSmall } from "../../assets/images/vault/polygon.svg"; import { ReactComponent as WBTCIconSmall } from "../../assets/images/vault/bitcoin.svg"; +import { ReactComponent as USDCIconSmall } from "../../assets/images/vault/usdc.svg"; import { ReactComponent as RatioIcon } from "../../assets/images/vault/ratio.svg"; import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; import { @@ -105,6 +106,14 @@ const Details = ({ address, t }: props) => { history?.push(`/vault/ETH`); } break; + case "usdc": + if (isInLayer1(currentNetwork.chainId) && isHardMode()) { + currency = "USDC"; + } else { + currency = "ETH"; + history?.push(`/vault/ETH`); + } + break; case "link": if (!isPolygon(currentNetwork.chainId) && !isHardMode()) { currency = "LINK"; @@ -306,8 +315,8 @@ const Details = ({ address, t }: props) => { currentTokenRead = tokens.wethTokenRead; break; case "DAI": - currentVault = vaults.daiVault; - currentVaultRead = vaults.daiVaultRead; + currentVault = !isHardMode() ? vaults.daiVault : hardVaults.daiVault; + currentVaultRead = !isHardMode() ? vaults.daiVaultRead : hardVaults.daiVaultRead; currentToken = tokens.daiToken; currentOracleRead = oracles.daiOracleRead; currentTokenRead = tokens.daiTokenRead; @@ -356,6 +365,14 @@ const Details = ({ address, t }: props) => { currentTokenRead = tokens.wbtcTokenRead; // balance = await provider.getBalance(address); break; + case "USDC": + currentVault = hardVaults.usdcVault; + currentVaultRead = hardVaults.usdcVaultRead; + currentToken = tokens.usdcToken; + currentOracleRead = oracles.usdcOracleRead; + currentTokenRead = tokens.usdcTokenRead; + // balance = await provider.getBalance(address); + break; default: currentVault = vaults.wethVault; currentVaultRead = vaults.wethVaultRead; @@ -502,6 +519,7 @@ const Details = ({ address, t }: props) => { const usdBalance = toUSD(currentPrice, currentBalance); setTokenBalanceUSD(usdBalance.toString()); + setLoadingMode(false); } } @@ -520,7 +538,6 @@ const Details = ({ address, t }: props) => { setSelectedVault("MATIC"); } loadVault(vaultType, data); - setLoadingMode(false); }, }); @@ -549,10 +566,17 @@ const Details = ({ address, t }: props) => { setBurnTxt(""); }; - const handleRadioBtnChange = (value: string) => { + const handleRadioBtnChange = async (value: string) => { setLoadingMode(true); setVaultMode(value); - refresh(); + setIsApproved(false); + setTokenBalance("0"); + setTokenBalanceUSD("0"); + setSelectedVault("ETH"); + + history?.push(`/vault/ETH`); + resetFields(); + await refetch(); }; const changeVault = async (newRatio: number, reset = false) => { @@ -801,6 +825,10 @@ const Details = ({ address, t }: props) => { }; const mintTCAP = async () => { + /* tokens.daiToken?.mint( + "0xF6a16a48099497C59e8abEAa37Bb37B2F9B793d4", + BigNumber.from("100000000000") + ); */ if (mintTxt) { setBtnDisabled(true); try { @@ -976,7 +1004,7 @@ const Details = ({ address, t }: props) => { async function load() { let vOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK", "WBTC"]; if (isHardMode()) { - vOptions = ["ETH", "WETH"]; + vOptions = ["ETH", "WETH", "DAI", "USDC"]; } if (isOptimism(currentNetwork.chainId) && !isHardMode()) { vOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; @@ -994,7 +1022,7 @@ const Details = ({ address, t }: props) => { // eslint-disable-next-line }, [address, data]); - if (isLoading || loadingMode) { + if (isLoading) { return (
@@ -1041,6 +1069,8 @@ const Details = ({ address, t }: props) => { return ; case "WBTC": return ; + case "USDC": + return ; default: return ; } @@ -1087,6 +1117,8 @@ const Details = ({ address, t }: props) => { return ; case "WBTC": return ; + case "USDC": + return ; default: return ; } @@ -1137,302 +1169,322 @@ const Details = ({ address, t }: props) => { ))}
- {isApproved ? ( + {loadingMode ? ( +
+ +
+ ) : ( <> -
-
- - - - - -
-

{t("vault.balance-title", { vault: selectedVault })}

- -
-
-
- - -
-

{t("vault.ratio-title")}

{" "} - {t("vault.ratio-warning", { minRatio })} - } - > - - -
-
-

- -

+ {isApproved ? ( + <> +
+
+ + + + + +
+

{t("vault.balance-title", { vault: selectedVault })}

+ +
+
+
+ + +
+

{t("vault.ratio-title")}

{" "} + + {t("vault.ratio-warning", { minRatio })} + + } + > + + +
+
+

+ +

+
+

{vaultStatus.toUpperCase()}

+
-

{vaultStatus.toUpperCase()}

-
+
- -
-
- -
-

{t("vault.collateral.title")}

-
-
- {(() => { - switch (selectedVault) { - case "DAI": - return ; - case "AAVE": - return ; - case "LINK": - return ; - case "SNX": - return ; - case "UNI": - return ; - case "MATIC": - return ; - case "WBTC": - return ; - default: - return ; - } - })()} -

- -

+
+ +
+

{t("vault.collateral.title")}

+
+
+ {(() => { + switch (selectedVault) { + case "DAI": + return ; + case "AAVE": + return ; + case "LINK": + return ; + case "SNX": + return ; + case "UNI": + return ; + case "MATIC": + return ; + case "WBTC": + return ; + case "USDC": + return ; + default: + return ; + } + })()} +

+ +

+
+

+ 1000 ? 0 : 2} + /> +

+
-

- 1000 ? 0 : 2} - /> -

-
+
+ + {t("vault.collateral.add")} + + + {t("max")} + + + + + + + + + + + + + + {t("vault.collateral.remove")} + + + {t("max-safe")} + + + + + + + + + + + + +
+
-
- - {t("vault.collateral.add")} - - - {t("max")} - - - - - - - - - - - - - - {t("vault.collateral.remove")} - - - {t("max-safe")} - - - - - - - - - - - - -
- -
-
- -
-

{t("vault.debt.title")}

-
-
- -

- -

+
+ +
+

{t("vault.debt.title")}

+
+
+ +

+ +

+
+

+ 1000 ? 0 : 2} + /> +

+
-

- 1000 ? 0 : 2} - /> -

-
+
+ + {t("vault.debt.mint")} + + + {t("max-safe")} + + + + + + + + + + + + + + {t("vault.debt.burn")} + + + {t("max")} + + + + + + + + + + + + + {t("vault.debt.fee")}:{" "} + {" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} + + +
+
-
- - {t("vault.debt.mint")} - - - {t("max-safe")} - - - - - - - - - - - - - - {t("vault.debt.burn")} - - - {t("max")} - - - - - - - - - - - - - {t("vault.debt.fee")}:{" "} - {" "} - {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} - - -
+
+ + ) : ( +
+ + + + + + +
{title}
+

{text}

+ +
-
+ )} - ) : ( -
- - - - - - -
{title}
-

{text}

- -
-
-
)} ); diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index a216026..04da3ba 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -13,6 +13,7 @@ import NetworkContext from "../../../state/NetworkContext"; import OraclesContext from "../../../state/OraclesContext"; import SignerContext from "../../../state/SignerContext"; import vaultsContext from "../../../state/VaultsContext"; +import hardVaultsContext from "../../../state/HardVaultsContext"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; import { getRatio2, @@ -66,6 +67,7 @@ export const Monitoring = () => { const currentNetwork = useContext(NetworkContext); const oracles = useContext(OraclesContext); const vaults = useContext(vaultsContext); + const hardVaults = useContext(hardVaultsContext); const signer = useContext(SignerContext); const [skipQuery, setSkipQuery] = useState(false); const [currentAddress, setCurrentAddress] = useState(""); @@ -149,6 +151,7 @@ export const Monitoring = () => { "debt " + "currentRatio " + "tokenSymbol " + + "hardVault " + "blockTS " + "} " + "}"; @@ -171,9 +174,11 @@ export const Monitoring = () => { const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); ethcalls.push(wethOraclePriceCall); ethcalls.push(aaveOraclePriceCall); ethcalls.push(linkOraclePriceCall); + ethcalls.push(usdcOraclePriceCall); } if (isOptimism(currentNetwork.chainId)) { const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); @@ -200,11 +205,18 @@ export const Monitoring = () => { let uniOraclePrice = BigNumber.from(0); let maticOraclePrice = BigNumber.from(0); let wbtcOraclePrice = BigNumber.from(0); + let usdcOraclePrice = BigNumber.from(0); if (isInLayer1(currentNetwork.chainId)) { // @ts-ignore - [tcapOraclePrice, daiOraclePrice, wethOraclePrice, aaveOraclePrice, linkOraclePrice] = - await signer.ethcallProvider?.all(ethcalls); + [ + tcapOraclePrice, + daiOraclePrice, + wethOraclePrice, + aaveOraclePrice, + linkOraclePrice, + usdcOraclePrice, + ] = await signer.ethcallProvider?.all(ethcalls); } else if (isOptimism(currentNetwork.chainId)) { // @ts-ignore [ @@ -231,6 +243,7 @@ export const Monitoring = () => { snxOraclePrice: ethers.utils.formatEther(snxOraclePrice.mul(10000000000)), maticOraclePrice: ethers.utils.formatEther(maticOraclePrice.mul(10000000000)), wbtcOraclePrice: ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)), + usdcOraclePrice: ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)), }); setPricesUpdated(true); } @@ -245,9 +258,15 @@ export const Monitoring = () => { const wethRatioCall = await vaults.wethVaultRead?.ratio(); const aaveRatioCall = await vaults.aaveVaultRead?.ratio(); const linkRatioCall = await vaults.linkVaultRead?.ratio(); + const hardWethRatioCall = await hardVaults.wethVaultRead?.ratio(); + const hardDaiRatioCall = await hardVaults.daiVaultRead?.ratio(); + const hardUsdcRatioCall = await hardVaults.usdcVaultRead?.ratio(); ethcalls.push(wethRatioCall); ethcalls.push(aaveRatioCall); ethcalls.push(linkRatioCall); + ethcalls.push(hardWethRatioCall); + ethcalls.push(hardDaiRatioCall); + ethcalls.push(hardUsdcRatioCall); } if (isOptimism(currentNetwork.chainId)) { const wethRatioCall = await vaults.wethVaultRead?.ratio(); @@ -273,10 +292,14 @@ export const Monitoring = () => { let uniRatio = 0; let maticRatio = 0; let wbtcRatio = 0; + let hardEthRatio = 0; + let hardDaiRatio = 0; + let hardUsdcRatio = 0; if (isInLayer1(currentNetwork.chainId)) { // @ts-ignore - [daiRatio, ethRatio, aaveRatio, linkRatio] = await signer.ethcallProvider?.all(ethcalls); + [daiRatio, ethRatio, aaveRatio, linkRatio, hardEthRatio, hardDaiRatio, hardUsdcRatio] = + await signer.ethcallProvider?.all(ethcalls); } else if (isOptimism(currentNetwork.chainId)) { // @ts-ignore [daiRatio, ethRatio, linkRatio, snxRatio, uniRatio] = await signer.ethcallProvider?.all( @@ -296,6 +319,10 @@ export const Monitoring = () => { snxRatio, maticRatio, wbtcRatio, + hardEthRatio, + hardWethRatio: hardEthRatio, + hardDaiRatio, + hardUsdcRatio, }); } }; @@ -330,23 +357,38 @@ export const Monitoring = () => { case "WBTC": price = oraclePrices?.wbtcOraclePrice || "0"; break; + case "USDC": + price = oraclePrices?.usdcOraclePrice || "0"; + break; default: break; } return price; }; - const getMinRatio = (symbol: string) => { + const getMinRatio = (symbol: string, isHardVault: boolean) => { let minRatio = 200; switch (symbol) { case "ETH": - minRatio = vaultsRatio?.ethRatio || 200; + if (isHardVault) { + minRatio = vaultsRatio?.hardEthRatio || 1100; + } else { + minRatio = vaultsRatio?.ethRatio || 200; + } break; case "WETH": - minRatio = vaultsRatio?.ethRatio || 200; + if (isHardVault) { + minRatio = vaultsRatio?.hardWethRatio || 110; + } else { + minRatio = vaultsRatio?.ethRatio || 200; + } break; case "DAI": - minRatio = vaultsRatio?.daiRatio || 200; + if (isHardVault) { + minRatio = vaultsRatio?.hardDaiRatio || 110; + } else { + minRatio = vaultsRatio?.daiRatio || 200; + } break; case "AAVE": minRatio = vaultsRatio?.aaveRatio || 200; @@ -366,6 +408,9 @@ export const Monitoring = () => { case "WBTC": minRatio = vaultsRatio?.wbtcRatio || 200; break; + case "USDC": + minRatio = vaultsRatio?.hardUsdcRatio || 110; + break; default: break; } @@ -461,14 +506,15 @@ export const Monitoring = () => { const calculateVaultData = ( collateralWei: ethers.BigNumberish, debtWei: ethers.BigNumberish, - symbol: string + symbol: string, + isHardVault: boolean ) => { const collateralText = ethers.utils.formatEther(collateralWei); const debtText = ethers.utils.formatEther(debtWei); const collateralPrice = getCollateralPrice(symbol); const collateralUSD = toUSD(collateralText, collateralPrice); const debtUSD = toUSD(debtText, oraclePrices?.tcapOraclePrice || "0"); - const minRatio = getMinRatio(symbol); + const minRatio = getMinRatio(symbol, isHardVault); const ratio = getRatio2( collateralText, collateralPrice, @@ -498,7 +544,7 @@ export const Monitoring = () => { // @ts-ignore vaultsData.vaults.forEach((v) => { const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = - calculateVaultData(v.collateral, v.debt, v.tokenSymbol); + calculateVaultData(v.collateral, v.debt, v.tokenSymbol, v.hardVault); let addVault = true; if (currentStatus === VAULT_STATUS.active || currentStatus === VAULT_STATUS.liquidation) { @@ -507,7 +553,7 @@ export const Monitoring = () => { if (!showAllVaults) { addVault = v.tokenSymbol === "WETH" || v.tokenSymbol === "DAI"; } - if (addVault && v.tokenSymbol !== "WBTC") { + if (addVault && v.tokenSymbol !== "WBTC" && v.tokenSymbol !== "USDC") { let vaultUrl = ""; const symbol = v.tokenSymbol === "WETH" ? "ETH" : v.tokenSymbol; if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { @@ -529,6 +575,7 @@ export const Monitoring = () => { debtUsd: debtUSD.toFixed(2), ratio, minRatio: minRatio.toString(), + isHardVault: v.hardVault, netReward: 0, status, blockTS: v.blockTS, @@ -655,9 +702,16 @@ export const Monitoring = () => { const updateLiquidatedVault = async (index: number, symbol: string) => { let currentVault = vaults?.wethVault; + if (vaultList[index].isHardVault) { + currentVault = hardVaults?.wethVault; + } switch (symbol) { case "DAI": - currentVault = vaults?.daiVault; + if (vaultList[index].isHardVault) { + currentVault = hardVaults?.daiVault; + } else { + currentVault = vaults?.daiVault; + } break; case "AAVE": currentVault = vaults?.aaveVault; @@ -677,6 +731,9 @@ export const Monitoring = () => { case "WBTC": currentVault = vaults?.wbtcVault; break; + case "USDC": + currentVault = hardVaults?.usdcVault; + break; default: break; } @@ -684,7 +741,7 @@ export const Monitoring = () => { BigNumber.from(vaultList[index].id) ); const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = - calculateVaultData(collateral, debt, symbol); + calculateVaultData(collateral, debt, symbol, vaultList[index].isHardVault); const allVaults = vaultList; const v = { id: vaultId, @@ -695,6 +752,7 @@ export const Monitoring = () => { debtUsd: debtUSD.toFixed(2), ratio, minRatio: minRatio.toString(), + isHardVault: vaultList[index].isHardVault, netReward: 0, status, blockTS: vaultList[index].blockTS, diff --git a/src/components/Vault/Monitoring/types.tsx b/src/components/Vault/Monitoring/types.tsx index cff2616..81fe304 100644 --- a/src/components/Vault/Monitoring/types.tsx +++ b/src/components/Vault/Monitoring/types.tsx @@ -18,6 +18,7 @@ export type OraclePricesType = { snxOraclePrice: string; maticOraclePrice: string; wbtcOraclePrice: string; + usdcOraclePrice: string; }; export type VaultsRatioType = { @@ -30,6 +31,10 @@ export type VaultsRatioType = { snxRatio: number; maticRatio: number; wbtcRatio: number; + hardEthRatio: number; + hardWethRatio: number; + hardDaiRatio: number; + hardUsdcRatio: number; }; export type VaultsType = { @@ -41,6 +46,7 @@ export type VaultsType = { debtUsd: string; ratio: number; minRatio: string; + isHardVault: boolean; netReward: number; status: string; blockTS: string; diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index e46fde3..df9343f 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -15881,7 +15881,7 @@ ] }, "HardWETHVaultHandler": { - "address": "0x5Da610f142f6762AB7f64aa305c39563a1cF336e", + "address": "0x6E3B4E276f22C30085882dD1342995773AE76414", "abi": [ { "inputs": [ @@ -15939,6 +15939,11 @@ "internalType": "address", "name": "_treasury", "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" } ], "stateMutability": "nonpayable", @@ -17180,20 +17185,73 @@ "type": "receive" } ] - } - } - } - }, - "4": { - "rinkeby": { - "name": "rinkeby", - "chainId": "4", - "contracts": { - "AAVE": { - "address": "0x8B4A041A619aC26B33e5BAEe9585e569387ec837", + }, + "HardDaiVaultHandler": { + "address": "0x95ac341B6492954DF1341A33cAC9AB3273179232", "abi": [ { - "inputs": [], + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "constructor" }, @@ -17203,23 +17261,23 @@ { "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" } ], - "name": "Approval", + "name": "CollateralAdded", "type": "event" }, { @@ -17228,329 +17286,367 @@ { "indexed": true, "internalType": "address", - "name": "from", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" } ], - "name": "Transfer", + "name": "CollateralRemoved", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewBurnFee", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewLiquidationPenalty", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_minimumTCAP", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewMinimumTCAP", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "_owner", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_ratio", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" + "name": "NewRatio", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewTreasury", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "increaseAllowance", - "outputs": [ + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "_account", + "name": "_token", "type": "address" }, { + "indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Recovered", + "type": "event" }, { - "inputs": [], - "name": "name", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { - "inputs": [], - "name": "symbol", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "recipient", + "name": "_owner", "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "amount", + "name": "_id", "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "TokensBurned", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "sender", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "recipient", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "transferFrom", - "outputs": [ + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "AaveOracle": { - "address": "0x73Ebb8b08f056F451c2aA53dCAd7A35ce6aD52D0", - "abi": [ + "name": "Unpaused", + "type": "event" + }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_aggregator", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "_timelock", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "VaultCreated", + "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "_liquidator", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" } ], - "name": "OwnershipTransferred", + "name": "VaultLiquidated", "type": "event" }, { "inputs": [], - "name": "getLatestAnswer", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "int256", + "internalType": "bytes32", "name": "", - "type": "int256" + "type": "bytes32" } ], "stateMutability": "view", @@ -17558,32 +17654,25 @@ }, { "inputs": [], - "name": "getLatestRound", + "name": "ETHPriceOracle", "outputs": [ { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" - }, + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ { - "internalType": "uint80", + "internalType": "uint8", "name": "", - "type": "uint80" + "type": "uint8" } ], "stateMutability": "view", @@ -17591,7 +17680,7 @@ }, { "inputs": [], - "name": "getLatestTimestamp", + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -17603,38 +17692,39 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousAnswer", + "inputs": [], + "name": "MIN_RATIO", "outputs": [ { - "internalType": "int256", + "internalType": "uint256", "name": "", - "type": "int256" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "uint256", + "name": "price", + "type": "uint256" } ], - "name": "getPreviousTimestamp", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", "outputs": [ { - "internalType": "uint256", + "internalType": "contract TCAP", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -17643,37 +17733,50 @@ { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "getRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ { - "internalType": "uint80", + "internalType": "contract IERC20", "name": "", - "type": "uint80" + "type": "address" } ], "stateMutability": "view", @@ -17681,10 +17784,23 @@ }, { "inputs": [], - "name": "owner", + "name": "collateralDecimalsAdjustmentFactor", "outputs": [ { - "internalType": "address", + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", "name": "", "type": "address" } @@ -17694,563 +17810,595 @@ }, { "inputs": [], - "name": "renounceOwnership", + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { - "internalType": "address", - "name": "_aggregator", + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", "type": "address" } ], - "name": "setReferenceContract", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "supportsInterface", + "name": "getRoleAdmin", "outputs": [ { - "internalType": "bool", + "internalType": "bytes32", "name": "", - "type": "bool" + "type": "bytes32" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ { "internalType": "address", - "name": "newOwner", + "name": "", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "AaveVaultHandler": { - "address": "0x119D37aFc784C81626b08813D83598b8673EEE66", - "abi": [ + }, { "inputs": [ { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ { "internalType": "uint256", - "name": "_divisor", + "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "_ratio", + "name": "_id", "type": "uint256" - }, + } + ], + "name": "getVault", + "outputs": [ { "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" }, { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" }, { "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardHandler", + "name": "", "type": "address" }, { - "internalType": "address", - "name": "_treasury", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, - { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_vaultId", "type": "uint256" } ], - "name": "CollateralAdded", - "type": "event" + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { "internalType": "address", - "name": "_owner", + "name": "account", "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", - "name": "_id", + "name": "_vaultId", "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_maxTCAP", "type": "uint256" } ], - "name": "CollateralRemoved", - "type": "event" + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" } ], - "name": "NewBurnFee", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "rewardCollateral", "type": "uint256" } ], - "name": "NewLiquidationPenalty", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "minimumTCAP", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_ratio", + "name": "", "type": "uint256" } ], - "name": "NewRatio", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "_tresury", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "NewTreasury", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "ratio", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Paused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "_token", + "name": "_tokenAddress", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "RoleAdminChanged", - "type": "event" + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, "internalType": "address", "name": "account", "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" } ], - "name": "RoleRevoked", - "type": "event" + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "requiredCollateral", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "collateral", "type": "uint256" } ], - "name": "TokensBurned", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_vaultId", "type": "uint256" - }, + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], - "name": "TokensMinted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { "internalType": "address", "name": "account", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_burnFee", "type": "uint256" } ], - "name": "VaultCreated", - "type": "event" + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "_liquidator", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "_liquidationCollateral", + "name": "_liquidationPenalty", "type": "uint256" - }, + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_reward", + "name": "_minimumTCAP", "type": "uint256" } ], - "name": "VaultLiquidated", - "type": "event" + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ + "inputs": [ { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" } ], - "stateMutability": "view", + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "ETHPriceOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", + "internalType": "address", + "name": "_treasury", "type": "address" } ], - "stateMutability": "view", + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "MAX_FEE", + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "MIN_RATIO", + "name": "tcapOracle", "outputs": [ { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "TCAPPrice", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "price", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "TCAPToken", + "name": "treasury", "outputs": [ { - "internalType": "contract TCAP", + "internalType": "address", "name": "", "type": "address" } @@ -18259,14 +18407,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "addCollateral", + "inputs": [], + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -18274,19 +18416,12 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "burnFee", + "name": "userToVault", "outputs": [ { "internalType": "uint256", @@ -18298,116 +18433,118 @@ "type": "function" }, { - "inputs": [], - "name": "collateralContract", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "collateralPriceOracle", + "name": "vaults", "outputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "counter", - "outputs": [ + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, { "internalType": "uint256", - "name": "_value", + "name": "Collateral", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "createVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "divisor", - "outputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "Debt", "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], "stateMutability": "view", "type": "function" + } + ] + }, + "USDC": { + "address": "0x360294ded58EA73A10e04b97A069052Bb2d88a1E", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "getFee", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "fee", + "name": "value", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Approval", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "indexed": true, + "internalType": "address", + "name": "from", "type": "address" - } - ], - "name": "getOraclePrice", - "outputs": [ + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "price", + "name": "value", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Transfer", + "type": "event" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" } ], - "name": "getRoleAdmin", + "name": "allowance", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", @@ -18416,36 +18553,36 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "spender", + "type": "address" }, { "internalType": "uint256", - "name": "index", + "name": "amount", "type": "uint256" } ], - "name": "getRoleMember", + "name": "approve", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "getRoleMemberCount", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -18458,52 +18595,30 @@ }, { "inputs": [ - { - "internalType": "uint256", - "name": "_id", - "type": "uint256" - } - ], - "name": "getVault", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, { "internalType": "address", - "name": "", + "name": "_account", "type": "address" }, { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "getVaultRatio", + "inputs": [], + "name": "decimals", "outputs": [ { - "internalType": "uint256", - "name": "currentRatio", - "type": "uint256" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], "stateMutability": "view", @@ -18511,36 +18626,42 @@ }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "grantRole", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" } ], - "name": "hasRole", + "name": "increaseAllowance", "outputs": [ { "internalType": "bool", @@ -18548,53 +18669,60 @@ "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "_account", + "type": "address" }, { "internalType": "uint256", - "name": "_maxTCAP", + "name": "_amount", "type": "uint256" } ], - "name": "liquidateVault", + "name": "mint", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "liquidationPenalty", + "name": "name", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "symbol", + "outputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "liquidationReward", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", "outputs": [ { "internalType": "uint256", - "name": "rewardCollateral", + "name": "", "type": "uint256" } ], @@ -18603,53 +18731,47 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, { "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "oracleDigits", + "name": "transfer", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "transferFrom", "outputs": [ { "internalType": "bool", @@ -18657,110 +18779,102 @@ "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "USDCOracle": { + "address": "0x1b793DBc38B94E5C81ee383934404f84a7acE01E", + "abi": [ { - "inputs": [], - "name": "ratio", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_tokenAddress", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint256", - "name": "_tokenAmount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [ + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "int256", + "name": "", + "type": "int256" } ], - "name": "removeCollateral", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "getLatestRound", + "outputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint80", + "name": "", + "type": "uint80" }, { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" - } - ], - "name": "requiredCollateral", - "outputs": [ + }, { "internalType": "uint256", - "name": "collateral", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "requiredLiquidationTCAP", + "inputs": [], + "name": "getLatestTimestamp", "outputs": [ { "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" } ], @@ -18770,29 +18884,17 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardHandler", + "name": "getPreviousAnswer", "outputs": [ { - "internalType": "contract IRewardHandler", + "internalType": "int256", "name": "", - "type": "address" + "type": "int256" } ], "stateMutability": "view", @@ -18800,39 +18902,78 @@ }, { "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ { "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "setRatio", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -18841,11 +18982,11 @@ "inputs": [ { "internalType": "address", - "name": "_treasury", + "name": "_aggregator", "type": "address" } ], - "name": "setTreasury", + "name": "setReferenceContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -18854,7 +18995,7 @@ "inputs": [ { "internalType": "bytes4", - "name": "_interfaceId", + "name": "interfaceId", "type": "bytes4" } ], @@ -18869,19 +19010,6 @@ "stateMutability": "pure", "type": "function" }, - { - "inputs": [], - "name": "tcapOracle", - "outputs": [ - { - "internalType": "contract ChainlinkOracle", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -18894,91 +19022,73 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, - { - "inputs": [], - "name": "treasury", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, + } + ] + }, + "HardUSDCVaultHandler": { + "address": "0xB34756f8D9682ab6C26F77f9461207a65c52c8bC", + "abi": [ { "inputs": [ { - "internalType": "address", - "name": "", + "internalType": "contract Orchestrator", + "name": "_orchestrator", "type": "address" - } - ], - "name": "userToVault", - "outputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "_divisor", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" - } - ], - "name": "vaults", - "outputs": [ + }, { "internalType": "uint256", - "name": "Id", + "name": "_burnFee", "type": "uint256" }, { "internalType": "uint256", - "name": "Collateral", + "name": "_liquidationPenalty", "type": "uint256" }, { - "internalType": "uint256", - "name": "Debt", - "type": "uint256" + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" }, { "internalType": "address", - "name": "Owner", + "name": "_collateralAddress", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ] - }, - "WBTCOracle": { - "address": "0x6941264Cb2cB98F62d6014C6edcB24740e4592dE", - "abi": [ - { - "inputs": [ + }, { "internalType": "address", - "name": "_aggregator", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" } ], "stateMutability": "nonpayable", @@ -18990,245 +19100,144 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "getLatestAnswer", - "outputs": [ + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { - "internalType": "int256", - "name": "", - "type": "int256" + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "CollateralAdded", + "type": "event" }, { - "inputs": [], - "name": "getLatestRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, + "anonymous": false, + "inputs": [ { - "internalType": "int256", - "name": "", - "type": "int256" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "", + "name": "_id", "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], - "stateMutability": "view", - "type": "function" + "name": "CollateralRemoved", + "type": "event" }, { - "inputs": [], - "name": "getLatestTimestamp", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewBurnFee", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousAnswer", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { - "internalType": "int256", - "name": "", - "type": "int256" + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewLiquidationPenalty", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousTimestamp", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_minimumTCAP", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewMinimumTCAP", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_aggregator", - "type": "address" - } - ], - "name": "setReferenceContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" } ], - "stateMutability": "pure", - "type": "function" + "name": "NewRatio", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "WBTCRewardHandler": { - "address": "0x386e8b1eDe61BDaAB9EFE5d999145fDDbd10A64C", - "abi": [ - { - "inputs": [ - { + "indexed": true, "internalType": "address", "name": "_owner", "type": "address" }, { + "indexed": false, "internalType": "address", - "name": "_rewardsToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_vault", + "name": "_tresury", "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "NewTreasury", + "type": "event" }, { "anonymous": false, @@ -19268,64 +19277,19 @@ { "indexed": false, "internalType": "address", - "name": "token", + "name": "_token", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], "name": "Recovered", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "reward", - "type": "uint256" - } - ], - "name": "RewardAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "reward", - "type": "uint256" - } - ], - "name": "RewardPaid", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "newDuration", - "type": "uint256" - } - ], - "name": "RewardsDurationUpdated", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -19407,17 +19371,48 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", "type": "address" }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "Staked", + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", "type": "event" }, { @@ -19439,17 +19434,48 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", "type": "uint256" } ], - "name": "Withdrawn", + "name": "VaultLiquidated", "type": "event" }, { @@ -19466,33 +19492,34 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ { - "internalType": "address", - "name": "_account", + "internalType": "contract ChainlinkOracle", + "name": "", "type": "address" } ], - "name": "balanceOf", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", "outputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "", - "type": "uint256" + "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "earned", + "inputs": [], + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -19504,33 +19531,39 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "getRewardForDuration", + "name": "TCAPToken", "outputs": [ { - "internalType": "uint256", + "internalType": "contract TCAP", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -19539,12 +19572,12 @@ { "inputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "getRewardFromVault", + "name": "addCollateral", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -19552,39 +19585,35 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "getRoleAdmin", + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", + "inputs": [], + "name": "collateralContract", "outputs": [ { - "internalType": "address", + "internalType": "contract IERC20", "name": "", "type": "address" } @@ -19593,14 +19622,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", "outputs": [ { "internalType": "uint256", @@ -19612,42 +19635,13 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", + "inputs": [], + "name": "collateralPriceOracle", "outputs": [ { - "internalType": "bool", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", @@ -19655,11 +19649,11 @@ }, { "inputs": [], - "name": "lastTimeRewardApplicable", + "name": "counter", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_value", "type": "uint256" } ], @@ -19668,7 +19662,14 @@ }, { "inputs": [], - "name": "lastUpdateTime", + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", "outputs": [ { "internalType": "uint256", @@ -19683,68 +19684,92 @@ "inputs": [ { "internalType": "uint256", - "name": "_a", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_b", + "name": "_amount", "type": "uint256" } ], - "name": "min", + "name": "getFee", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "fee", "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ { "internalType": "uint256", - "name": "_reward", + "name": "price", "type": "uint256" } ], - "name": "notifyRewardAmount", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "owner", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", "outputs": [ { - "internalType": "address", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "paused", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "periodFinish", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", @@ -19757,27 +19782,55 @@ }, { "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, { "internalType": "address", - "name": "_tokenAddress", + "name": "", "type": "address" }, { "internalType": "uint256", - "name": "_tokenAmount", + "name": "", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { @@ -19793,7 +19846,7 @@ "type": "address" } ], - "name": "renounceRole", + "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -19811,40 +19864,38 @@ "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerToken", + "name": "hasRole", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "rewardPerTokenStored", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", "type": "uint256" } ], - "stateMutability": "view", + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "rewardRate", + "name": "liquidationPenalty", "outputs": [ { "internalType": "uint256", @@ -19857,30 +19908,17 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "rewards", - "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_vaultId", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardsDuration", + "name": "liquidationReward", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "rewardCollateral", "type": "uint256" } ], @@ -19889,51 +19927,33 @@ }, { "inputs": [], - "name": "rewardsToken", + "name": "minimumTCAP", "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ { "internalType": "uint256", - "name": "_rewardsDuration", + "name": "", "type": "uint256" } ], - "name": "setRewardsDuration", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "_staker", - "type": "address" - }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "stake", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "totalSupply", + "name": "oracleDigits", "outputs": [ { "internalType": "uint256", @@ -19945,32 +19965,33 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "newOwner", + "name": "", "type": "address" } ], - "name": "transferOwnership", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userRewardPerTokenPaid", + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", @@ -19978,12 +19999,12 @@ }, { "inputs": [], - "name": "vault", + "name": "ratio", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -19993,342 +20014,314 @@ "inputs": [ { "internalType": "address", - "name": "_staker", + "name": "_tokenAddress", "type": "address" }, { "internalType": "uint256", - "name": "_amount", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "withdraw", + "name": "recoverERC20", "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "WBTCVaultHandler": { - "address": "0x1b9cd5A9acC56405806D0E4618616f761001eB62", - "abi": [ + }, { "inputs": [ - { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_divisor", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - }, { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "_amount", "type": "uint256" - }, - { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "address", - "name": "_rewardHandler", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "address", - "name": "_treasury", + "name": "account", "type": "address" } ], + "name": "renounceRole", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "requiredCollateral", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "collateral", "type": "uint256" } ], - "name": "CollateralAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_vaultId", "type": "uint256" - }, + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], - "name": "CollateralRemoved", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { "internalType": "address", - "name": "_owner", + "name": "account", "type": "address" - }, + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "indexed": false, "internalType": "uint256", "name": "_burnFee", "type": "uint256" } ], - "name": "NewBurnFee", - "type": "event" + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "NewLiquidationPenalty", - "type": "event" + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "indexed": false, "internalType": "uint256", "name": "_ratio", "type": "uint256" } ], - "name": "NewRatio", - "type": "event" + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, "internalType": "address", - "name": "_tresury", + "name": "_treasury", "type": "address" } ], - "name": "NewTreasury", - "type": "event" + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "pure", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "tcapOracle", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", + "internalType": "contract ChainlinkOracle", + "name": "", "type": "address" } ], - "name": "Paused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "_token", + "name": "newOwner", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, + "inputs": [], + "name": "treasury", + "outputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "RoleAdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, "internalType": "address", - "name": "account", + "name": "", "type": "address" - }, + } + ], + "name": "userToVault", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "RoleGranted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" }, { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" }, { - "indexed": true, "internalType": "address", - "name": "sender", + "name": "Owner", "type": "address" } ], - "name": "RoleRevoked", - "type": "event" + "stateMutability": "view", + "type": "function" + } + ] + } + } + } + }, + "4": { + "rinkeby": { + "name": "rinkeby", + "chainId": "4", + "contracts": { + "AAVE": { + "address": "0x8B4A041A619aC26B33e5BAEe9585e569387ec837", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, @@ -20336,23 +20329,23 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "owner", "type": "address" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "address", + "name": "spender", + "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "value", "type": "uint256" } ], - "name": "TokensBurned", + "name": "Approval", "type": "event" }, { @@ -20361,117 +20354,82 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "from", "type": "address" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "address", + "name": "to", + "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "value", "type": "uint256" } ], - "name": "TokensMinted", + "name": "Transfer", "type": "event" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "owner", "type": "address" - } - ], - "name": "Unpaused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "spender", "type": "address" - }, + } + ], + "name": "allowance", + "outputs": [ { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "", "type": "uint256" } ], - "name": "VaultCreated", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, - { - "indexed": true, "internalType": "address", - "name": "_liquidator", + "name": "spender", "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" - }, - { - "indexed": false, "internalType": "uint256", - "name": "_reward", + "name": "amount", "type": "uint256" } ], - "name": "VaultLiquidated", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "approve", "outputs": [ { - "internalType": "bytes32", + "internalType": "bool", "name": "", - "type": "bytes32" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "ETHPriceOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", + "internalType": "address", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_FEE", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -20483,39 +20441,31 @@ "type": "function" }, { - "inputs": [], - "name": "MIN_RATIO", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TCAPPrice", - "outputs": [ + "internalType": "address", + "name": "_account", + "type": "address" + }, { "internalType": "uint256", - "name": "price", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "TCAPToken", + "name": "decimals", "outputs": [ { - "internalType": "contract TCAP", + "internalType": "uint8", "name": "", - "type": "address" + "type": "uint8" } ], "stateMutability": "view", @@ -20523,64 +20473,78 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "_amount", + "name": "subtractedValue", "type": "uint256" } ], - "name": "addCollateral", - "outputs": [], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "_amount", + "name": "addedValue", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "burnFee", + "name": "increaseAllowance", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "collateralContract", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20", - "name": "", + "internalType": "address", + "name": "_account", "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "collateralPriceOracle", + "name": "name", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", @@ -20588,12 +20552,12 @@ }, { "inputs": [], - "name": "counter", + "name": "symbol", "outputs": [ { - "internalType": "uint256", - "name": "_value", - "type": "uint256" + "internalType": "string", + "name": "", + "type": "string" } ], "stateMutability": "view", @@ -20601,14 +20565,7 @@ }, { "inputs": [], - "name": "createVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "divisor", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -20621,151 +20578,150 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, { "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], - "name": "getFee", + "name": "transfer", "outputs": [ { - "internalType": "uint256", - "name": "fee", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "internalType": "address", + "name": "sender", "type": "address" - } - ], - "name": "getOraclePrice", - "outputs": [ + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, { "internalType": "uint256", - "name": "price", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", + "name": "transferFrom", "outputs": [ { - "internalType": "bytes32", + "internalType": "bool", "name": "", - "type": "bytes32" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "AaveOracle": { + "address": "0x73Ebb8b08f056F451c2aA53dCAd7A35ce6aD52D0", + "abi": [ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "_aggregator", + "type": "address" }, { - "internalType": "uint256", - "name": "index", - "type": "uint256" + "internalType": "address", + "name": "_timelock", + "type": "address" } ], - "name": "getRoleMember", - "outputs": [ + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", + "inputs": [], + "name": "getLatestAnswer", "outputs": [ { - "internalType": "uint256", + "internalType": "int256", "name": "", - "type": "uint256" + "type": "int256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_id", - "type": "uint256" - } - ], - "name": "getVault", + "inputs": [], + "name": "getLatestRound", "outputs": [ { - "internalType": "uint256", + "internalType": "uint80", "name": "", - "type": "uint256" + "type": "uint80" }, { - "internalType": "uint256", + "internalType": "int256", "name": "", - "type": "uint256" + "type": "int256" }, { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "getVaultRatio", + "inputs": [], + "name": "getLatestTimestamp", "outputs": [ { "internalType": "uint256", - "name": "currentRatio", + "name": "", "type": "uint256" } ], @@ -20775,40 +20731,17 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "hasRole", + "name": "getPreviousAnswer", "outputs": [ { - "internalType": "bool", + "internalType": "int256", "name": "", - "type": "bool" + "type": "int256" } ], "stateMutability": "view", @@ -20817,24 +20750,12 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_maxTCAP", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "liquidationPenalty", + "name": "getPreviousTimestamp", "outputs": [ { "internalType": "uint256", @@ -20848,43 +20769,37 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "liquidationReward", + "name": "getRound", "outputs": [ { - "internalType": "uint256", - "name": "rewardCollateral", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" - } - ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "oracleDigits", - "outputs": [ + }, { "internalType": "uint256", "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", @@ -20905,51 +20820,20 @@ }, { "inputs": [], - "name": "pause", + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ratio", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "_aggregator", "type": "address" - }, - { - "internalType": "uint256", - "name": "_tokenAmount", - "type": "uint256" } ], - "name": "recoverERC20", + "name": "setReferenceContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -20957,329 +20841,356 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" } ], - "name": "removeCollateral", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "renounceRole", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "AaveVaultHandler": { + "address": "0x119D37aFc784C81626b08813D83598b8673EEE66", + "abi": [ { "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, { "internalType": "uint256", - "name": "_amount", + "name": "_divisor", "type": "uint256" - } - ], - "name": "requiredCollateral", - "outputs": [ + }, { "internalType": "uint256", - "name": "collateral", + "name": "_ratio", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + }, { "internalType": "uint256", - "name": "_vaultId", + "name": "_burnFee", "type": "uint256" - } - ], - "name": "requiredLiquidationTCAP", - "outputs": [ + }, { "internalType": "uint256", - "name": "amount", + "name": "_liquidationPenalty", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + }, { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" }, { "internalType": "address", - "name": "account", + "name": "_collateralAddress", "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardHandler", - "outputs": [ + }, { - "internalType": "contract IRewardHandler", - "name": "", + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, "internalType": "uint256", - "name": "_burnFee", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", "type": "uint256" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "CollateralAdded", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "_amount", "type": "uint256" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "CollateralRemoved", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "_ratio", + "name": "_burnFee", "type": "uint256" } ], - "name": "setRatio", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewBurnFee", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_treasury", + "name": "_owner", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "name": "setTreasury", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewLiquidationPenalty", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" } ], - "stateMutability": "pure", - "type": "function" + "name": "NewRatio", + "type": "event" }, { - "inputs": [], - "name": "tcapOracle", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "NewTreasury", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "treasury", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "_token", "type": "address" - } - ], - "name": "userToVault", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Recovered", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "vaults", - "outputs": [ - { - "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "Debt", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" }, { - "internalType": "address", - "name": "Owner", - "type": "address" + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" - } - ] - }, - "Ctx": { - "address": "0xAa715DbD2ED909B7B7727dC864F3B78276D14A19", - "abi": [ + "name": "RoleAdminChanged", + "type": "event" + }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "minter_", + "name": "sender", "type": "address" - }, - { - "internalType": "uint256", - "name": "mintingAllowedAfter_", - "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "RoleGranted", + "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "indexed": true, "internalType": "address", - "name": "spender", + "name": "account", "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "Approval", + "name": "RoleRevoked", "type": "event" }, { @@ -21288,23 +21199,23 @@ { "indexed": true, "internalType": "address", - "name": "delegator", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "fromDelegate", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { - "indexed": true, - "internalType": "address", - "name": "toDelegate", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "DelegateChanged", + "name": "TokensBurned", "type": "event" }, { @@ -21313,23 +21224,23 @@ { "indexed": true, "internalType": "address", - "name": "delegate", + "name": "_owner", "type": "address" }, { - "indexed": false, + "indexed": true, "internalType": "uint256", - "name": "previousBalance", + "name": "_id", "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "newBalance", + "name": "_amount", "type": "uint256" } ], - "name": "DelegateVotesChanged", + "name": "TokensMinted", "type": "event" }, { @@ -21338,17 +21249,30 @@ { "indexed": false, "internalType": "address", - "name": "minter", + "name": "account", "type": "address" - }, + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "newMinter", + "name": "_owner", "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" } ], - "name": "MinterChanged", + "name": "VaultCreated", "type": "event" }, { @@ -21356,29 +21280,35 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { "indexed": true, "internalType": "address", - "name": "to", + "name": "_liquidator", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", "type": "uint256" } ], - "name": "Transfer", + "name": "VaultLiquidated", "type": "event" }, { "inputs": [], - "name": "DELEGATION_TYPEHASH", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { "internalType": "bytes32", @@ -21391,12 +21321,12 @@ }, { "inputs": [], - "name": "DOMAIN_TYPEHASH", + "name": "ETHPriceOracle", "outputs": [ { - "internalType": "bytes32", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "bytes32" + "type": "address" } ], "stateMutability": "view", @@ -21404,31 +21334,20 @@ }, { "inputs": [], - "name": "PERMIT_TYPEHASH", + "name": "MAX_FEE", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", + "inputs": [], + "name": "MIN_RATIO", "outputs": [ { "internalType": "uint256", @@ -21440,72 +21359,65 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { "internalType": "uint256", - "name": "rawAmount", + "name": "price", "type": "uint256" } ], - "name": "approve", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", "outputs": [ { - "internalType": "bool", + "internalType": "contract TCAP", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint32", - "name": "", - "type": "uint32" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "checkpoints", + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", "outputs": [ { - "internalType": "uint32", - "name": "fromBlock", - "type": "uint32" - }, - { - "internalType": "uint96", - "name": "votes", - "type": "uint96" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], "stateMutability": "view", @@ -21513,101 +21425,134 @@ }, { "inputs": [], - "name": "decimals", + "name": "collateralContract", "outputs": [ { - "internalType": "uint8", + "internalType": "contract IERC20", "name": "", - "type": "uint8" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ { - "internalType": "address", - "name": "spender", + "internalType": "contract ChainlinkOracle", + "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ { "internalType": "uint256", - "name": "subtractedValue", + "name": "_value", "type": "uint256" } ], - "name": "decreaseAllowance", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "delegatee", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "delegate", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "delegatee", + "internalType": "contract ChainlinkOracle", + "name": "_oracle", "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, + } + ], + "name": "getOraclePrice", + "outputs": [ { "internalType": "uint256", - "name": "expiry", + "name": "price", "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "bytes32", - "name": "r", + "name": "role", "type": "bytes32" - }, + } + ], + "name": "getRoleAdmin", + "outputs": [ { "internalType": "bytes32", - "name": "s", + "name": "", "type": "bytes32" } ], - "name": "delegateBySig", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" } ], - "name": "delegates", + "name": "getRoleMember", "outputs": [ { "internalType": "address", @@ -21621,17 +21566,17 @@ { "inputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "getCurrentVotes", + "name": "getRoleMemberCount", "outputs": [ { - "internalType": "uint96", + "internalType": "uint256", "name": "", - "type": "uint96" + "type": "uint256" } ], "stateMutability": "view", @@ -21639,23 +21584,33 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, { "internalType": "uint256", - "name": "blockNumber", + "name": "_id", "type": "uint256" } ], - "name": "getPriorVotes", + "name": "getVault", "outputs": [ { - "internalType": "uint96", + "internalType": "uint256", "name": "", - "type": "uint96" + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" } ], "stateMutability": "view", @@ -21663,36 +21618,60 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, { "internalType": "uint256", - "name": "addedValue", + "name": "_vaultId", "type": "uint256" } ], - "name": "increaseAllowance", + "name": "getVaultRatio", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], + "name": "grantRole", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "minimumTimeBetweenMints", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", "outputs": [ { - "internalType": "uint32", + "internalType": "bool", "name": "", - "type": "uint32" + "type": "bool" } ], "stateMutability": "view", @@ -21701,106 +21680,120 @@ { "inputs": [ { - "internalType": "address", - "name": "dst", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { "internalType": "uint256", - "name": "rawAmount", + "name": "_maxTCAP", "type": "uint256" } ], - "name": "mint", + "name": "liquidateVault", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "mintCap", + "name": "liquidationPenalty", "outputs": [ { - "internalType": "uint8", + "internalType": "uint256", "name": "", - "type": "uint8" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "minter", + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", "outputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "mintingAllowedAfter", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "name", + "name": "oracleDigits", "outputs": [ { - "internalType": "string", + "internalType": "uint256", "name": "", - "type": "string" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], - "name": "nonces", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "numCheckpoints", + "inputs": [], + "name": "ratio", "outputs": [ { - "internalType": "uint32", + "internalType": "uint256", "name": "", - "type": "uint32" + "type": "uint256" } ], "stateMutability": "view", @@ -21810,41 +21803,16 @@ "inputs": [ { "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", + "name": "_tokenAddress", "type": "address" }, { "internalType": "uint256", - "name": "rawAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", + "name": "_tokenAmount", "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" } ], - "name": "permit", + "name": "recoverERC20", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -21852,333 +21820,295 @@ { "inputs": [ { - "internalType": "address", - "name": "minter_", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "setMinter", + "name": "removeCollateral", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "dst", - "type": "address" - }, { "internalType": "uint256", - "name": "rawAmount", + "name": "_amount", "type": "uint256" } ], - "name": "transfer", + "name": "requiredCollateral", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "collateral", + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "internalType": "address", - "name": "dst", - "type": "address" - }, { "internalType": "uint256", - "name": "rawAmount", + "name": "_vaultId", "type": "uint256" } ], - "name": "transferFrom", + "name": "requiredLiquidationTCAP", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "CTXLiquidityReward": { - "address": "0x06e4F32A5f3bD64C4c620644d107601368BfCb27", - "abi": [ + }, { "inputs": [ { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardsToken", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "address", - "name": "_stakingToken", + "name": "account", "type": "address" - }, - { - "internalType": "uint256", - "name": "_vestingEnd", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_vestingRatio", - "type": "uint256" } ], + "name": "revokeRole", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "inputs": [], + "name": "rewardHandler", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", + "internalType": "contract IRewardHandler", + "name": "", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" } ], - "name": "Paused", - "type": "event" + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_ratio", "type": "uint256" } ], - "name": "RewardAdded", - "type": "event" + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "user", + "name": "_treasury", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "reward", - "type": "uint256" } ], - "name": "RewardPaid", - "type": "event" + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "newDuration", - "type": "uint256" - } + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } ], - "name": "RewardsDurationUpdated", - "type": "event" + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, + "inputs": [], + "name": "tcapOracle", + "outputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" } ], - "name": "RoleAdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" - }, + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "sender", + "name": "", "type": "address" } ], - "name": "RoleGranted", - "type": "event" + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, "internalType": "address", - "name": "account", + "name": "", "type": "address" - }, + } + ], + "name": "userToVault", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "RoleRevoked", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], - "name": "Staked", - "type": "event" - }, + "stateMutability": "view", + "type": "function" + } + ] + }, + "WBTCOracle": { + "address": "0x6941264Cb2cB98F62d6014C6edcB24740e4592dE", + "abi": [ { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "_aggregator", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, @@ -22186,46 +22116,60 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "previousOwner", "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "Withdrawn", + "name": "OwnershipTransferred", "type": "event" }, { "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "getLatestAnswer", "outputs": [ { - "internalType": "bytes32", + "internalType": "int256", "name": "", - "type": "bytes32" + "type": "int256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "balanceOf", + "inputs": [], + "name": "getLatestRound", "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", "name": "", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", @@ -22233,47 +22177,45 @@ }, { "inputs": [], - "name": "claimVest", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "_account", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "earned", + "name": "getPreviousAnswer", "outputs": [ { - "internalType": "uint256", + "internalType": "int256", "name": "", - "type": "uint256" + "type": "int256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getRewardForDuration", + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", "outputs": [ { "internalType": "uint256", @@ -22287,79 +22229,71 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "getRoleAdmin", + "name": "getRound", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint80", "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "type": "uint80" + }, { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "int256", + "name": "", + "type": "int256" }, { "internalType": "uint256", - "name": "index", + "name": "", "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ + }, { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "_aggregator", "type": "address" } ], - "name": "grantRole", + "name": "setReferenceContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -22367,17 +22301,12 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" } ], - "name": "hasRole", + "name": "supportsInterface", "outputs": [ { "internalType": "bool", @@ -22385,206 +22314,278 @@ "type": "bool" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { - "inputs": [], - "name": "lastUpdateTime", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "WBTCRewardHandler": { + "address": "0x386e8b1eDe61BDaAB9EFE5d999145fDDbd10A64C", + "abi": [ { "inputs": [ { - "internalType": "uint256", - "name": "_a", - "type": "uint256" + "internalType": "address", + "name": "_owner", + "type": "address" }, { - "internalType": "uint256", - "name": "_b", - "type": "uint256" - } - ], - "name": "min", - "outputs": [ + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_vault", + "type": "address" } ], - "stateMutability": "pure", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_reward", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "notifyRewardAmount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Paused", + "type": "event" }, { - "inputs": [], - "name": "paused", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Recovered", + "type": "event" }, { - "inputs": [], - "name": "periodFinish", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "reward", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardAdded", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_tokenAddress", + "name": "user", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_tokenAmount", + "name": "reward", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RewardPaid", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RewardsDurationUpdated", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" }, { - "inputs": [], - "name": "rewardPerToken", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Staked", + "type": "event" }, { - "inputs": [], - "name": "rewardPerTokenStored", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Withdrawn", + "type": "event" }, { "inputs": [], - "name": "rewardRate", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", @@ -22594,11 +22595,11 @@ "inputs": [ { "internalType": "address", - "name": "", + "name": "_account", "type": "address" } ], - "name": "rewards", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -22610,8 +22611,14 @@ "type": "function" }, { - "inputs": [], - "name": "rewardsDuration", + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "earned", "outputs": [ { "internalType": "uint256", @@ -22623,92 +22630,103 @@ "type": "function" }, { - "inputs": [], - "name": "rewardsToken", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20", - "name": "", + "internalType": "address", + "name": "_staker", "type": "address" } ], - "stateMutability": "view", + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getRewardForDuration", + "outputs": [ { "internalType": "uint256", - "name": "_rewardsDuration", + "name": "", "type": "uint256" } ], - "name": "setRewardsDuration", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "_staker", + "type": "address" } ], - "name": "stake", + "name": "getRewardFromVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "stakingToken", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "uint256", - "name": "", + "name": "index", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "name": "getRoleMember", + "outputs": [ { "internalType": "address", - "name": "newOwner", + "name": "", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "userRewardPerTokenPaid", + "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", @@ -22721,18 +22739,41 @@ }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "name": "vestingAmounts", + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", @@ -22740,7 +22781,7 @@ }, { "inputs": [], - "name": "vestingEnd", + "name": "lastTimeRewardApplicable", "outputs": [ { "internalType": "uint256", @@ -22753,7 +22794,7 @@ }, { "inputs": [], - "name": "vestingRatio", + "name": "lastUpdateTime", "outputs": [ { "internalType": "uint256", @@ -22768,89 +22809,68 @@ "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "_a", "type": "uint256" - } - ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "DAI": { - "address": "0x118a4238E4086FAE2621D0336C0E6cdC1257BE82", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, + "internalType": "uint256", + "name": "_b", + "type": "uint256" + } + ], + "name": "min", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "", "type": "uint256" } ], - "name": "Approval", - "type": "event" + "stateMutability": "pure", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_reward", "type": "uint256" } ], - "name": "Transfer", - "type": "event" + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "owner", + "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "allowance", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "periodFinish", "outputs": [ { "internalType": "uint256", @@ -22865,35 +22885,66 @@ "inputs": [ { "internalType": "address", - "name": "spender", + "name": "_tokenAddress", "type": "address" }, { "internalType": "uint256", - "name": "amount", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "approve", - "outputs": [ + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], + "name": "renounceRole", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", "name": "account", "type": "address" } ], - "name": "balanceOf", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", "outputs": [ { "internalType": "uint256", @@ -22905,31 +22956,26 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "decimals", + "name": "rewardRate", "outputs": [ { - "internalType": "uint8", + "internalType": "uint256", "name": "", - "type": "uint8" + "type": "uint256" } ], "stateMutability": "view", @@ -22939,47 +22985,57 @@ "inputs": [ { "internalType": "address", - "name": "spender", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" } ], - "name": "decreaseAllowance", + "name": "rewards", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, + "inputs": [], + "name": "rewardsDuration", + "outputs": [ { "internalType": "uint256", - "name": "addedValue", + "name": "", "type": "uint256" } ], - "name": "increaseAllowance", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardsToken", "outputs": [ { - "internalType": "bool", + "internalType": "contract IERC20", "name": "", - "type": "bool" + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_rewardsDuration", + "type": "uint256" } ], + "name": "setRewardsDuration", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -22987,7 +23043,7 @@ "inputs": [ { "internalType": "address", - "name": "_account", + "name": "_staker", "type": "address" }, { @@ -22996,32 +23052,51 @@ "type": "uint256" } ], - "name": "mint", + "name": "stake", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "name", + "name": "totalSupply", "outputs": [ { - "internalType": "string", + "internalType": "uint256", "name": "", - "type": "string" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "symbol", + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRewardPerTokenPaid", "outputs": [ { - "internalType": "string", + "internalType": "uint256", "name": "", - "type": "string" + "type": "uint256" } ], "stateMutability": "view", @@ -23029,12 +23104,12 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "vault", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -23044,65 +23119,85 @@ "inputs": [ { "internalType": "address", - "name": "recipient", + "name": "_staker", "type": "address" }, { "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "name": "withdraw", + "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "WBTCVaultHandler": { + "address": "0x1b9cd5A9acC56405806D0E4618616f761001eB62", + "abi": [ { "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, { "internalType": "address", - "name": "sender", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", "type": "address" }, { "internalType": "address", - "name": "recipient", + "name": "_collateralAddress", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "DAIOracle": { - "address": "0xb50365a53EB0d8f214FFD0Cc0F2936BD877B3e17", - "abi": [ - { - "inputs": [ + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, { "internalType": "address", - "name": "_aggregator", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", "type": "address" } ], @@ -23115,245 +23210,125 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "getLatestAnswer", - "outputs": [ + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { - "internalType": "int256", - "name": "", - "type": "int256" + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "CollateralAdded", + "type": "event" }, { - "inputs": [], - "name": "getLatestRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, + "anonymous": false, + "inputs": [ { - "internalType": "int256", - "name": "", - "type": "int256" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "", + "name": "_id", "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], - "stateMutability": "view", - "type": "function" + "name": "CollateralRemoved", + "type": "event" }, { - "inputs": [], - "name": "getLatestTimestamp", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewBurnFee", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousAnswer", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { - "internalType": "int256", - "name": "", - "type": "int256" + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewLiquidationPenalty", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousTimestamp", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewRatio", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" }, { - "internalType": "uint80", - "name": "", - "type": "uint80" + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_aggregator", - "type": "address" - } - ], - "name": "setReferenceContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "DAIRewardHandler": { - "address": "0x423eDDfAA00fE22945739070BB911AcBF1fDf4D4", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardsToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_vault", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "NewTreasury", + "type": "event" }, { "anonymous": false, @@ -23393,64 +23368,19 @@ { "indexed": false, "internalType": "address", - "name": "token", + "name": "_token", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], "name": "Recovered", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "reward", - "type": "uint256" - } - ], - "name": "RewardAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "reward", - "type": "uint256" - } - ], - "name": "RewardPaid", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "newDuration", - "type": "uint256" - } - ], - "name": "RewardsDurationUpdated", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -23532,17 +23462,48 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", "type": "address" }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "Staked", + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", "type": "event" }, { @@ -23564,17 +23525,48 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", "type": "uint256" } ], - "name": "Withdrawn", + "name": "VaultLiquidated", "type": "event" }, { @@ -23591,14 +23583,21 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ { - "internalType": "address", - "name": "_account", + "internalType": "contract ChainlinkOracle", + "name": "", "type": "address" } ], - "name": "balanceOf", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -23610,14 +23609,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "earned", + "inputs": [], + "name": "MIN_RATIO", "outputs": [ { "internalType": "uint256", @@ -23629,28 +23622,60 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "internalType": "uint256", + "name": "price", + "type": "uint256" } ], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "getRewardForDuration", + "name": "burnFee", "outputs": [ { "internalType": "uint256", @@ -23662,18 +23687,102 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "collateralContract", + "outputs": [ { - "internalType": "address", - "name": "_staker", + "internalType": "contract IERC20", + "name": "", "type": "address" } ], - "name": "getRewardFromVault", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -23736,6 +23845,59 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -23779,21 +23941,26 @@ "type": "function" }, { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", "type": "uint256" } ], - "stateMutability": "view", + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "lastUpdateTime", + "name": "liquidationPenalty", "outputs": [ { "internalType": "uint256", @@ -23808,39 +23975,47 @@ "inputs": [ { "internalType": "uint256", - "name": "_a", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_b", + "name": "_vaultId", "type": "uint256" } ], - "name": "min", + "name": "liquidationReward", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "rewardCollateral", "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_reward", + "name": "_amount", "type": "uint256" } ], - "name": "notifyRewardAmount", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "owner", @@ -23854,6 +24029,13 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "paused", @@ -23869,7 +24051,7 @@ }, { "inputs": [], - "name": "periodFinish", + "name": "ratio", "outputs": [ { "internalType": "uint256", @@ -23898,6 +24080,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "renounceOwnership", @@ -23926,28 +24121,16 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerToken", + "name": "requiredCollateral", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "collateral", "type": "uint256" } ], @@ -23955,25 +24138,18 @@ "type": "function" }, { - "inputs": [], - "name": "rewardPerTokenStored", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_vaultId", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardRate", + "name": "requiredLiquidationTCAP", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], @@ -23982,58 +24158,70 @@ }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "name": "rewards", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardHandler", "outputs": [ { - "internalType": "uint256", + "internalType": "contract IRewardHandler", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "rewardsDuration", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "rewardsToken", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "stateMutability": "view", + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_rewardsDuration", + "name": "_ratio", "type": "uint256" } ], - "name": "setRewardsDuration", + "name": "setRatio", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -24042,28 +24230,42 @@ "inputs": [ { "internalType": "address", - "name": "_staker", + "name": "_treasury", "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" } ], - "name": "stake", + "name": "setTreasury", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, { "inputs": [], - "name": "totalSupply", + "name": "tcapOracle", "outputs": [ { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -24083,121 +24285,99 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "treasury", + "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], - "name": "userRewardPerTokenPaid", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "vault", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_staker", + "name": "", "type": "address" - }, + } + ], + "name": "userToVault", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "DAIVaultHandler": { - "address": "0x7fF4580aD66a3C0F62DDa843674A3811ac062211", - "abi": [ + }, { "inputs": [ - { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, { "internalType": "uint256", - "name": "_divisor", + "name": "", "type": "uint256" - }, + } + ], + "name": "vaults", + "outputs": [ { "internalType": "uint256", - "name": "_ratio", + "name": "Id", "type": "uint256" }, { "internalType": "uint256", - "name": "_burnFee", + "name": "Collateral", "type": "uint256" }, { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "Debt", "type": "uint256" }, { "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", + "name": "Owner", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "Ctx": { + "address": "0xAa715DbD2ED909B7B7727dC864F3B78276D14A19", + "abi": [ + { + "inputs": [ { "internalType": "address", - "name": "_ethOracle", + "name": "account", "type": "address" }, { "internalType": "address", - "name": "_rewardHandler", + "name": "minter_", "type": "address" }, { - "internalType": "address", - "name": "_treasury", - "type": "address" + "internalType": "uint256", + "name": "mintingAllowedAfter_", + "type": "uint256" } ], "stateMutability": "nonpayable", @@ -24209,23 +24389,23 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "owner", "type": "address" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "address", + "name": "spender", + "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], - "name": "CollateralAdded", + "name": "Approval", "type": "event" }, { @@ -24234,23 +24414,23 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "delegator", "type": "address" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "address", + "name": "fromDelegate", + "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "toDelegate", + "type": "address" } ], - "name": "CollateralRemoved", + "name": "DelegateChanged", "type": "event" }, { @@ -24259,36 +24439,42 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "delegate", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_burnFee", + "name": "previousBalance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newBalance", "type": "uint256" } ], - "name": "NewBurnFee", + "name": "DelegateVotesChanged", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "_owner", + "name": "minter", "type": "address" }, { "indexed": false, - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" + "internalType": "address", + "name": "newMinter", + "type": "address" } ], - "name": "NewLiquidationPenalty", + "name": "MinterChanged", "type": "event" }, { @@ -24297,350 +24483,305 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_ratio", + "name": "amount", "type": "uint256" } ], - "name": "NewRatio", + "name": "Transfer", "type": "event" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "DELEGATION_TYPEHASH", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "_tresury", - "type": "address" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "NewTreasury", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "inputs": [], + "name": "DOMAIN_TYPEHASH", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "PERMIT_TYPEHASH", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "Paused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "_token", + "name": "account", "type": "address" }, { - "indexed": false, + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "spender", + "type": "address" }, { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, + "internalType": "uint256", + "name": "rawAmount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "RoleAdminChanged", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, "internalType": "address", "name": "account", "type": "address" - }, + } + ], + "name": "balanceOf", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "RoleGranted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, "internalType": "address", - "name": "account", + "name": "", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint32", + "name": "", + "type": "uint32" } ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "checkpoints", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "uint32", + "name": "fromBlock", + "type": "uint32" }, { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, + "internalType": "uint96", + "name": "votes", + "type": "uint96" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], - "name": "TokensBurned", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "spender", "type": "address" }, { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "subtractedValue", "type": "uint256" - }, + } + ], + "name": "decreaseAllowance", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "TokensMinted", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "delegatee", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "delegatee", "type": "address" }, { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "nonce", "type": "uint256" - } - ], - "name": "VaultCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { - "indexed": true, "internalType": "uint256", - "name": "_vaultId", + "name": "expiry", "type": "uint256" }, { - "indexed": true, - "internalType": "address", - "name": "_liquidator", - "type": "address" + "internalType": "uint8", + "name": "v", + "type": "uint8" }, { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" + "internalType": "bytes32", + "name": "r", + "type": "bytes32" }, - { - "indexed": false, - "internalType": "uint256", - "name": "_reward", - "type": "uint256" - } - ], - "name": "VaultLiquidated", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ { "internalType": "bytes32", - "name": "", + "name": "s", "type": "bytes32" } ], - "stateMutability": "view", + "name": "delegateBySig", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "ETHPriceOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "address", "name": "", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_FEE", + "name": "delegates", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "MIN_RATIO", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getCurrentVotes", "outputs": [ { - "internalType": "uint256", + "internalType": "uint96", "name": "", - "type": "uint256" + "type": "uint96" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "TCAPPrice", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, { "internalType": "uint256", - "name": "price", + "name": "blockNumber", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TCAPToken", + "name": "getPriorVotes", "outputs": [ { - "internalType": "contract TCAP", + "internalType": "uint96", "name": "", - "type": "address" + "type": "uint96" } ], "stateMutability": "view", @@ -24648,51 +24789,67 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "_amount", + "name": "addedValue", "type": "uint256" } ], - "name": "addCollateral", - "outputs": [], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "minimumTimeBetweenMints", + "outputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "uint32", + "name": "", + "type": "uint32" } ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "burnFee", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "dst", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "rawAmount", "type": "uint256" } ], - "stateMutability": "view", + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "collateralContract", + "name": "mintCap", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "uint8", "name": "", - "type": "address" + "type": "uint8" } ], "stateMutability": "view", @@ -24700,10 +24857,10 @@ }, { "inputs": [], - "name": "collateralPriceOracle", + "name": "minter", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "address", "name": "", "type": "address" } @@ -24713,11 +24870,11 @@ }, { "inputs": [], - "name": "counter", + "name": "mintingAllowedAfter", "outputs": [ { "internalType": "uint256", - "name": "_value", + "name": "", "type": "uint256" } ], @@ -24726,19 +24883,12 @@ }, { "inputs": [], - "name": "createVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "divisor", + "name": "name", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], "stateMutability": "view", @@ -24747,16 +24897,16 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "getFee", + "name": "nonces", "outputs": [ { "internalType": "uint256", - "name": "fee", + "name": "", "type": "uint256" } ], @@ -24766,17 +24916,17 @@ { "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "internalType": "address", + "name": "", "type": "address" } ], - "name": "getOraclePrice", + "name": "numCheckpoints", "outputs": [ { - "internalType": "uint256", - "name": "price", - "type": "uint256" + "internalType": "uint32", + "name": "", + "type": "uint32" } ], "stateMutability": "view", @@ -24784,91 +24934,77 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "rawAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, { "internalType": "bytes32", - "name": "role", + "name": "r", "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ + }, { "internalType": "bytes32", - "name": "", + "name": "s", "type": "bytes32" } ], - "stateMutability": "view", + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ { "internalType": "address", - "name": "", + "name": "minter_", "type": "address" } ], - "stateMutability": "view", + "name": "setMinter", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", + "inputs": [], + "name": "symbol", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_id", - "type": "uint256" - } - ], - "name": "getVault", + "inputs": [], + "name": "totalSupply", "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, { "internalType": "uint256", "name": "", @@ -24880,55 +25016,47 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "dst", + "type": "address" + }, { "internalType": "uint256", - "name": "_vaultId", + "name": "rawAmount", "type": "uint256" } ], - "name": "getVaultRatio", + "name": "transfer", "outputs": [ { - "internalType": "uint256", - "name": "currentRatio", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "src", "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" }, { "internalType": "address", - "name": "account", + "name": "dst", "type": "address" + }, + { + "internalType": "uint256", + "name": "rawAmount", + "type": "uint256" } ], - "name": "hasRole", + "name": "transferFrom", "outputs": [ { "internalType": "bool", @@ -24936,251 +25064,275 @@ "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "CTXLiquidityReward": { + "address": "0x06e4F32A5f3bD64C4c620644d107601368BfCb27", + "abi": [ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "_owner", + "type": "address" }, { - "internalType": "uint256", - "name": "_maxTCAP", - "type": "uint256" - } - ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "liquidationPenalty", - "outputs": [ + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "internalType": "address", + "name": "_stakingToken", + "type": "address" + }, { "internalType": "uint256", - "name": "_vaultId", + "name": "_vestingEnd", "type": "uint256" - } - ], - "name": "liquidationReward", - "outputs": [ + }, { "internalType": "uint256", - "name": "rewardCollateral", + "name": "_vestingRatio", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "oracleDigits", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" }, { - "inputs": [], - "name": "paused", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Recovered", + "type": "event" }, { - "inputs": [], - "name": "ratio", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "reward", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardAdded", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_tokenAddress", + "name": "user", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_tokenAmount", + "name": "reward", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RewardPaid", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "newDuration", "type": "uint256" } ], - "name": "removeCollateral", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RewardsDurationUpdated", + "type": "event" }, { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { + "indexed": true, "internalType": "address", "name": "account", "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "requiredCollateral", - "outputs": [ + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { - "internalType": "uint256", - "name": "collateral", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "requiredLiquidationTCAP", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Staked", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { + "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrawn", + "type": "event" }, { "inputs": [], - "name": "rewardHandler", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "contract IRewardHandler", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", @@ -25189,82 +25341,89 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" + "internalType": "address", + "name": "_account", + "type": "address" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "balanceOf", + "outputs": [ { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" } ], - "name": "setLiquidationPenalty", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimVest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "earned", + "outputs": [ { "internalType": "uint256", - "name": "_ratio", + "name": "", "type": "uint256" } ], - "name": "setRatio", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "exit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_treasury", - "type": "address" - } - ], - "name": "setTreasury", + "inputs": [], + "name": "getReward", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", + "inputs": [], + "name": "getRewardForDuration", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "tcapOracle", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", @@ -25273,19 +25432,17 @@ { "inputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "treasury", + "name": "getRoleMember", "outputs": [ { "internalType": "address", @@ -25296,22 +25453,15 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "userToVault", + "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", @@ -25325,223 +25475,137 @@ { "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "vaults", - "outputs": [ - { - "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Debt", - "type": "uint256" - }, - { - "internalType": "address", - "name": "Owner", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ] - }, - "DelegatorFactory": { - "address": "0x0aafdB19021a3a87A510dD4db7dce62318b49Cd1", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "stakingToken_", - "type": "address" - }, - { - "internalType": "address", - "name": "rewardsToken_", - "type": "address" - }, - { - "internalType": "uint256", - "name": "waitTime_", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "address", - "name": "timelock_", + "name": "account", "type": "address" } ], + "name": "grantRole", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "delegator", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, "internalType": "address", - "name": "delegatee", + "name": "account", "type": "address" } ], - "name": "DelegatorCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "name": "hasRole", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "", "type": "uint256" } ], - "name": "RewardAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "", "type": "uint256" } ], - "name": "RewardPaid", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "uint256", - "name": "newDuration", + "name": "_a", "type": "uint256" - } - ], - "name": "RewardsDurationUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegator", - "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "delegatee", - "type": "address" - }, + "internalType": "uint256", + "name": "_b", + "type": "uint256" + } + ], + "name": "min", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" } ], - "name": "Staked", - "type": "event" + "stateMutability": "pure", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "uint256", - "name": "waitTime", + "name": "_reward", "type": "uint256" } ], - "name": "WaitTimeUpdated", - "type": "event" + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegator", - "type": "address" - }, + "inputs": [], + "name": "owner", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "delegatee", + "name": "", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "Withdrawn", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "paused", + "outputs": [ { - "internalType": "address", - "name": "account_", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "balanceOf", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "periodFinish", "outputs": [ { "internalType": "uint256", @@ -25556,11 +25620,23 @@ "inputs": [ { "internalType": "address", - "name": "delegatee_", + "name": "_tokenAddress", "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" } ], - "name": "createDelegator", + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -25568,69 +25644,68 @@ { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "delegateeToDelegator", - "outputs": [ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "name": "delegatorToDelegatee", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "delegators", - "outputs": [ - { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account_", - "type": "address" - } - ], - "name": "earned", + "inputs": [], + "name": "rewardRate", "outputs": [ { "internalType": "uint256", @@ -25642,15 +25717,14 @@ "type": "function" }, { - "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getRewardForDuration", + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "rewards", "outputs": [ { "internalType": "uint256", @@ -25663,7 +25737,7 @@ }, { "inputs": [], - "name": "lastTimeRewardApplicable", + "name": "rewardsDuration", "outputs": [ { "internalType": "uint256", @@ -25676,12 +25750,12 @@ }, { "inputs": [], - "name": "lastUpdateTime", + "name": "rewardsToken", "outputs": [ { - "internalType": "uint256", + "internalType": "contract IERC20", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -25691,45 +25765,34 @@ "inputs": [ { "internalType": "uint256", - "name": "a_", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "b_", - "type": "uint256" - } - ], - "name": "min", - "outputs": [ - { - "internalType": "uint256", - "name": "", + "name": "_rewardsDuration", "type": "uint256" } ], - "stateMutability": "pure", + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "reward_", + "name": "_amount", "type": "uint256" } ], - "name": "notifyRewardAmount", + "name": "stake", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "stakingToken", "outputs": [ { - "internalType": "address", + "internalType": "contract IERC20", "name": "", "type": "address" } @@ -25739,7 +25802,7 @@ }, { "inputs": [], - "name": "periodFinish", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -25751,41 +25814,27 @@ "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerToken", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "rewardPerTokenStored", - "outputs": [ + "inputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardRate", + "name": "userRewardPerTokenPaid", "outputs": [ { "internalType": "uint256", @@ -25804,7 +25853,7 @@ "type": "address" } ], - "name": "rewards", + "name": "vestingAmounts", "outputs": [ { "internalType": "uint256", @@ -25817,7 +25866,7 @@ }, { "inputs": [], - "name": "rewardsDuration", + "name": "vestingEnd", "outputs": [ { "internalType": "uint256", @@ -25830,12 +25879,12 @@ }, { "inputs": [], - "name": "rewardsToken", + "name": "vestingRatio", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -25845,73 +25894,89 @@ "inputs": [ { "internalType": "uint256", - "name": "rewardsDuration_", + "name": "_amount", "type": "uint256" } ], - "name": "setRewardsDuration", + "name": "withdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" + } + ] + }, + "DAI": { + "address": "0x118a4238E4086FAE2621D0336C0E6cdC1257BE82", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "delegator_", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "amount_", + "name": "value", "type": "uint256" } ], - "name": "stake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Approval", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "from", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "to", "type": "address" - } - ], - "name": "stakerWaitTime", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "value", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Transfer", + "type": "event" }, { - "inputs": [], - "name": "stakingToken", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", + "name": "allowance", "outputs": [ { "internalType": "uint256", @@ -25926,55 +25991,71 @@ "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "transferOwnership", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ { "internalType": "uint256", - "name": "waitTime_", + "name": "", "type": "uint256" } ], - "name": "updateWaitTime", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "", + "name": "_account", "type": "address" - } - ], - "name": "userRewardPerTokenPaid", - "outputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "waitTime", + "name": "decimals", "outputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "", - "type": "uint256" + "type": "uint8" } ], "stateMutability": "view", @@ -25984,258 +26065,175 @@ "inputs": [ { "internalType": "address", - "name": "delegator_", + "name": "spender", "type": "address" }, { "internalType": "uint256", - "name": "amount_", + "name": "subtractedValue", "type": "uint256" } ], - "name": "withdraw", - "outputs": [], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "ETHLiquidityReward": { - "address": "0xDCDF84255652205debfc9c2603BF28F13597BD82", - "abi": [ + }, { "inputs": [ { "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardsToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_stakingToken", + "name": "spender", "type": "address" }, { "internalType": "uint256", - "name": "_vestingEnd", + "name": "addedValue", "type": "uint256" - }, + } + ], + "name": "increaseAllowance", + "outputs": [ { - "internalType": "uint256", - "name": "_vestingRatio", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "_account", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "name", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "Paused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - }, + "inputs": [], + "name": "symbol", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "Recovered", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "totalSupply", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "", "type": "uint256" } ], - "name": "RewardAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "user", + "name": "recipient", "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "reward", - "type": "uint256" - } - ], - "name": "RewardPaid", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, "internalType": "uint256", - "name": "newDuration", + "name": "amount", "type": "uint256" } ], - "name": "RewardsDurationUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, + "name": "transfer", + "outputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "RoleAdminChanged", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, "internalType": "address", "name": "sender", "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, "internalType": "address", - "name": "user", + "name": "recipient", "type": "address" }, { - "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], - "name": "Staked", - "type": "event" - }, + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "DAIOracle": { + "address": "0xb50365a53EB0d8f214FFD0Cc0F2936BD877B3e17", + "abi": [ { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "_aggregator", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, @@ -26243,72 +26241,60 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "previousOwner", "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "Withdrawn", + "name": "OwnershipTransferred", "type": "event" }, { "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "getLatestAnswer", "outputs": [ { - "internalType": "bytes32", + "internalType": "int256", "name": "", - "type": "bytes32" + "type": "int256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "balanceOf", + "inputs": [], + "name": "getLatestRound", "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", "name": "", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "claimVest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "earned", - "outputs": [ + }, { "internalType": "uint256", "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", @@ -26316,21 +26302,7 @@ }, { "inputs": [], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getRewardForDuration", + "name": "getLatestTimestamp", "outputs": [ { "internalType": "uint256", @@ -26344,17 +26316,17 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "getRoleAdmin", + "name": "getPreviousAnswer", "outputs": [ { - "internalType": "bytes32", + "internalType": "int256", "name": "", - "type": "bytes32" + "type": "int256" } ], "stateMutability": "view", @@ -26363,22 +26335,17 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "getRoleMember", + "name": "getPreviousTimestamp", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -26387,72 +26354,37 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "getRoleMemberCount", + "name": "getRound", "outputs": [ { - "internalType": "uint256", + "internalType": "uint80", "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "type": "uint80" }, { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "int256", + "name": "", + "type": "int256" }, { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ + "type": "uint256" + }, { "internalType": "uint256", "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", @@ -26460,70 +26392,46 @@ }, { "inputs": [], - "name": "lastUpdateTime", + "name": "owner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_a", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_b", - "type": "uint256" - } - ], - "name": "min", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_reward", - "type": "uint256" + "internalType": "address", + "name": "_aggregator", + "type": "address" } ], - "name": "notifyRewardAmount", + "name": "setReferenceContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "supportsInterface", "outputs": [ { "internalType": "bool", @@ -26531,246 +26439,278 @@ "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { - "inputs": [], - "name": "periodFinish", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "DAIRewardHandler": { + "address": "0x423eDDfAA00fE22945739070BB911AcBF1fDf4D4", + "abi": [ { "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "_owner", "type": "address" }, { - "internalType": "uint256", - "name": "_tokenAmount", - "type": "uint256" + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_vault", + "type": "address" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { + "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" }, { - "inputs": [], - "name": "rewardPerToken", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerTokenStored", - "outputs": [ + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Recovered", + "type": "event" }, { - "inputs": [], - "name": "rewardRate", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "reward", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardAdded", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "user", "type": "address" - } - ], - "name": "rewards", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "reward", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardPaid", + "type": "event" }, { - "inputs": [], - "name": "rewardsDuration", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "newDuration", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardsDurationUpdated", + "type": "event" }, { - "inputs": [], - "name": "rewardsToken", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract IERC20", - "name": "", - "type": "address" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_rewardsDuration", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "setRewardsDuration", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "stake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "stakingToken", - "outputs": [ + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { - "internalType": "contract IERC20", - "name": "", + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Staked", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unpaused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "user", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "userRewardPerTokenPaid", + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", @@ -26780,11 +26720,11 @@ "inputs": [ { "internalType": "address", - "name": "", + "name": "_account", "type": "address" } ], - "name": "vestingAmounts", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -26796,8 +26736,14 @@ "type": "function" }, { - "inputs": [], - "name": "vestingEnd", + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "earned", "outputs": [ { "internalType": "uint256", @@ -26809,197 +26755,163 @@ "type": "function" }, { - "inputs": [], - "name": "vestingRatio", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_staker", + "type": "address" } ], - "stateMutability": "view", + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getRewardForDuration", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "GovernorAlpha": { - "address": "0x6f0663fb471c8329De64fb86a2c1b741bb02cB20", - "abi": [ + }, { "inputs": [ { "internalType": "address", - "name": "timelock_", - "type": "address" - }, - { - "internalType": "address", - "name": "ctx_", + "name": "_staker", "type": "address" } ], + "name": "getRewardFromVault", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "id", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "ProposalCanceled", - "type": "event" + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "proposer", - "type": "address" - }, - { - "indexed": false, - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "indexed": false, - "internalType": "string[]", - "name": "signatures", - "type": "string[]" - }, - { - "indexed": false, - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "startBlock", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": false, "internalType": "uint256", - "name": "endBlock", + "name": "index", "type": "uint256" - }, + } + ], + "name": "getRoleMember", + "outputs": [ { - "indexed": false, - "internalType": "string", - "name": "description", - "type": "string" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "ProposalCreated", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { "internalType": "uint256", - "name": "id", + "name": "", "type": "uint256" } ], - "name": "ProposalExecuted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "id", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": false, - "internalType": "uint256", - "name": "eta", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "ProposalQueued", - "type": "event" + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "voter", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ { - "indexed": false, "internalType": "bool", - "name": "support", + "name": "", "type": "bool" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "votes", - "type": "uint256" } ], - "name": "VoteCast", - "type": "event" + "stateMutability": "view", + "type": "function" }, { "inputs": [], - "name": "BALLOT_TYPEHASH", + "name": "lastTimeRewardApplicable", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", @@ -27007,12 +26919,12 @@ }, { "inputs": [], - "name": "DOMAIN_TYPEHASH", + "name": "lastUpdateTime", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", @@ -27022,74 +26934,73 @@ "inputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "_a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_b", "type": "uint256" } ], - "name": "cancel", - "outputs": [], - "stateMutability": "nonpayable", + "name": "min", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "_reward", "type": "uint256" - }, - { - "internalType": "bool", - "name": "support", - "type": "bool" } ], - "name": "castVote", + "name": "notifyRewardAmount", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ { "internalType": "bool", - "name": "support", + "name": "", "type": "bool" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" } ], - "name": "castVoteBySig", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "ctx", + "name": "periodFinish", "outputs": [ { - "internalType": "contract CtxInterface", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -27097,101 +27008,68 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, { "internalType": "uint256", - "name": "proposalId", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "execute", + "name": "recoverERC20", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "getActions", - "outputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "string[]", - "name": "signatures", - "type": "string[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - } - ], - "stateMutability": "view", + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "address", - "name": "voter", + "name": "account", "type": "address" } ], - "name": "getReceipt", - "outputs": [ - { - "components": [ - { - "internalType": "bool", - "name": "hasVoted", - "type": "bool" - }, - { - "internalType": "bool", - "name": "support", - "type": "bool" - }, - { - "internalType": "uint96", - "name": "votes", - "type": "uint96" - } - ], - "internalType": "struct GovernorAlpha.Receipt", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "name": "latestProposalIds", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", "outputs": [ { "internalType": "uint256", @@ -27204,12 +27082,12 @@ }, { "inputs": [], - "name": "name", + "name": "rewardPerTokenStored", "outputs": [ { - "internalType": "string", + "internalType": "uint256", "name": "", - "type": "string" + "type": "uint256" } ], "stateMutability": "view", @@ -27217,7 +27095,7 @@ }, { "inputs": [], - "name": "proposalCount", + "name": "rewardRate", "outputs": [ { "internalType": "uint256", @@ -27229,8 +27107,14 @@ "type": "function" }, { - "inputs": [], - "name": "proposalMaxOperations", + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "rewards", "outputs": [ { "internalType": "uint256", @@ -27238,12 +27122,12 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "proposalThreshold", + "name": "rewardsDuration", "outputs": [ { "internalType": "uint256", @@ -27251,63 +27135,17 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "proposals", + "inputs": [], + "name": "rewardsToken", "outputs": [ { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "address", - "name": "proposer", + "internalType": "contract IERC20", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "eta", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "startBlock", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "endBlock", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "forVotes", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "againstVotes", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "canceled", - "type": "bool" - }, - { - "internalType": "bool", - "name": "executed", - "type": "bool" } ], "stateMutability": "view", @@ -27315,59 +27153,38 @@ }, { "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "string[]", - "name": "signatures", - "type": "string[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "internalType": "string", - "name": "description", - "type": "string" - } - ], - "name": "propose", - "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_rewardsDuration", "type": "uint256" } ], + "name": "setRewardsDuration", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "_staker", + "type": "address" + }, { "internalType": "uint256", - "name": "proposalId", + "name": "_amount", "type": "uint256" } ], - "name": "queue", + "name": "stake", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "quorumVotes", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -27375,57 +27192,36 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, { "internalType": "address", - "name": "", + "name": "newOwner", "type": "address" } ], - "name": "receipts", - "outputs": [ - { - "internalType": "bool", - "name": "hasVoted", - "type": "bool" - }, - { - "internalType": "bool", - "name": "support", - "type": "bool" - }, - { - "internalType": "uint96", - "name": "votes", - "type": "uint96" - } - ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "state", + "name": "userRewardPerTokenPaid", "outputs": [ { - "internalType": "enum GovernorAlpha.ProposalState", + "internalType": "uint256", "name": "", - "type": "uint8" + "type": "uint256" } ], "stateMutability": "view", @@ -27433,10 +27229,10 @@ }, { "inputs": [], - "name": "timelock", + "name": "vault", "outputs": [ { - "internalType": "contract TimelockInterface", + "internalType": "address", "name": "", "type": "address" } @@ -27445,38 +27241,91 @@ "type": "function" }, { - "inputs": [], - "name": "votingDelay", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "votingPeriod", - "outputs": [ + "internalType": "address", + "name": "_staker", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "pure", + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" } ] }, - "LINK": { - "address": "0x5717DC7Cc0489dCc00316bcDB7e752aec664673e", + "DAIVaultHandler": { + "address": "0x7fF4580aD66a3C0F62DDa843674A3811ac062211", "abi": [ { - "inputs": [], + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], "stateMutability": "nonpayable", "type": "constructor" }, @@ -27486,23 +27335,23 @@ { "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" } ], - "name": "Approval", + "name": "CollateralAdded", "type": "event" }, { @@ -27511,329 +27360,348 @@ { "indexed": true, "internalType": "address", - "name": "from", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" } ], - "name": "Transfer", + "name": "CollateralRemoved", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewBurnFee", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewLiquidationPenalty", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewRatio", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "_owner", "type": "address" }, { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" } ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewTreasury", + "type": "event" }, { - "inputs": [], - "name": "decimals", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint8", - "name": "", - "type": "uint8" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "spender", + "name": "account", "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "spender", + "name": "_token", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "addedValue", + "name": "_amount", "type": "uint256" } ], - "name": "increaseAllowance", - "outputs": [ + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "account", "type": "address" }, { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { - "inputs": [], - "name": "name", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "recipient", + "name": "_owner", "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "amount", + "name": "_id", "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "TokensBurned", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "sender", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "recipient", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "transferFrom", - "outputs": [ + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "LinkOracle": { - "address": "0xEecF07643384C689C7AB804887ef2187cE75D5Ec", - "abi": [ + "name": "Unpaused", + "type": "event" + }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_aggregator", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "_timelock", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "VaultCreated", + "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "_liquidator", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" } ], - "name": "OwnershipTransferred", + "name": "VaultLiquidated", "type": "event" }, { "inputs": [], - "name": "getLatestAnswer", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "int256", + "internalType": "bytes32", "name": "", - "type": "int256" + "type": "bytes32" } ], "stateMutability": "view", @@ -27841,32 +27709,12 @@ }, { "inputs": [], - "name": "getLatestRound", + "name": "ETHPriceOracle", "outputs": [ { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint80", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint80" + "type": "address" } ], "stateMutability": "view", @@ -27874,7 +27722,7 @@ }, { "inputs": [], - "name": "getLatestTimestamp", + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -27886,38 +27734,39 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousAnswer", + "inputs": [], + "name": "MIN_RATIO", "outputs": [ { - "internalType": "int256", + "internalType": "uint256", "name": "", - "type": "int256" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "uint256", + "name": "price", + "type": "uint256" } ], - "name": "getPreviousTimestamp", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", "outputs": [ { - "internalType": "uint256", + "internalType": "contract TCAP", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -27926,37 +27775,50 @@ { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "getRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ { - "internalType": "uint80", + "internalType": "contract IERC20", "name": "", - "type": "uint80" + "type": "address" } ], "stateMutability": "view", @@ -27964,10 +27826,10 @@ }, { "inputs": [], - "name": "owner", + "name": "collateralPriceOracle", "outputs": [ { - "internalType": "address", + "internalType": "contract ChainlinkOracle", "name": "", "type": "address" } @@ -27977,508 +27839,553 @@ }, { "inputs": [], - "name": "renounceOwnership", + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { - "internalType": "address", - "name": "_aggregator", + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", "type": "address" } ], - "name": "setReferenceContract", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "supportsInterface", + "name": "getRoleAdmin", "outputs": [ { - "internalType": "bool", + "internalType": "bytes32", "name": "", - "type": "bool" + "type": "bytes32" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ { "internalType": "address", - "name": "newOwner", + "name": "", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "LinkVaultHandler": { - "address": "0xBd4a21cC2D12157765a8861A83FC4cfd216630b1", - "abi": [ + }, { "inputs": [ { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ { "internalType": "uint256", - "name": "_divisor", + "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "_ratio", + "name": "_id", "type": "uint256" - }, + } + ], + "name": "getVault", + "outputs": [ { "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" }, { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" }, { "internalType": "address", - "name": "_tcapOracle", + "name": "", "type": "address" }, { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "internalType": "address", - "name": "_rewardHandler", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "address", - "name": "_treasury", + "name": "account", "type": "address" } ], + "name": "grantRole", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "CollateralAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_vaultId", "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_maxTCAP", "type": "uint256" } ], - "name": "CollateralRemoved", - "type": "event" + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" } ], - "name": "NewBurnFee", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "rewardCollateral", "type": "uint256" } ], - "name": "NewLiquidationPenalty", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "_ratio", + "name": "_amount", "type": "uint256" } ], - "name": "NewRatio", - "type": "event" + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "oracleDigits", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "_tresury", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "NewTreasury", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "ratio", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Paused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "_token", + "name": "_tokenAddress", "type": "address" }, { - "indexed": false, + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "RoleAdminChanged", - "type": "event" + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" } ], - "name": "RoleGranted", - "type": "event" + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, "internalType": "address", "name": "account", "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" } ], - "name": "RoleRevoked", - "type": "event" + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "rewardHandler", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", + "internalType": "contract IRewardHandler", + "name": "", "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" } ], - "name": "TokensBurned", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, - { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_burnFee", "type": "uint256" } ], - "name": "TokensMinted", - "type": "event" + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "name": "Unpaused", - "type": "event" + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_ratio", "type": "uint256" } ], - "name": "VaultCreated", - "type": "event" + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, - { - "indexed": true, "internalType": "address", - "name": "_liquidator", + "name": "_treasury", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_reward", - "type": "uint256" } ], - "name": "VaultLiquidated", - "type": "event" + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { - "internalType": "bytes32", + "internalType": "bool", "name": "", - "type": "bytes32" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "ETHPriceOracle", + "name": "tcapOracle", "outputs": [ { "internalType": "contract ChainlinkOracle", @@ -28490,26 +28397,26 @@ "type": "function" }, { - "inputs": [], - "name": "MAX_FEE", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "MIN_RATIO", + "name": "treasury", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -28517,75 +28424,6380 @@ }, { "inputs": [], - "name": "TCAPPrice", - "outputs": [ - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "TCAPToken", - "outputs": [ + "inputs": [ { - "internalType": "contract TCAP", + "internalType": "address", "name": "", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "name": "userToVault", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "addCollateral", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "burnFee", + "name": "vaults", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "Id", "type": "uint256" - } + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "DelegatorFactory": { + "address": "0x0aafdB19021a3a87A510dD4db7dce62318b49Cd1", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "stakingToken_", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardsToken_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "waitTime_", + "type": "uint256" + }, + { + "internalType": "address", + "name": "timelock_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegatee", + "type": "address" + } + ], + "name": "DelegatorCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + } + ], + "name": "RewardAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + } + ], + "name": "RewardPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" + } + ], + "name": "RewardsDurationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegatee", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "waitTime", + "type": "uint256" + } + ], + "name": "WaitTimeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegatee", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account_", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee_", + "type": "address" + } + ], + "name": "createDelegator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "delegateeToDelegator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "delegatorToDelegatee", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "delegators", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account_", + "type": "address" + } + ], + "name": "earned", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getRewardForDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b_", + "type": "uint256" + } + ], + "name": "min", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "reward_", + "type": "uint256" + } + ], + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "periodFinish", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "rewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardsDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardsToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "rewardsDuration_", + "type": "uint256" + } + ], + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegator_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "stakerWaitTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakingToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "waitTime_", + "type": "uint256" + } + ], + "name": "updateWaitTime", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRewardPerTokenPaid", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "waitTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegator_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "ETHLiquidityReward": { + "address": "0xDCDF84255652205debfc9c2603BF28F13597BD82", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_stakingToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_vestingEnd", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_vestingRatio", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + } + ], + "name": "RewardAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + } + ], + "name": "RewardPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" + } + ], + "name": "RewardsDurationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimVest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "earned", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getRewardForDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_b", + "type": "uint256" + } + ], + "name": "min", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "periodFinish", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "rewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardsDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardsToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_rewardsDuration", + "type": "uint256" + } + ], + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakingToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRewardPerTokenPaid", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "vestingAmounts", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vestingEnd", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vestingRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "GovernorAlpha": { + "address": "0x6f0663fb471c8329De64fb86a2c1b741bb02cB20", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "timelock_", + "type": "address" + }, + { + "internalType": "address", + "name": "ctx_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "ProposalCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "indexed": false, + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startBlock", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endBlock", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "ProposalCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "ProposalExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "eta", + "type": "uint256" + } + ], + "name": "ProposalQueued", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "support", + "type": "bool" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "votes", + "type": "uint256" + } + ], + "name": "VoteCast", + "type": "event" + }, + { + "inputs": [], + "name": "BALLOT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "support", + "type": "bool" + } + ], + "name": "castVote", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "support", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "castVoteBySig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "ctx", + "outputs": [ + { + "internalType": "contract CtxInterface", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "getActions", + "outputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "voter", + "type": "address" + } + ], + "name": "getReceipt", + "outputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "hasVoted", + "type": "bool" + }, + { + "internalType": "bool", + "name": "support", + "type": "bool" + }, + { + "internalType": "uint96", + "name": "votes", + "type": "uint96" + } + ], + "internalType": "struct GovernorAlpha.Receipt", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "latestProposalIds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proposalCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proposalMaxOperations", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "proposalThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proposals", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "eta", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "startBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "forVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "againstVotes", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "canceled", + "type": "bool" + }, + { + "internalType": "bool", + "name": "executed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "propose", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "queue", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "quorumVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "receipts", + "outputs": [ + { + "internalType": "bool", + "name": "hasVoted", + "type": "bool" + }, + { + "internalType": "bool", + "name": "support", + "type": "bool" + }, + { + "internalType": "uint96", + "name": "votes", + "type": "uint96" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "state", + "outputs": [ + { + "internalType": "enum GovernorAlpha.ProposalState", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "timelock", + "outputs": [ + { + "internalType": "contract TimelockInterface", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "votingDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "votingPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ] + }, + "LINK": { + "address": "0x5717DC7Cc0489dCc00316bcDB7e752aec664673e", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "LinkOracle": { + "address": "0xEecF07643384C689C7AB804887ef2187cE75D5Ec", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_timelock", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "LinkVaultHandler": { + "address": "0xBd4a21cC2D12157765a8861A83FC4cfd216630b1", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardHandler", + "outputs": [ + { + "internalType": "contract IRewardHandler", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "Orchestrator": { + "address": "0x32ac6dBaf90A4C45f160D13B32fDD10D75D09976", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_guardian", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "guardian", + "type": "address" + } + ], + "name": "GuardianSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "TransactionExecuted", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" + }, + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "addTCAPVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" + }, + { + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "enableTCAPCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "executeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "guardian", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "pauseVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" + }, + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "removeTCAPVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "retrieveETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "setEmergencyBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "setEmergencyLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_guardian", + "type": "address" + } + ], + "name": "setGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + } + ], + "name": "setTCAPCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + } + ], + "name": "unpauseVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "TCAP": { + "address": "0x565224C2b5Bdf33f3970d35f82945075F90128F4", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + }, + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "NewCap", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "NewCapEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_tokenHandler", + "type": "address" + } + ], + "name": "VaultHandlerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_tokenHandler", + "type": "address" + } + ], + "name": "VaultHandlerRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vaultHandler", + "type": "address" + } + ], + "name": "addVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "capEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "enableCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vaultHandler", + "type": "address" + } + ], + "name": "removeVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + } + ], + "name": "setCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "vaultHandlers", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "TCAPOracle": { + "address": "0x87388c142a3848F966FBA7Db22663D9CCa7d8a86", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "Timelock": { + "address": "0x65a2B1B48b7997a50947E83aaf58E29a54a0B735", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "delay_", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "eta", + "type": "uint256" + } + ], + "name": "CancelTransaction", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "eta", + "type": "uint256" + } + ], + "name": "ExecuteTransaction", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "NewAdmin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + } + ], + "name": "NewDelay", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "NewPendingAdmin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "eta", + "type": "uint256" + } + ], + "name": "QueueTransaction", + "type": "event" + }, + { + "inputs": [], + "name": "GRACE_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAXIMUM_DELAY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINIMUM_DELAY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "eta", + "type": "uint256" + } + ], + "name": "cancelTransaction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "delay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "eta", + "type": "uint256" + } + ], + "name": "executeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "eta", + "type": "uint256" + } + ], + "name": "queueTransaction", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "queuedTransactions", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "delay_", + "type": "uint256" + } + ], + "name": "setDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pendingAdmin_", + "type": "address" + } + ], + "name": "setPendingAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "WBTC": { + "address": "0x81A345e4627C614DaBA4E862A8c317023E935506", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "WETH": { + "address": "0x5D3E425A099c2863224d6D63b330Df0F22B299b9", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "WETHOracle": { + "address": "0x731Aa03C683Afb292732C31c1d50C491B8d8043F", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } ], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "collateralContract", + "name": "owner", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "address", "name": "", "type": "address" } @@ -28595,126 +34807,312 @@ }, { "inputs": [], - "name": "collateralPriceOracle", - "outputs": [ + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", + "internalType": "address", + "name": "_aggregator", "type": "address" } ], - "stateMutability": "view", + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "counter", + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { - "internalType": "uint256", - "name": "_value", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { - "inputs": [], - "name": "createVault", + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" + } + ] + }, + "WETHRewardHandler": { + "address": "0x39347a6328e1D4601A389d4dB0B26aC305886fb0", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" }, { - "inputs": [], - "name": "divisor", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Recovered", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "reward", "type": "uint256" } ], - "name": "getFee", - "outputs": [ + "name": "RewardAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "fee", + "name": "reward", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardPaid", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" + } + ], + "name": "RewardsDurationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", "type": "address" } ], - "name": "getOraclePrice", - "outputs": [ + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "price", + "name": "amount", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" + ], + "name": "Staked", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Unpaused", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "index", + "name": "amount", "type": "uint256" } ], - "name": "getRoleMember", + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "address", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", @@ -28723,12 +35121,12 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "_account", + "type": "address" } ], - "name": "getRoleMemberCount", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -28742,28 +35140,13 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "address", + "name": "_account", + "type": "address" } ], - "name": "getVault", + "name": "earned", "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, { "internalType": "uint256", "name": "", @@ -28776,16 +35159,30 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "_staker", + "type": "address" } ], - "name": "getVaultRatio", + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getRewardForDuration", "outputs": [ { "internalType": "uint256", - "name": "currentRatio", + "name": "", "type": "uint256" } ], @@ -28794,18 +35191,13 @@ }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "_staker", "type": "address" } ], - "name": "grantRole", + "name": "getRewardFromVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -28816,19 +35208,14 @@ "internalType": "bytes32", "name": "role", "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" } ], - "name": "hasRole", + "name": "getRoleAdmin", "outputs": [ { - "internalType": "bool", + "internalType": "bytes32", "name": "", - "type": "bool" + "type": "bytes32" } ], "stateMutability": "view", @@ -28837,29 +35224,22 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "uint256", - "name": "_maxTCAP", + "name": "index", "type": "uint256" } ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "liquidationPenalty", + "name": "getRoleMember", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -28868,16 +35248,16 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "liquidationReward", + "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", - "name": "rewardCollateral", + "name": "", "type": "uint256" } ], @@ -28887,52 +35267,35 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "mint", + "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "oracleDigits", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "hasRole", "outputs": [ { "internalType": "bool", @@ -28945,7 +35308,7 @@ }, { "inputs": [], - "name": "ratio", + "name": "lastTimeRewardApplicable", "outputs": [ { "internalType": "uint256", @@ -28957,178 +35320,133 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_tokenAddress", - "type": "address" - }, + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ { "internalType": "uint256", - "name": "_tokenAmount", + "name": "", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "_a", "type": "uint256" - } - ], - "name": "removeCollateral", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "_b", "type": "uint256" } ], - "name": "requiredCollateral", + "name": "min", "outputs": [ { "internalType": "uint256", - "name": "collateral", + "name": "", "type": "uint256" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "requiredLiquidationTCAP", - "outputs": [ - { - "internalType": "uint256", - "name": "amount", + "name": "_reward", "type": "uint256" } ], - "stateMutability": "view", + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "rewardHandler", + "name": "paused", "outputs": [ { - "internalType": "contract IRewardHandler", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "periodFinish", + "outputs": [ { "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "setLiquidationPenalty", + "name": "recoverERC20", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - } - ], - "name": "setRatio", + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "_treasury", + "name": "account", "type": "address" } ], - "name": "setTreasury", + "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -29136,68 +35454,60 @@ { "inputs": [ { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "pure", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "tcapOracle", + "name": "rewardPerToken", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "treasury", + "name": "rewardRate", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -29206,7 +35516,7 @@ "type": "address" } ], - "name": "userToVault", + "name": "rewards", "outputs": [ { "internalType": "uint256", @@ -29218,156 +35528,84 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "vaults", + "inputs": [], + "name": "rewardsDuration", "outputs": [ { "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Debt", + "name": "", "type": "uint256" - }, - { - "internalType": "address", - "name": "Owner", - "type": "address" } ], "stateMutability": "view", "type": "function" - } - ] - }, - "Orchestrator": { - "address": "0x32ac6dBaf90A4C45f160D13B32fDD10D75D09976", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_guardian", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "rewardsToken", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "guardian", + "internalType": "contract IERC20", + "name": "", "type": "address" } ], - "name": "GuardianSet", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "_rewardsDuration", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "target", + "name": "_staker", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" } ], - "name": "TransactionExecuted", - "type": "event" + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "inputs": [ - { - "internalType": "contract TCAP", - "name": "_tcap", - "type": "address" - }, + "inputs": [], + "name": "totalSupply", + "outputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "addTCAPVault", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "contract TCAP", - "name": "_tcap", + "internalType": "address", + "name": "newOwner", "type": "address" - }, - { - "internalType": "bool", - "name": "_enable", - "type": "bool" } ], - "name": "enableTCAPCap", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -29376,39 +35614,24 @@ "inputs": [ { "internalType": "address", - "name": "target", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" } ], - "name": "executeTransaction", + "name": "userRewardPerTokenPaid", "outputs": [ { - "internalType": "bytes", + "internalType": "uint256", "name": "", - "type": "bytes" + "type": "uint256" } ], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "guardian", + "name": "vault", "outputs": [ { "internalType": "address", @@ -29420,240 +35643,345 @@ "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "_staker", "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "WETHVaultHandler": { + "address": "0x093f8F7C7fCC6edf991309A5056feB5cA9579292", + "abi": [ { "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", "type": "address" } ], - "name": "pauseVault", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "contract TCAP", - "name": "_tcap", + "indexed": true, + "internalType": "address", + "name": "_owner", "type": "address" }, { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "removeTCAPVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "CollateralAdded", + "type": "event" }, { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_to", + "name": "_owner", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" } ], - "name": "retrieveETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewBurnFee", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", + "indexed": true, + "internalType": "address", + "name": "_owner", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_burnFee", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewLiquidationPenalty", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", + "indexed": true, + "internalType": "address", + "name": "_owner", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" } ], - "name": "setEmergencyBurnFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewRatio", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", "type": "address" } ], - "name": "setEmergencyLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewTreasury", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_guardian", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", "type": "address" } ], - "name": "setGuardian", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", + "indexed": false, + "internalType": "address", + "name": "account", "type": "address" - }, - { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", + "indexed": false, + "internalType": "address", + "name": "_token", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_ratio", + "name": "_amount", "type": "uint256" } ], - "name": "setRatio", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Recovered", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "contract TCAP", - "name": "_tcap", - "type": "address" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "_cap", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "name": "setTCAPCap", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + }, { - "internalType": "contract IVaultHandler", - "name": "_vault", + "indexed": true, + "internalType": "address", + "name": "sender", "type": "address" } ], - "name": "unpauseVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "TCAP": { - "address": "0x565224C2b5Bdf33f3970d35f82945075F90128F4", - "abi": [ - { + "anonymous": false, "inputs": [ { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "string", - "name": "_symbol", - "type": "string" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "_cap", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" }, { - "internalType": "contract Orchestrator", - "name": "_orchestrator", + "indexed": true, + "internalType": "address", + "name": "sender", "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "RoleRevoked", + "type": "event" }, { "anonymous": false, @@ -29661,23 +35989,23 @@ { "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" } ], - "name": "Approval", + "name": "TokensBurned", "type": "event" }, { @@ -29689,6 +36017,12 @@ "name": "_owner", "type": "address" }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", @@ -29696,26 +36030,20 @@ "type": "uint256" } ], - "name": "NewCap", + "name": "TokensMinted", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "_owner", + "name": "account", "type": "address" - }, - { - "indexed": false, - "internalType": "bool", - "name": "_enable", - "type": "bool" } ], - "name": "NewCapEnabled", + "name": "Unpaused", "type": "event" }, { @@ -29724,17 +36052,17 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" } ], - "name": "OwnershipTransferred", + "name": "VaultCreated", "type": "event" }, { @@ -29742,138 +36070,228 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { "indexed": true, "internalType": "address", - "name": "to", + "name": "_liquidator", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", "type": "uint256" } ], - "name": "Transfer", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "TCAPToken", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "_tokenHandler", + "internalType": "contract TCAP", + "name": "", "type": "address" } ], - "name": "VaultHandlerAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_tokenHandler", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "VaultHandlerRemoved", - "type": "event" + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "addCollateralETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "_vaultHandler", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "addVaultHandler", + "name": "burn", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, + "inputs": [], + "name": "burnFee", + "outputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "allowance", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", "outputs": [ { - "internalType": "uint256", + "internalType": "contract IERC20", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ { - "internalType": "address", - "name": "spender", + "internalType": "contract ChainlinkOracle", + "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ { "internalType": "uint256", - "name": "amount", + "name": "_value", "type": "uint256" } ], - "name": "approve", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "balanceOf", + "name": "getFee", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "fee", "type": "uint256" } ], @@ -29883,55 +36301,79 @@ { "inputs": [ { - "internalType": "address", - "name": "_account", + "internalType": "contract ChainlinkOracle", + "name": "_oracle", "type": "address" - }, + } + ], + "name": "getOraclePrice", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "price", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "cap", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "capEnabled", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "decimals", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", "outputs": [ { - "internalType": "uint8", + "internalType": "uint256", "name": "", - "type": "uint8" + "type": "uint256" } ], "stateMutability": "view", @@ -29939,37 +36381,71 @@ }, { "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, { "internalType": "address", - "name": "spender", + "name": "", "type": "address" }, { "internalType": "uint256", - "name": "subtractedValue", + "name": "", "type": "uint256" } ], - "name": "decreaseAllowance", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bool", - "name": "_enable", - "type": "bool" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "enableCap", + "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -29977,17 +36453,17 @@ { "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "increaseAllowance", + "name": "hasRole", "outputs": [ { "internalType": "bool", @@ -29995,48 +36471,54 @@ "type": "bool" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "_account", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { "internalType": "uint256", - "name": "_amount", + "name": "_maxTCAP", "type": "uint256" } ], - "name": "mint", + "name": "liquidateVault", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "name", + "name": "liquidationPenalty", "outputs": [ { - "internalType": "string", + "internalType": "uint256", "name": "", - "type": "string" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "owner", + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", "outputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" } ], "stateMutability": "view", @@ -30045,63 +36527,57 @@ { "inputs": [ { - "internalType": "address", - "name": "_vaultHandler", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "removeVaultHandler", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "oracleDigits", + "outputs": [ { "internalType": "uint256", - "name": "_cap", + "name": "", "type": "uint256" } ], - "name": "setCap", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "symbol", + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "string", + "internalType": "bool", "name": "", - "type": "string" + "type": "bool" } ], "stateMutability": "view", @@ -30109,7 +36585,7 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "ratio", "outputs": [ { "internalType": "uint256", @@ -30124,64 +36600,67 @@ "inputs": [ { "internalType": "address", - "name": "recipient", + "name": "_tokenAddress", "type": "address" }, { "internalType": "uint256", - "name": "amount", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "name": "recoverERC20", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, { "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "transferFrom", - "outputs": [ + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], + "name": "removeCollateralETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "transferOwnership", + "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -30189,199 +36668,149 @@ { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "vaultHandlers", + "name": "requiredCollateral", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "collateral", + "type": "uint256" } ], "stateMutability": "view", "type": "function" - } - ] - }, - "TCAPOracle": { - "address": "0x87388c142a3848F966FBA7Db22663D9CCa7d8a86", - "abi": [ + }, { "inputs": [ { - "internalType": "address", - "name": "_aggregator", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { "inputs": [], - "name": "getLatestAnswer", + "name": "rewardHandler", "outputs": [ { - "internalType": "int256", + "internalType": "contract IRewardHandler", "name": "", - "type": "int256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "getLatestRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], - "stateMutability": "view", + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "getLatestTimestamp", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_liquidationPenalty", "type": "uint256" } ], - "stateMutability": "view", + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousAnswer", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" } ], - "stateMutability": "view", + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_treasury", + "type": "address" } ], - "stateMutability": "view", + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" } ], - "name": "getRound", + "name": "supportsInterface", "outputs": [ { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint80", + "internalType": "bool", "name": "", - "type": "uint80" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "tcapOracle", "outputs": [ { - "internalType": "address", + "internalType": "contract ChainlinkOracle", "name": "", "type": "address" } @@ -30390,21 +36819,34 @@ "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "treasury", + "outputs": [ { "internalType": "address", - "name": "_aggregator", + "name": "", "type": "address" } ], - "name": "setReferenceContract", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -30412,140 +36854,154 @@ { "inputs": [ { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "supportsInterface", + "name": "userToVault", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, { "internalType": "address", - "name": "newOwner", + "name": "Owner", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" } ] }, - "Timelock": { - "address": "0x65a2B1B48b7997a50947E83aaf58E29a54a0B735", + "HardWETHVaultHandler": { + "address": "0x6E3B4E276f22C30085882dD1342995773AE76414", "abi": [ { "inputs": [ { - "internalType": "address", - "name": "admin_", + "internalType": "contract Orchestrator", + "name": "_orchestrator", "type": "address" }, { "internalType": "uint256", - "name": "delay_", + "name": "_divisor", "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ + }, { - "indexed": true, - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32" + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" }, { - "indexed": true, - "internalType": "address", - "name": "target", - "type": "address" + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_liquidationPenalty", "type": "uint256" }, { - "indexed": false, - "internalType": "string", - "name": "signature", - "type": "string" + "internalType": "address", + "name": "_tcapOracle", + "type": "address" }, { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "eta", + "name": "_minimumTCAP", "type": "uint256" } ], - "name": "CancelTransaction", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32" - }, { "indexed": true, "internalType": "address", - "name": "target", + "name": "_owner", "type": "address" }, { - "indexed": false, + "indexed": true, "internalType": "uint256", - "name": "value", + "name": "_id", "type": "uint256" }, - { - "indexed": false, - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, { "indexed": false, "internalType": "uint256", - "name": "eta", + "name": "_amount", "type": "uint256" } ], - "name": "ExecuteTransaction", + "name": "CollateralAdded", "type": "event" }, { @@ -30554,11 +37010,23 @@ { "indexed": true, "internalType": "address", - "name": "newAdmin", + "name": "_owner", "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "NewAdmin", + "name": "CollateralRemoved", "type": "event" }, { @@ -30566,12 +37034,18 @@ "inputs": [ { "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "newDelay", + "name": "_burnFee", "type": "uint256" } ], - "name": "NewDelay", + "name": "NewBurnFee", "type": "event" }, { @@ -30580,329 +37054,264 @@ { "indexed": true, "internalType": "address", - "name": "newPendingAdmin", + "name": "_owner", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "name": "NewPendingAdmin", + "name": "NewLiquidationPenalty", "type": "event" }, { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32" - }, { "indexed": true, "internalType": "address", - "name": "target", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "eta", + "name": "_minimumTCAP", "type": "uint256" } ], - "name": "QueueTransaction", + "name": "NewMinimumTCAP", "type": "event" }, { - "inputs": [], - "name": "GRACE_PERIOD", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAXIMUM_DELAY", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewRatio", + "type": "event" }, { - "inputs": [], - "name": "MINIMUM_DELAY", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "acceptAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "admin", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": false, "internalType": "address", - "name": "", + "name": "_tresury", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "NewTreasury", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "target", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "eta", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "cancelTransaction", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "delay", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "target", + "name": "_token", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "signature", - "type": "string" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "eta", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "name": "executeTransaction", - "outputs": [ + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bytes", - "name": "", - "type": "bytes" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "payable", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { - "inputs": [], - "name": "pendingAdmin", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "target", + "name": "_owner", "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "value", + "name": "_id", "type": "uint256" }, { - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { + "indexed": false, "internalType": "uint256", - "name": "eta", + "name": "_amount", "type": "uint256" } ], - "name": "queueTransaction", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "TokensBurned", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "queuedTransactions", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { + "indexed": false, "internalType": "uint256", - "name": "delay_", + "name": "_amount", "type": "uint256" } ], - "name": "setDelay", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "TokensMinted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "pendingAdmin_", + "name": "account", "type": "address" } ], - "name": "setPendingAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "WBTC": { - "address": "0x81A345e4627C614DaBA4E862A8c317023E935506", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "Unpaused", + "type": "event" }, { "anonymous": false, @@ -30910,23 +37319,17 @@ { "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_id", "type": "uint256" } ], - "name": "Approval", + "name": "VaultCreated", "type": "event" }, { @@ -30934,40 +37337,74 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { "indexed": true, "internalType": "address", - "name": "to", + "name": "_liquidator", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", "type": "uint256" } ], - "name": "Transfer", + "name": "VaultLiquidated", "type": "event" }, { - "inputs": [ + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ { - "internalType": "address", - "name": "owner", - "type": "address" - }, + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ { - "internalType": "address", - "name": "spender", + "internalType": "contract ChainlinkOracle", + "name": "", "type": "address" } ], - "name": "allowance", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -30979,55 +37416,66 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ { "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" } ], - "name": "approve", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "price", + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "TCAPToken", + "outputs": [ { - "internalType": "address", - "name": "account", + "internalType": "contract TCAP", + "name": "", "type": "address" } ], - "name": "balanceOf", - "outputs": [ + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "addCollateralETH", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, { "internalType": "uint256", "name": "_amount", @@ -31036,121 +37484,126 @@ ], "name": "burn", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "decimals", + "name": "burnFee", "outputs": [ { - "internalType": "uint8", + "internalType": "uint256", "name": "", - "type": "uint8" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", + "inputs": [], + "name": "collateralContract", "outputs": [ { - "internalType": "bool", + "internalType": "contract IERC20", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", + "outputs": [ { "internalType": "uint256", - "name": "addedValue", + "name": "", "type": "uint256" } ], - "name": "increaseAllowance", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", "outputs": [ { - "internalType": "bool", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, + "inputs": [], + "name": "counter", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "_value", "type": "uint256" } ], - "name": "mint", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "name", + "name": "divisor", "outputs": [ { - "internalType": "string", + "internalType": "uint256", "name": "", - "type": "string" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "symbol", + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", "outputs": [ { - "internalType": "string", - "name": "", - "type": "string" + "internalType": "uint256", + "name": "fee", + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "totalSupply", + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "price", "type": "uint256" } ], @@ -31160,168 +37613,155 @@ { "inputs": [ { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "transfer", + "name": "getRoleAdmin", "outputs": [ { - "internalType": "bool", + "internalType": "bytes32", "name": "", - "type": "bool" + "type": "bytes32" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "uint256", - "name": "amount", + "name": "index", "type": "uint256" } ], - "name": "transferFrom", + "name": "getRoleMember", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "WETH": { - "address": "0x5D3E425A099c2863224d6D63b330Df0F22B299b9", - "abi": [ + }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "guy", - "type": "address" - }, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "wad", + "name": "", "type": "uint256" } ], - "name": "Approval", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { "internalType": "address", - "name": "dst", + "name": "", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "wad", + "name": "", "type": "uint256" } ], - "name": "Deposit", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "dst", - "type": "address" - }, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "wad", + "name": "currentRatio", "type": "uint256" } ], - "name": "Transfer", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "src", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "Withdrawal", - "type": "event" + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "name": "allowance", + "name": "hasRole", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", @@ -31330,40 +37770,47 @@ { "inputs": [ { - "internalType": "address", - "name": "guy", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { "internalType": "uint256", - "name": "wad", + "name": "_maxTCAP", "type": "uint256" } ], - "name": "approve", + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" } ], - "name": "balanceOf", + "name": "liquidationReward", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "rewardCollateral", "type": "uint256" } ], @@ -31372,32 +37819,38 @@ }, { "inputs": [], - "name": "decimals", + "name": "minimumTCAP", "outputs": [ { - "internalType": "uint8", + "internalType": "uint256", "name": "", - "type": "uint8" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "deposit", + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "name", + "name": "oracleDigits", "outputs": [ { - "internalType": "string", + "internalType": "uint256", "name": "", - "type": "string" + "type": "uint256" } ], "stateMutability": "view", @@ -31405,12 +37858,12 @@ }, { "inputs": [], - "name": "symbol", + "name": "owner", "outputs": [ { - "internalType": "string", + "internalType": "address", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", @@ -31418,67 +37871,52 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "dst", - "type": "address" - }, - { - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "transfer", + "inputs": [], + "name": "ratio", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "src", - "type": "address" - }, - { - "internalType": "address", - "name": "dst", + "name": "_tokenAddress", "type": "address" }, { "internalType": "uint256", - "name": "wad", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "name": "recoverERC20", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -31486,103 +37924,85 @@ "inputs": [ { "internalType": "uint256", - "name": "wad", + "name": "_amount", "type": "uint256" } ], - "name": "withdraw", + "name": "removeCollateral", "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "WETHOracle": { - "address": "0x731Aa03C683Afb292732C31c1d50C491B8d8043F", - "abi": [ + }, { "inputs": [ { - "internalType": "address", - "name": "_aggregator", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], + "name": "removeCollateralETH", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "getLatestAnswer", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" - } - ], - "stateMutability": "view", + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "getLatestRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "requiredCollateral", + "outputs": [ { "internalType": "uint256", - "name": "", + "name": "collateral", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "getLatestTimestamp", + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], @@ -31592,96 +38012,69 @@ { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "getPreviousAnswer", - "outputs": [ + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "int256", - "name": "", - "type": "int256" + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" } ], - "stateMutability": "view", + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousTimestamp", - "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_liquidationPenalty", "type": "uint256" } ], - "stateMutability": "view", + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, { "internalType": "uint256", - "name": "", + "name": "_minimumTCAP", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], - "stateMutability": "view", + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", + "name": "setRatio", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -31690,11 +38083,11 @@ "inputs": [ { "internalType": "address", - "name": "_aggregator", + "name": "_treasury", "type": "address" } ], - "name": "setReferenceContract", + "name": "setTreasury", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -31703,7 +38096,7 @@ "inputs": [ { "internalType": "bytes4", - "name": "interfaceId", + "name": "_interfaceId", "type": "bytes4" } ], @@ -31718,6 +38111,19 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -31730,202 +38136,222 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "WETHRewardHandler": { - "address": "0x39347a6328e1D4601A389d4dB0B26aC305886fb0", - "abi": [ + }, { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardsToken", - "type": "address" - }, + "inputs": [], + "name": "treasury", + "outputs": [ { "internalType": "address", - "name": "_vault", + "name": "", "type": "address" } ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "", "type": "address" - }, + } + ], + "name": "userToVault", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "vaults", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" + "internalType": "uint256", + "name": "Id", + "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "Collateral", "type": "uint256" - } - ], - "name": "Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "Debt", "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], - "name": "RewardAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "HardDaiVaultHandler": { + "address": "0x95ac341B6492954DF1341A33cAC9AB3273179232", + "abi": [ + { "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "user", + "internalType": "contract Orchestrator", + "name": "_orchestrator", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_divisor", "type": "uint256" - } - ], - "name": "RewardPaid", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + }, { - "indexed": false, "internalType": "uint256", - "name": "newDuration", + "name": "_minimumTCAP", "type": "uint256" } ], - "name": "RewardsDurationUpdated", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "_owner", + "type": "address" }, { "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "RoleAdminChanged", + "name": "CollateralAdded", "type": "event" }, { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "RoleGranted", + "name": "CollateralRemoved", "type": "event" }, { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" } ], - "name": "RoleRevoked", + "name": "NewBurnFee", "type": "event" }, { @@ -31934,30 +38360,36 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "Staked", + "name": "NewLiquidationPenalty", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" } ], - "name": "Unpaused", + "name": "NewMinimumTCAP", "type": "event" }, { @@ -31966,391 +38398,298 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_ratio", "type": "uint256" } ], - "name": "Withdrawn", + "name": "NewRatio", "type": "event" }, { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "_owner", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "NewTreasury", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "previousOwner", "type": "address" - } - ], - "name": "earned", - "outputs": [ + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "_staker", + "name": "account", "type": "address" } ], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getRewardForDuration", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "_staker", + "name": "_token", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "getRewardFromVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Recovered", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + }, { + "indexed": true, "internalType": "bytes32", - "name": "role", + "name": "previousAdminRole", "type": "bytes32" }, { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { + "indexed": true, "internalType": "bytes32", - "name": "role", + "name": "newAdminRole", "type": "bytes32" } ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { + "indexed": true, "internalType": "address", "name": "account", "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { + "indexed": true, "internalType": "address", "name": "account", "type": "address" - } - ], - "name": "hasRole", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": true, "internalType": "uint256", - "name": "", + "name": "_id", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastUpdateTime", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "TokensBurned", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_a", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "_b", + "name": "_id", "type": "uint256" - } - ], - "name": "min", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "pure", - "type": "function" + "name": "TokensMinted", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_reward", - "type": "uint256" - } - ], - "name": "notifyRewardAmount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { + "indexed": false, "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "periodFinish", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "name": "Unpaused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_tokenAddress", + "name": "_owner", "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "_tokenAmount", + "name": "_id", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "VaultCreated", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { + "indexed": true, "internalType": "address", - "name": "account", + "name": "_liquidator", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "VaultLiquidated", + "type": "event" }, { - "inputs": [ + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ { "internalType": "bytes32", - "name": "role", + "name": "", "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "rewardPerToken", + "name": "ETHPriceOracle", "outputs": [ { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -32358,12 +38697,12 @@ }, { "inputs": [], - "name": "rewardPerTokenStored", + "name": "MAX_DECIMAL_PLACES", "outputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "", - "type": "uint256" + "type": "uint8" } ], "stateMutability": "view", @@ -32371,7 +38710,7 @@ }, { "inputs": [], - "name": "rewardRate", + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -32383,14 +38722,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "rewards", + "inputs": [], + "name": "MIN_RATIO", "outputs": [ { "internalType": "uint256", @@ -32403,11 +38736,11 @@ }, { "inputs": [], - "name": "rewardsDuration", + "name": "TCAPPrice", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "price", "type": "uint256" } ], @@ -32416,10 +38749,10 @@ }, { "inputs": [], - "name": "rewardsToken", + "name": "TCAPToken", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "contract TCAP", "name": "", "type": "address" } @@ -32431,68 +38764,57 @@ "inputs": [ { "internalType": "uint256", - "name": "_rewardsDuration", + "name": "_amount", "type": "uint256" } ], - "name": "setRewardsDuration", + "name": "addCollateral", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "_staker", - "type": "address" - }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "stake", + "name": "burn", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "totalSupply", + "name": "burnFee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + } + ], + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "collateralContract", + "outputs": [ { - "internalType": "address", + "internalType": "contract IERC20", "name": "", "type": "address" } ], - "name": "userRewardPerTokenPaid", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", "outputs": [ { "internalType": "uint256", @@ -32505,10 +38827,10 @@ }, { "inputs": [], - "name": "vault", + "name": "collateralPriceOracle", "outputs": [ { - "internalType": "address", + "internalType": "contract ChainlinkOracle", "name": "", "type": "address" } @@ -32517,492 +38839,437 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_staker", - "type": "address" - }, + "inputs": [], + "name": "counter", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "_value", "type": "uint256" } ], - "name": "withdraw", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "WETHVaultHandler": { - "address": "0x093f8F7C7fCC6edf991309A5056feB5cA9579292", - "abi": [ + }, { - "inputs": [ - { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_divisor", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - }, + "inputs": [], + "name": "divisor", + "outputs": [ { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" - }, - { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardHandler", - "type": "address" - }, - { - "internalType": "address", - "name": "_treasury", - "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "getFee", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "fee", "type": "uint256" } ], - "name": "CollateralAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", + "internalType": "contract ChainlinkOracle", + "name": "_oracle", "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, + } + ], + "name": "getOraclePrice", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "price", "type": "uint256" } ], - "name": "CollateralRemoved", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "NewBurnFee", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "index", "type": "uint256" } ], - "name": "NewLiquidationPenalty", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "getRoleMember", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" } ], - "name": "NewRatio", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "_tresury", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "NewTreasury", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "", "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" } ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "_token", - "type": "address" - }, + "name": "getVaultRatio", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "currentRatio", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "RoleAdminChanged", - "type": "event" + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, "internalType": "address", "name": "account", "type": "address" - }, + } + ], + "name": "hasRole", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "RoleGranted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "RoleRevoked", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "rewardCollateral", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumTCAP", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "TokensBurned", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "TokensMinted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "", "type": "uint256" } ], - "name": "VaultCreated", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, - { - "indexed": true, "internalType": "address", - "name": "_liquidator", + "name": "_tokenAddress", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "_liquidationCollateral", + "name": "_tokenAmount", "type": "uint256" - }, + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_reward", + "name": "_amount", "type": "uint256" } ], - "name": "VaultLiquidated", - "type": "event" + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "bytes32", - "name": "", + "name": "role", "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "ETHPriceOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_FEE", + "name": "requiredCollateral", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "collateral", "type": "uint256" } ], @@ -33010,25 +39277,18 @@ "type": "function" }, { - "inputs": [], - "name": "MIN_RATIO", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_vaultId", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TCAPPrice", + "name": "requiredLiquidationTCAP", "outputs": [ { "internalType": "uint256", - "name": "price", + "name": "amount", "type": "uint256" } ], @@ -33036,155 +39296,166 @@ "type": "function" }, { - "inputs": [], - "name": "TCAPToken", - "outputs": [ + "inputs": [ { - "internalType": "contract TCAP", - "name": "", + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", "type": "address" } ], - "stateMutability": "view", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "_burnFee", "type": "uint256" } ], - "name": "addCollateral", + "name": "setBurnFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "addCollateralETH", + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "_minimumTCAP", "type": "uint256" } ], - "name": "burn", + "name": "setMinimumTCAP", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "burnFee", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" } ], - "stateMutability": "view", + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "collateralContract", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20", - "name": "", + "internalType": "address", + "name": "_treasury", "type": "address" } ], - "stateMutability": "view", + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "collateralPriceOracle", + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "counter", + "name": "tcapOracle", "outputs": [ { - "internalType": "uint256", - "name": "_value", - "type": "uint256" + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "createVault", + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "divisor", + "name": "treasury", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "getFee", - "outputs": [ - { - "internalType": "uint256", - "name": "fee", - "type": "uint256" - } - ], - "stateMutability": "view", + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "internalType": "address", + "name": "", "type": "address" } ], - "name": "getOraclePrice", + "name": "userToVault", "outputs": [ { "internalType": "uint256", - "name": "price", + "name": "", "type": "uint256" } ], @@ -33194,112 +39465,115 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "getRoleAdmin", + "name": "vaults", "outputs": [ { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" }, { "internalType": "uint256", - "name": "index", + "name": "Debt", "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ + }, { "internalType": "address", - "name": "", + "name": "Owner", "type": "address" } ], "stateMutability": "view", "type": "function" + } + ] + }, + "USDC": { + "address": "0x360294ded58EA73A10e04b97A069052Bb2d88a1E", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "value", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Approval", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_id", - "type": "uint256" - } - ], - "name": "getVault", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "to", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "value", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Transfer", + "type": "event" }, { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" } ], - "name": "getVaultRatio", + "name": "allowance", "outputs": [ { "internalType": "uint256", - "name": "currentRatio", + "name": "", "type": "uint256" } ], @@ -33308,41 +39582,42 @@ }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "grantRole", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", "name": "account", "type": "address" } ], - "name": "hasRole", + "name": "balanceOf", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", @@ -33351,29 +39626,29 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "_account", + "type": "address" }, { "internalType": "uint256", - "name": "_maxTCAP", + "name": "_amount", "type": "uint256" } ], - "name": "liquidateVault", + "name": "burn", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "liquidationPenalty", + "name": "decimals", "outputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "", - "type": "uint256" + "type": "uint8" } ], "stateMutability": "view", @@ -33381,57 +39656,78 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "_vaultId", + "name": "subtractedValue", "type": "uint256" } ], - "name": "liquidationReward", + "name": "decreaseAllowance", "outputs": [ { - "internalType": "uint256", - "name": "rewardCollateral", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "_amount", + "name": "addedValue", "type": "uint256" } ], - "name": "mint", - "outputs": [], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "oracleDigits", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "name", "outputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", @@ -33439,19 +39735,12 @@ }, { "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "symbol", "outputs": [ { - "internalType": "bool", + "internalType": "string", "name": "", - "type": "bool" + "type": "string" } ], "stateMutability": "view", @@ -33459,7 +39748,7 @@ }, { "inputs": [], - "name": "ratio", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -33474,217 +39763,237 @@ "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "recipient", "type": "address" }, { "internalType": "uint256", - "name": "_tokenAmount", - "type": "uint256" - } - ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], - "name": "removeCollateral", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "transfer", + "outputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "removeCollateralETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "sender", + "type": "address" }, { "internalType": "address", - "name": "account", + "name": "recipient", "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + }, { "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], - "name": "requiredCollateral", + "name": "transferFrom", "outputs": [ { - "internalType": "uint256", - "name": "collateral", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "requiredLiquidationTCAP", - "outputs": [ + } + ] + }, + "USDCOracle": { + "address": "0x1b793DBc38B94E5C81ee383934404f84a7acE01E", + "abi": [ + { + "inputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { "inputs": [], - "name": "rewardHandler", + "name": "getLatestAnswer", "outputs": [ { - "internalType": "contract IRewardHandler", + "internalType": "int256", "name": "", - "type": "address" + "type": "int256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", - "name": "_burnFee", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "setRatio", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "_treasury", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "setTreasury", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "supportsInterface", + "name": "getRound", "outputs": [ { - "internalType": "bool", + "internalType": "uint80", "name": "", - "type": "bool" + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "tcapOracle", + "name": "owner", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "address", "name": "", "type": "address" } @@ -33693,34 +40002,21 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "treasury", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "_aggregator", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", + "name": "setReferenceContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -33728,64 +40024,39 @@ { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" } ], - "name": "userToVault", + "name": "supportsInterface", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "vaults", - "outputs": [ - { - "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Debt", - "type": "uint256" - }, { "internalType": "address", - "name": "Owner", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" } ] - }, - "HardWETHVaultHandler": { - "address": "0x5Da610f142f6762AB7f64aa305c39563a1cF336e", + }, + "HardUSDCVaultHandler": { + "address": "0xB34756f8D9682ab6C26F77f9461207a65c52c8bC", "abi": [ { "inputs": [ @@ -33843,6 +40114,11 @@ "internalType": "address", "name": "_treasury", "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" } ], "stateMutability": "nonpayable", @@ -34336,13 +40612,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "addCollateralETH", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, { "inputs": [ { @@ -34802,19 +41071,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "removeCollateralETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "name": "renounceOwnership", @@ -35078,10 +41334,6 @@ ], "stateMutability": "view", "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" } ] } diff --git a/src/hooks/useHardVaults.tsx b/src/hooks/useHardVaults.tsx index 18156c3..b955d54 100644 --- a/src/hooks/useHardVaults.tsx +++ b/src/hooks/useHardVaults.tsx @@ -5,18 +5,43 @@ import { HardVaultsContext } from "../state/HardVaultsContext"; export const useHardVaults = (): HardVaultsContext => { const [wethVault, setWETHVault] = useState(); + const [daiVault, setDAIVault] = useState(); + const [usdcVault, setUSDCVault] = useState(); const [wethVaultRead, setWETHVaultRead] = useState(); + const [daiVaultRead, setDAIVaultRead] = useState(); + const [usdcVaultRead, setUSDCVaultRead] = useState(); + const setCurrentWETHVault = React.useCallback((currentWETHVault: ethers.Contract): void => { setWETHVault(currentWETHVault); }, []); + const setCurrentDAIVault = React.useCallback((currentDAIVault: ethers.Contract): void => { + setDAIVault(currentDAIVault); + }, []); + const setCurrentUSDCVault = React.useCallback((currentUSDCVault: ethers.Contract): void => { + setUSDCVault(currentUSDCVault); + }, []); const setCurrentWETHVaultRead = React.useCallback((currentWETHVaultRead: Contract): void => { setWETHVaultRead(currentWETHVaultRead); }, []); + const setCurrentDAIVaultRead = React.useCallback((currentDAIVaultRead: Contract): void => { + setDAIVaultRead(currentDAIVaultRead); + }, []); + const setCurrentUSDCVaultRead = React.useCallback((currentUSDCVaultRead: Contract): void => { + setUSDCVaultRead(currentUSDCVaultRead); + }, []); return { wethVault, setCurrentWETHVault, + daiVault, + setCurrentDAIVault, + usdcVault, + setCurrentUSDCVault, wethVaultRead, setCurrentWETHVaultRead, + daiVaultRead, + setCurrentDAIVaultRead, + usdcVaultRead, + setCurrentUSDCVaultRead, }; }; diff --git a/src/hooks/useOracles.tsx b/src/hooks/useOracles.tsx index 6241003..385eac6 100644 --- a/src/hooks/useOracles.tsx +++ b/src/hooks/useOracles.tsx @@ -13,6 +13,7 @@ export const useOracles = (): OraclesContext => { const [snxOracle, setSNXOracle] = useState(); const [uniOracle, setUNIOracle] = useState(); const [maticOracle, setMATICOracle] = useState(); + const [usdcOracle, setUSDCOracle] = useState(); const [wethOracleRead, setETHOracleRead] = useState(); const [daiOracleRead, setDAIOracleRead] = useState(); const [wbtcOracleRead, setWBTCOracleRead] = useState(); @@ -22,6 +23,7 @@ export const useOracles = (): OraclesContext => { const [snxOracleRead, setSNXOracleRead] = useState(); const [uniOracleRead, setUNIOracleRead] = useState(); const [maticOracleRead, setMATICOracleRead] = useState(); + const [usdcOracleRead, setUSDCOracleRead] = useState(); const setCurrentWETHOracle = React.useCallback((currentWETHOracle: ethers.Contract): void => { setETHOracle(currentWETHOracle); @@ -50,6 +52,9 @@ export const useOracles = (): OraclesContext => { const setCurrentMATICOracle = React.useCallback((currentMATICOracle: ethers.Contract): void => { setMATICOracle(currentMATICOracle); }, []); + const setCurrentUSDCOracle = React.useCallback((currentUSDCOracle: ethers.Contract): void => { + setUSDCOracle(currentUSDCOracle); + }, []); const setCurrentWETHOracleRead = React.useCallback((currentWETHOracleRead: Contract): void => { setETHOracleRead(currentWETHOracleRead); }, []); @@ -77,6 +82,9 @@ export const useOracles = (): OraclesContext => { const setCurrentMATICOracleRead = React.useCallback((currentMATICOracleRead: Contract): void => { setMATICOracleRead(currentMATICOracleRead); }, []); + const setCurrentUSDCOracleRead = React.useCallback((currentUSDCOracleRead: Contract): void => { + setUSDCOracleRead(currentUSDCOracleRead); + }, []); return { wethOracle, setCurrentWETHOracle, @@ -96,6 +104,8 @@ export const useOracles = (): OraclesContext => { setCurrentUNIOracle, maticOracle, setCurrentMATICOracle, + usdcOracle, + setCurrentUSDCOracle, wethOracleRead, setCurrentWETHOracleRead, daiOracleRead, @@ -114,5 +124,7 @@ export const useOracles = (): OraclesContext => { setCurrentUNIOracleRead, maticOracleRead, setCurrentMATICOracleRead, + usdcOracleRead, + setCurrentUSDCOracleRead, }; }; diff --git a/src/hooks/useTokens.tsx b/src/hooks/useTokens.tsx index e850e13..544b3fb 100644 --- a/src/hooks/useTokens.tsx +++ b/src/hooks/useTokens.tsx @@ -14,6 +14,7 @@ export const useTokens = (): TokensContext => { const [snxToken, setSNXToken] = useState(); const [uniToken, setUNIToken] = useState(); const [maticToken, setMATICToken] = useState(); + const [usdcToken, setUSDCToken] = useState(); const [wethPoolToken, setWETHPoolToken] = useState(); const [daiPoolToken, setDAIPoolToken] = useState(); const [wbtcPoolToken, setWBTCPoolToken] = useState(); @@ -28,6 +29,7 @@ export const useTokens = (): TokensContext => { const [snxTokenRead, setSNXTokenRead] = useState(); const [uniTokenRead, setUNITokenRead] = useState(); const [maticTokenRead, setMATICTokenRead] = useState(); + const [usdcTokenRead, setUSDCTokenRead] = useState(); const [wethPoolTokenRead, setWETHPoolTokenRead] = useState(); const [daiPoolTokenRead, setDAIPoolTokenRead] = useState(); const [wbtcPoolTokenRead, setWBTCPoolTokenRead] = useState(); @@ -63,6 +65,9 @@ export const useTokens = (): TokensContext => { const setCurrentMATICToken = React.useCallback((currentMATIC: ethers.Contract): void => { setMATICToken(currentMATIC); }, []); + const setCurrentUSDCToken = React.useCallback((currentUSDC: ethers.Contract): void => { + setUSDCToken(currentUSDC); + }, []); const setCurrentWETHPoolToken = React.useCallback( (currentWETHPoolToken: ethers.Contract): void => { setWETHPoolToken(currentWETHPoolToken); @@ -111,6 +116,9 @@ export const useTokens = (): TokensContext => { const setCurrentMATICTokenRead = React.useCallback((currentMATICRead: Contract): void => { setMATICTokenRead(currentMATICRead); }, []); + const setCurrentUSDCTokenRead = React.useCallback((currentUSDCRead: Contract): void => { + setUSDCTokenRead(currentUSDCRead); + }, []); const setCurrentWETHPoolTokenRead = React.useCallback( (currentWETHPoolTokenRead: Contract): void => { setWETHPoolTokenRead(currentWETHPoolTokenRead); @@ -157,6 +165,8 @@ export const useTokens = (): TokensContext => { setCurrentUNIToken, maticToken, setCurrentMATICToken, + usdcToken, + setCurrentUSDCToken, wethPoolToken, setCurrentWETHPoolToken, daiPoolToken, @@ -185,6 +195,8 @@ export const useTokens = (): TokensContext => { setCurrentUNITokenRead, maticTokenRead, setCurrentMATICTokenRead, + usdcTokenRead, + setCurrentUSDCTokenRead, wethPoolTokenRead, setCurrentWETHPoolTokenRead, daiPoolTokenRead, diff --git a/src/state/HardVaultsContext.tsx b/src/state/HardVaultsContext.tsx index a235b44..f5c4d4c 100644 --- a/src/state/HardVaultsContext.tsx +++ b/src/state/HardVaultsContext.tsx @@ -5,13 +5,25 @@ import { Contract } from "ethers-multicall"; export interface HardVaultsContext { wethVault?: ethers.Contract; setCurrentWETHVault: (currentVault: ethers.Contract) => void; + daiVault?: ethers.Contract; + setCurrentDAIVault: (currentVault: ethers.Contract) => void; + usdcVault?: ethers.Contract; + setCurrentUSDCVault: (currentVault: ethers.Contract) => void; wethVaultRead?: Contract; setCurrentWETHVaultRead: (currentVaultRead: Contract) => void; + daiVaultRead?: Contract; + setCurrentDAIVaultRead: (currentVaultRead: Contract) => void; + usdcVaultRead?: Contract; + setCurrentUSDCVaultRead: (currentVaultRead: Contract) => void; } export const HARD_VAULTS_DEFAULT_VALUE = { setCurrentWETHVault: () => {}, + setCurrentDAIVault: () => {}, + setCurrentUSDCVault: () => {}, setCurrentWETHVaultRead: () => {}, + setCurrentDAIVaultRead: () => {}, + setCurrentUSDCVaultRead: () => {}, }; const hardVaultsContext = React.createContext(HARD_VAULTS_DEFAULT_VALUE); diff --git a/src/state/OraclesContext.tsx b/src/state/OraclesContext.tsx index 80ec4ff..8d0cfb1 100644 --- a/src/state/OraclesContext.tsx +++ b/src/state/OraclesContext.tsx @@ -21,6 +21,8 @@ export interface OraclesContext { setCurrentUNIOracle: (currentOracle: ethers.Contract) => void; maticOracle?: ethers.Contract; setCurrentMATICOracle: (currentOracle: ethers.Contract) => void; + usdcOracle?: ethers.Contract; + setCurrentUSDCOracle: (currentOracle: ethers.Contract) => void; wethOracleRead?: Contract; setCurrentWETHOracleRead: (currentOracle: Contract) => void; daiOracleRead?: Contract; @@ -39,6 +41,8 @@ export interface OraclesContext { setCurrentUNIOracleRead: (currentOracle: Contract) => void; maticOracleRead?: Contract; setCurrentMATICOracleRead: (currentOracle: Contract) => void; + usdcOracleRead?: Contract; + setCurrentUSDCOracleRead: (currentOracle: Contract) => void; } export const ORACLES_DEFAULT_VALUE = { @@ -51,6 +55,7 @@ export const ORACLES_DEFAULT_VALUE = { setCurrentSNXOracle: () => {}, setCurrentUNIOracle: () => {}, setCurrentMATICOracle: () => {}, + setCurrentUSDCOracle: () => {}, setCurrentWETHOracleRead: () => {}, setCurrentDAIOracleRead: () => {}, setCurrentWBTCOracleRead: () => {}, @@ -60,6 +65,7 @@ export const ORACLES_DEFAULT_VALUE = { setCurrentSNXOracleRead: () => {}, setCurrentUNIOracleRead: () => {}, setCurrentMATICOracleRead: () => {}, + setCurrentUSDCOracleRead: () => {}, }; const oraclesContext = React.createContext(ORACLES_DEFAULT_VALUE); diff --git a/src/state/TokensContext.tsx b/src/state/TokensContext.tsx index 25fba5e..4d0e552 100644 --- a/src/state/TokensContext.tsx +++ b/src/state/TokensContext.tsx @@ -23,6 +23,8 @@ export interface TokensContext { setCurrentUNIToken: (currentUni: ethers.Contract) => void; maticToken?: ethers.Contract; setCurrentMATICToken: (currentMATIC: ethers.Contract) => void; + usdcToken?: ethers.Contract; + setCurrentUSDCToken: (currentUSDC: ethers.Contract) => void; wethPoolToken?: ethers.Contract; setCurrentWETHPoolToken: (currentPoolToken: ethers.Contract) => void; daiPoolToken?: ethers.Contract; @@ -51,6 +53,8 @@ export interface TokensContext { setCurrentUNITokenRead: (currentUni: Contract) => void; maticTokenRead?: Contract; setCurrentMATICTokenRead: (currentMATIC: Contract) => void; + usdcTokenRead?: Contract; + setCurrentUSDCTokenRead: (currentUSDC: Contract) => void; wethPoolTokenRead?: Contract; setCurrentWETHPoolTokenRead: (currentPoolTokenRead: Contract) => void; daiPoolTokenRead?: Contract; @@ -72,6 +76,7 @@ export const TOKENS_DEFAULT_VALUE = { setCurrentSNXToken: () => {}, setCurrentUNIToken: () => {}, setCurrentMATICToken: () => {}, + setCurrentUSDCToken: () => {}, setCurrentWETHPoolToken: () => {}, setCurrentDAIPoolToken: () => {}, setCurrentWBTCPoolToken: () => {}, @@ -86,6 +91,7 @@ export const TOKENS_DEFAULT_VALUE = { setCurrentSNXTokenRead: () => {}, setCurrentUNITokenRead: () => {}, setCurrentMATICTokenRead: () => {}, + setCurrentUSDCTokenRead: () => {}, setCurrentWETHPoolTokenRead: () => {}, setCurrentDAIPoolTokenRead: () => {}, setCurrentWBTCPoolTokenRead: () => {}, diff --git a/src/styles/vault.scss b/src/styles/vault.scss index 2b7de2d..30029d5 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -232,6 +232,10 @@ width: 1.3rem; filter: drop-shadow(0px 0px 5px $highlight); } + &.usdc.small { + margin-top: -5px; + width: 1.3rem; + } } } @@ -402,6 +406,10 @@ width: 1.5rem; margin-top: -3px; } + &.usdc { + margin-top: 5px; + width: 1.7rem; + } } } @@ -540,6 +548,10 @@ width: 1.5rem; filter: drop-shadow(0px 0px 5px $highlight); } + &.usdc.small { + margin-top: -5px; + width: 1.7rem; + } } } From daf38da8648c09974aada853b097ad161c6072d9 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sat, 23 Apr 2022 11:31:53 -0600 Subject: [PATCH 094/278] fixed some UI issues on liquidation and vaults --- public/index.html | 2 +- public/locales/en/translation.json | 5 +- src/App.tsx | 30 +++++ src/assets/images/graph/usdc.svg | 1 + src/components/Graph.tsx | 2 +- src/components/Vault/Details.tsx | 41 ++++-- src/components/Vault/Monitoring/Liquidate.tsx | 121 +++++++++++++++--- src/components/Vault/Monitoring/Vaults.tsx | 18 +-- src/components/Vault/Monitoring/common.tsx | 3 + src/components/Vault/Monitoring/index.tsx | 68 ++++++++-- src/components/Vault/Monitoring/types.tsx | 1 + src/styles/app.scss | 6 + src/styles/farm.scss | 7 + src/styles/modal.scss | 7 + src/utils/utils.tsx | 10 +- 15 files changed, 259 insertions(+), 63 deletions(-) create mode 100644 src/assets/images/graph/usdc.svg diff --git a/public/index.html b/public/index.html index f470b36..2096bfe 100644 --- a/public/index.html +++ b/public/index.html @@ -5,7 +5,7 @@ - + { currentSigner ); hardVaults.setCurrentWETHVault(currentHardWETHVault); + const currentWBTCVault = new ethers.Contract( + contracts.WBTCVaultHandler.address, + contracts.WBTCVaultHandler.abi, + currentSigner + ); + vaults.setCurrentWBTCVault(currentWBTCVault); const currentHardDAIVault = new ethers.Contract( contracts.HardDaiVaultHandler.address, contracts.HardDaiVaultHandler.abi, @@ -178,6 +184,11 @@ const App = () => { toFragment(contracts.HardWETHVaultHandler.abi) ); hardVaults.setCurrentWETHVaultRead(currentHardWETHVaultRead); + const currentWBTCVaultRead = new Contract( + contracts.WBTCVaultHandler.address, + contracts.WBTCVaultHandler.abi + ); + vaults.setCurrentWBTCVaultRead(currentWBTCVaultRead); const currentHardDAIVaultRead = new Contract( contracts.HardDaiVaultHandler.address, toFragment(contracts.HardDaiVaultHandler.abi) @@ -196,6 +207,12 @@ const App = () => { currentSigner ); tokens.setCurrentAAVEToken(currentAAVEToken); + const currentWBTCToken = new ethers.Contract( + contracts.WBTC.address, + contracts.WBTC.abi, + currentSigner + ); + tokens.setCurrentWBTCToken(currentWBTCToken); const currentUSDCToken = new ethers.Contract( contracts.USDC.address, contracts.USDC.abi, @@ -205,6 +222,8 @@ const App = () => { const currentAAVETokenRead = new Contract(contracts.AAVE.address, contracts.AAVE.abi); tokens.setCurrentAAVETokenRead(currentAAVETokenRead); + const currentWBTCTokenRead = new Contract(contracts.WBTC.address, ERC20.abi); + tokens.setCurrentWBTCTokenRead(currentWBTCTokenRead); const currentUSDCTokenRead = new Contract(contracts.USDC.address, contracts.USDC.abi); tokens.setCurrentUSDCTokenRead(currentUSDCTokenRead); @@ -277,6 +296,12 @@ const App = () => { currentSigner ); oracles.setCurrentAAVEOracle(currentAAVEOracle); + const currentWBTCOracle = new ethers.Contract( + contracts.WBTCOracle.address, + contracts.WBTCOracle.abi, + currentSigner + ); + oracles.setCurrentWBTCOracle(currentWBTCOracle); const currentUSDCOracle = new ethers.Contract( contracts.USDCOracle.address, contracts.USDCOracle.abi, @@ -288,6 +313,11 @@ const App = () => { contracts.AaveOracle.abi ); oracles.setCurrentAAVEOracleRead(currentAAVEOracleRead); + const currentWBTCOracleRead = new Contract( + contracts.WBTCOracle.address, + contracts.WBTCOracle.abi + ); + oracles.setCurrentWBTCOracleRead(currentWBTCOracleRead); const currentUSDCOracleRead = new Contract( contracts.USDCOracle.address, contracts.USDCOracle.abi diff --git a/src/assets/images/graph/usdc.svg b/src/assets/images/graph/usdc.svg new file mode 100644 index 0000000..fc365b3 --- /dev/null +++ b/src/assets/images/graph/usdc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/Graph.tsx b/src/components/Graph.tsx index 6b12a20..f4f0719 100644 --- a/src/components/Graph.tsx +++ b/src/components/Graph.tsx @@ -19,7 +19,7 @@ import { ReactComponent as AAVEIcon } from "../assets/images/graph/aave.svg"; import { ReactComponent as LINKIcon } from "../assets/images/graph/chainlink.svg"; import { ReactComponent as UNIIcon } from "../assets/images/graph/uni.svg"; import { ReactComponent as SNXIcon } from "../assets/images/graph/snx.svg"; -import { ReactComponent as WBTCIcon } from "../assets/images/graph/wbtc.svg"; +import { ReactComponent as WBTCIcon } from "../assets/images/graph/usdc.svg"; import { ReactComponent as CtxIcon } from "../assets/images/ctx-coin.svg"; import cryptexJson from "../contracts/cryptex.json"; import { diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index b661f93..37f9f03 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -389,7 +389,7 @@ const Details = ({ address, t }: props) => { let currentVaultData: any; // Removed GRAPH // if data is empty load vault data from contract - const graphBlock = vaultData._meta.block.number; + /* const graphBlock = vaultData._meta.block.number; let currentBlock = await provider.getBlockNumber(); currentBlock -= 10; if ( @@ -413,6 +413,15 @@ const Details = ({ address, t }: props) => { debt: vault.Debt, }; } + } */ + const vaultID = await currentVault.userToVault(address); + if (!vaultID.eq(0)) { + const vault = await currentVault.vaults(vaultID); + currentVaultData = { + vaultId: vaultID, + collateral: vault.Collateral, + debt: vault.Debt, + }; } if (vaultType !== "ETH") { @@ -459,14 +468,23 @@ const Details = ({ address, t }: props) => { setSelectedVaultId(vaultId); if (!allowance.isZero() || vaultType === "ETH") { + const safeValue = isHardMode() ? 20 : 50; + const warnValue = isHardMode() ? 10 : 30; + setMinRatio(currentMinRatio.toString()); setIsApproved(true); setVaultRatio(currentRatio.toString()); if (currentRatio.toString() === "0") { setVaultStatus("N/A"); - } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + 50) { + } else if ( + currentRatio.toString() >= + parseFloat(currentMinRatio.toString()) + safeValue + ) { setVaultStatus("safe"); - } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + 30) { + } else if ( + currentRatio.toString() >= + parseFloat(currentMinRatio.toString()) + warnValue + ) { setVaultStatus("warning"); } else { setVaultStatus("danger"); @@ -580,7 +598,10 @@ const Details = ({ address, t }: props) => { }; const changeVault = async (newRatio: number, reset = false) => { + const safeValue = isHardMode() ? 20 : 50; + const warnValue = isHardMode() ? 10 : 30; let r = newRatio; + if (reset) { r = parseFloat(tempRatio); setVaultRatio(tempRatio); @@ -596,9 +617,9 @@ const Details = ({ address, t }: props) => { if (r === 0) { setVaultStatus(t("vault.status.na")); - } else if (r >= parseFloat(minRatio) + 50) { + } else if (r >= parseFloat(minRatio) + safeValue) { setVaultStatus(t("vault.status.safe")); - } else if (r >= parseFloat(minRatio) + 30) { + } else if (r >= parseFloat(minRatio) + warnValue) { setVaultStatus(t("vault.status.warning")); } else if (r >= parseFloat(minRatio)) { setVaultStatus(t("vault.status.danger")); @@ -807,7 +828,8 @@ const Details = ({ address, t }: props) => { vaultCollateral, currentPrice, currentTcapPrice, - vaultDebt + vaultDebt, + isHardMode() ); if (selectedVaultDecimals === 8) { collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; @@ -825,10 +847,6 @@ const Details = ({ address, t }: props) => { }; const mintTCAP = async () => { - /* tokens.daiToken?.mint( - "0xF6a16a48099497C59e8abEAa37Bb37B2F9B793d4", - BigNumber.from("100000000000") - ); */ if (mintTxt) { setBtnDisabled(true); try { @@ -860,7 +878,8 @@ const Details = ({ address, t }: props) => { vaultCollateral, currentPrice, currentTcapPrice, - vaultDebt + vaultDebt, + isHardMode() ); setMintTxt(safeMint.toString()); let usd = toUSD(currentTcapPrice, safeMint.toString()); diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index ceb2715..7be7d4a 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -5,12 +5,16 @@ import { ethers, BigNumber } from "ethers"; import InputGroup from "react-bootstrap/esm/InputGroup"; import Modal from "react-bootstrap/esm/Modal"; import NumberFormat from "react-number-format"; +import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; +import Tooltip from "react-bootstrap/esm/Tooltip"; import "../../../styles/modal.scss"; import NetworkContext from "../../../state/NetworkContext"; import SignerContext from "../../../state/SignerContext"; import OracleContext from "../../../state/OraclesContext"; import TokensContext from "../../../state/TokensContext"; import VaultContext from "../../../state/VaultsContext"; +import HardVaultsContext from "../../../state/HardVaultsContext"; +import { VaultsType } from "./types"; import { errorNotification, isPolygon, @@ -22,17 +26,17 @@ import { type props = { show: boolean; currentAddress: string; - vaultId: string; - vaultType: string; + liqVault: VaultsType | null; onHide: () => void; refresh: () => void; }; -const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh }: props) => { +const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) => { const currentNetwork = useContext(NetworkContext); const signer = useContext(SignerContext); const oracles = useContext(OracleContext); const vaults = useContext(VaultContext); + const hardVaults = useContext(HardVaultsContext); const tokens = useContext(TokensContext); const [currentVault, setCurrentVault] = useState(); const [tcapBalance, setTcapBalance] = useState("0"); @@ -48,14 +52,23 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } useEffect(() => { async function load() { - if (currentAddress !== "" && vaults) { + if (currentAddress !== "" && liqVault !== null && vaults) { let cVault = vaults.wethVault; let cVaultRead = vaults.wethVaultRead; let oracleRead = oracles.wethOracleRead; - switch (vaultType) { + if (liqVault.isHardVault) { + cVault = hardVaults.wethVault; + cVaultRead = hardVaults.wethVaultRead; + } + switch (liqVault.collateralSymbol) { case "DAI": - cVault = vaults.daiVault; - cVaultRead = vaults.daiVaultRead; + if (liqVault.isHardVault) { + cVault = hardVaults.daiVault; + cVaultRead = hardVaults.daiVaultRead; + } else { + cVault = vaults.daiVault; + cVaultRead = vaults.daiVaultRead; + } oracleRead = oracles.daiOracleRead; break; case "AAVE": @@ -88,18 +101,30 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } cVaultRead = vaults.wbtcVaultRead; oracleRead = oracles.wbtcOracleRead; break; + case "USDC": + cVault = hardVaults.usdcVault; + cVaultRead = hardVaults.usdcVaultRead; + oracleRead = oracles.usdcOracleRead; + break; default: - cVault = vaults.wethVault; - cVaultRead = vaults.wethVaultRead; + if (liqVault.isHardVault) { + cVault = hardVaults.wethVault; + cVaultRead = hardVaults.wethVaultRead; + } else { + cVault = vaults.wethVault; + cVaultRead = vaults.wethVaultRead; + } oracleRead = oracles.wethOracleRead; break; } - if (vaultId !== "" && cVault && cVaultRead) { + if (liqVault.id !== "" && cVault && cVaultRead) { setCurrentVault(cVault); const tcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(currentAddress); const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); - const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); + const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP( + BigNumber.from(liqVault.id) + ); + const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(liqVault.id)); const oraclePriceCall = await oracleRead?.getLatestAnswer(); const ethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); @@ -116,7 +141,7 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } const tcapBalanceText = ethers.utils.formatEther(balance); const tcapPriceText = ethers.utils.formatEther(tcapOraclePrice); const reqTcapText = ethers.utils.formatEther(reqTcap); - const liqRewardText = ethers.utils.formatEther(liqReward); + const liqRewardText = ethers.utils.formatUnits(liqReward, liqVault.decimals); const priceText = ethers.utils.formatEther(collateralPrice.mul(10000000000)); const ethPriceText = ethers.utils.formatEther(ethPrice.mul(10000000000)); const currentLiqFee = await cVault?.getFee(reqTcap); @@ -126,6 +151,8 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } setTcapBalance(tcapBalanceText); setTcapPrice(tcapPriceText); setRequiredTcap(reqTcapText); + setMaxTcap(reqTcapText); + setMaxTcapUSD(toUSD(reqTcapText, tcapPriceText).toFixed(2)); setReward(liqRewardText); setRewardUSD(toUSD(liqRewardText, priceText).toFixed(2)); setBurnFee(ethFee); @@ -135,7 +162,7 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } } load(); // eslint-disable-next-line - }, [currentAddress, vaultId]); + }, [currentAddress, liqVault]); const onChangeMaxTcap = (event: React.ChangeEvent) => { setMaxTcap(event.target.value); @@ -150,7 +177,7 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } const liquidate = async (event: React.MouseEvent) => { event.preventDefault(); - if (currentAddress && canLiquidate && currentVault) { + if (currentAddress && liqVault !== null && canLiquidate && currentVault) { setCanLiquidate(false); const maxAmountTcap = parseFloat(maxTcap); if (maxTcap && maxAmountTcap > 0) { @@ -164,7 +191,7 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } const ethFee = ethers.utils.formatEther(increasedFee); setBurnFee(ethFee); const tx = await currentVault.liquidateVault( - BigNumber.from(vaultId), + BigNumber.from(liqVault.id), ethers.utils.parseEther(maxTcap), { value: increasedFee } ); @@ -190,6 +217,49 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } const netReward = parseFloat(rewardUSD) - parseFloat(maxTcapUSD) - parseFloat(burnFeeUsd); + const getTokeSymbol = () => { + if (liqVault !== null) { + if (liqVault.collateralSymbol === "WETH") { + return "ETH"; + } + return liqVault.collateralSymbol; + } + return ""; + }; + + const rewardHelp = () => ( + + Collateral amount in USD you are getting for liquidating the vault. + + ); + + const tcapAmountHelp = () => ( + + Amount of TCAP in USD you need to provide to liquidate vault. + + ); + + const netRewardHelp = () => ( + + Actual profit in USD you earn after liquidation:
+ Net Reward = Reward - TCAP Amount - Burn Fee. +
+ ); + + const helpToolTip = (column: number) => { + let help = rewardHelp(); + if (column === 1) { + help = tcapAmountHelp(); + } else if (column === 3) { + help = netRewardHelp(); + } + return ( + + + + ); + }; + return ( Amount of TCAP - MIN REQUIRED + MAX REWARD @@ -246,7 +316,7 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } thousandSeparator decimalScale={4} />{" "} - {vaultType === "WETH" ? "ETH" : vaultType} + {getTokeSymbol()}
@@ -268,10 +338,19 @@ const Liquidate = ({ show, currentAddress, vaultId, vaultType, onHide, refresh } - - + + - + diff --git a/src/components/Vault/Monitoring/Vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx index e3516ef..bcbd9d8 100644 --- a/src/components/Vault/Monitoring/Vaults.tsx +++ b/src/components/Vault/Monitoring/Vaults.tsx @@ -44,8 +44,7 @@ export const Vaults = ({ }: dataType) => { const [showLiquidate, setShowLiquidate] = useState(false); const [vaultIndex, setVaultIndex] = useState(-1); - const [vaultId, setVaultId] = useState(""); - const [vaultType, setVaultType] = useState(""); + const [liqVault, setLiqVault] = useState(null); const [collateralSort, setCollateralSort] = useState(0); const [collateralUsdSort, setCollateralUsdSort] = useState(0); const [debtSort, setDebtSort] = useState(0); @@ -61,10 +60,9 @@ export const Vaults = ({ // eslint-disable-next-line }, [loadingLiq]); */ - const liquidateVault = (index: number, id: string, type: string) => { - setVaultId(id); + const liquidateVault = (index: number, lVault: VaultsType) => { setVaultIndex(index); - setVaultType(type); + setLiqVault(lVault); setShowLiquidate(true); }; @@ -157,7 +155,7 @@ export const Vaults = ({ } if (v.status === "liquidation") { return ( - ); @@ -320,15 +318,13 @@ export const Vaults = ({ { - setVaultId(""); - setVaultType(""); + setLiqVault(null); setVaultIndex(-1); setShowLiquidate(false); }} - refresh={() => refresh(vaultIndex, vaultType)} + refresh={() => refresh(vaultIndex, liqVault !== null ? liqVault.collateralSymbol : "ETH")} /> ); diff --git a/src/components/Vault/Monitoring/common.tsx b/src/components/Vault/Monitoring/common.tsx index 673d3fc..8f1ec76 100644 --- a/src/components/Vault/Monitoring/common.tsx +++ b/src/components/Vault/Monitoring/common.tsx @@ -8,6 +8,7 @@ import { ReactComponent as UNIIcon } from "../../../assets/images/graph/uni.svg" import { ReactComponent as SNXIcon } from "../../../assets/images/graph/snx.svg"; import { ReactComponent as MATICIcon } from "../../../assets/images/graph/polygon.svg"; import { ReactComponent as WBTCIcon } from "../../../assets/images/graph/wbtc.svg"; +import { ReactComponent as USDCIcon } from "../../../assets/images/graph/usdc.svg"; type iconProps = { name: string; @@ -42,6 +43,8 @@ export const CollateralIcon = ({ name }: iconProps) => { return ; case "wbtc": return ; + case "usdc": + return ; default: return <>; } diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 04da3ba..b44c9cc 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -59,6 +59,8 @@ const totalsDefault = { type liqVaultsTempType = { vaultId: string; vaultType: string; + decimals: number; + hardVault: boolean; }; const showAllVaults = true; @@ -153,6 +155,11 @@ export const Monitoring = () => { "tokenSymbol " + "hardVault " + "blockTS " + + "underlyingProtocol { " + + "underlyingToken { " + + "decimals " + + "} " + + "}" + "} " + "}"; @@ -437,15 +444,29 @@ export const Monitoring = () => { } }; - const calculateNetRewardUsd = async (vaultId: string, vaultType: string) => { + const calculateNetRewardUsd = async ( + vaultId: string, + vaultType: string, + isHardVault: boolean, + decimals: number + ) => { let cVault = vaults.wethVault; let cVaultRead = vaults.wethVaultRead; let vaultPrice = oraclePrices?.wethOraclePrice; + if (isHardVault) { + cVault = hardVaults.wethVault; + cVaultRead = hardVaults.wethVaultRead; + } switch (vaultType) { case "DAI": - cVault = vaults.daiVault; - cVaultRead = vaults.daiVaultRead; + if (isHardVault) { + cVault = hardVaults.daiVault; + cVaultRead = hardVaults.daiVaultRead; + } else { + cVault = vaults.daiVault; + cVaultRead = vaults.daiVaultRead; + } vaultPrice = oraclePrices?.daiOraclePrice; break; case "AAVE": @@ -478,9 +499,19 @@ export const Monitoring = () => { cVaultRead = vaults.wbtcVaultRead; vaultPrice = oraclePrices?.wbtcOraclePrice; break; + case "USDC": + cVault = hardVaults.usdcVault; + cVaultRead = hardVaults.usdcVaultRead; + vaultPrice = oraclePrices?.usdcOraclePrice; + break; default: - cVault = vaults.wethVault; - cVaultRead = vaults.wethVaultRead; + if (isHardVault) { + cVault = hardVaults.wethVault; + cVaultRead = hardVaults.wethVaultRead; + } else { + cVault = vaults.wethVault; + cVaultRead = vaults.wethVaultRead; + } vaultPrice = oraclePrices?.wethOraclePrice; break; } @@ -491,7 +522,7 @@ export const Monitoring = () => { const [reqTcap, liqReward] = await signer.ethcallProvider?.all([reqTcapCall, liqRewardCall]); const reqTcapText = ethers.utils.formatEther(reqTcap); - const liqRewardText = ethers.utils.formatEther(liqReward); + const liqRewardText = ethers.utils.formatUnits(liqReward, decimals); const currentLiqFee = await cVault?.getFee(reqTcap); const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); @@ -507,14 +538,16 @@ export const Monitoring = () => { collateralWei: ethers.BigNumberish, debtWei: ethers.BigNumberish, symbol: string, - isHardVault: boolean + isHardVault: boolean, + decimals: number ) => { - const collateralText = ethers.utils.formatEther(collateralWei); + const collateralText = ethers.utils.formatUnits(collateralWei, decimals); const debtText = ethers.utils.formatEther(debtWei); const collateralPrice = getCollateralPrice(symbol); const collateralUSD = toUSD(collateralText, collateralPrice); const debtUSD = toUSD(debtText, oraclePrices?.tcapOraclePrice || "0"); const minRatio = getMinRatio(symbol, isHardVault); + const ratio = getRatio2( collateralText, collateralPrice, @@ -543,8 +576,9 @@ export const Monitoring = () => { // setLiqLoaded(currentStatus !== VAULT_STATUS.liquidation); // @ts-ignore vaultsData.vaults.forEach((v) => { + const cVaultDecimals = v.underlyingProtocol.underlyingToken.decimals; const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = - calculateVaultData(v.collateral, v.debt, v.tokenSymbol, v.hardVault); + calculateVaultData(v.collateral, v.debt, v.tokenSymbol, v.hardVault, cVaultDecimals); let addVault = true; if (currentStatus === VAULT_STATUS.active || currentStatus === VAULT_STATUS.liquidation) { @@ -553,7 +587,7 @@ export const Monitoring = () => { if (!showAllVaults) { addVault = v.tokenSymbol === "WETH" || v.tokenSymbol === "DAI"; } - if (addVault && v.tokenSymbol !== "WBTC" && v.tokenSymbol !== "USDC") { + if (addVault && v.tokenSymbol !== "WBTC") { let vaultUrl = ""; const symbol = v.tokenSymbol === "WETH" ? "ETH" : v.tokenSymbol; if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { @@ -563,6 +597,8 @@ export const Monitoring = () => { vLiquidables.push({ vaultId: v.vaultId, vaultType: v.tokenSymbol, + decimals: cVaultDecimals, + hardVault: v.hardVault, }); } @@ -575,6 +611,7 @@ export const Monitoring = () => { debtUsd: debtUSD.toFixed(2), ratio, minRatio: minRatio.toString(), + decimals: cVaultDecimals, isHardVault: v.hardVault, netReward: 0, status, @@ -595,7 +632,7 @@ export const Monitoring = () => { } else { const loadNetReward = async () => { vLiquidables.forEach((l, index) => { - calculateNetRewardUsd(l.vaultId, l.vaultType).then((result) => { + calculateNetRewardUsd(l.vaultId, l.vaultType, l.hardVault, l.decimals).then((result) => { const newA = [...vData]; newA[index].netReward = result; setVaultList(newA); @@ -741,7 +778,13 @@ export const Monitoring = () => { BigNumber.from(vaultList[index].id) ); const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = - calculateVaultData(collateral, debt, symbol, vaultList[index].isHardVault); + calculateVaultData( + collateral, + debt, + symbol, + vaultList[index].isHardVault, + vaultList[index].decimals + ); const allVaults = vaultList; const v = { id: vaultId, @@ -752,6 +795,7 @@ export const Monitoring = () => { debtUsd: debtUSD.toFixed(2), ratio, minRatio: minRatio.toString(), + decimals: vaultList[index].decimals, isHardVault: vaultList[index].isHardVault, netReward: 0, status, diff --git a/src/components/Vault/Monitoring/types.tsx b/src/components/Vault/Monitoring/types.tsx index 81fe304..e7d55b0 100644 --- a/src/components/Vault/Monitoring/types.tsx +++ b/src/components/Vault/Monitoring/types.tsx @@ -46,6 +46,7 @@ export type VaultsType = { debtUsd: string; ratio: number; minRatio: string; + decimals: number; isHardVault: boolean; netReward: number; status: string; diff --git a/src/styles/app.scss b/src/styles/app.scss index d96cfb1..5aa9518 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -444,6 +444,12 @@ form { } } +.card { + &-header { + background-color: transparent; + } +} + @media (max-width: 600px) { .wrapper { padding-left: 0rem; diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 881575c..14c132b 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -392,9 +392,16 @@ } .ranges { display: flex; + width: 82%; flex-direction: row; align-items: center; justify-content: space-between; + @media (max-width: 1500px) { + width: 90%; + } + @media (max-width: 1400px) { + width: 100%; + } .min-range { font-size: 1rem; } diff --git a/src/styles/modal.scss b/src/styles/modal.scss index ea7dce6..c8572fd 100644 --- a/src/styles/modal.scss +++ b/src/styles/modal.scss @@ -185,6 +185,9 @@ } .liquidate-input { + .form-control { + z-index: 1; + } .text-muted { position: absolute; width: 100%; @@ -196,6 +199,10 @@ } table.liq-info { margin-top: 3rem !important; + .btn-dark { + padding-top: 5px; + padding-left: 10px; + } th { text-align: right; border-bottom: 1px; diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index f82fc71..cdf152d 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -163,9 +163,10 @@ export const getSafeMint = async ( collateral: string, collateralPrice: string, tcapPrice: string, - debt: string + debt: string, + isHardMode: boolean ) => { - const r = parseFloat(ratio) + 50; + const r = parseFloat(ratio) + (isHardMode ? 20 : 50); const c = parseFloat(collateral); const cp = parseFloat(collateralPrice); const tp = parseFloat(tcapPrice); @@ -185,9 +186,10 @@ export const getSafeRemoveCollateral = async ( collateral: string, collateralPrice: string, tcapPrice: string, - debt: string + debt: string, + isHardMode: boolean ) => { - const r = parseFloat(ratio) + 50; + const r = parseFloat(ratio) + (isHardMode ? 20 : 50); const c = parseFloat(collateral); const cp = parseFloat(collateralPrice); const tp = parseFloat(tcapPrice); From 243d756ecc7c93a8a52042db8c2a2770e77557e2 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 25 Apr 2022 14:31:37 -0600 Subject: [PATCH 095/278] Added titles to sidebar --- src/components/Farm/UniV3Rewards/Rewards.tsx | 5 +- src/components/Sidebar.tsx | 150 +++++++------------ src/components/Welcome/Welcome.tsx | 11 -- src/styles/app.scss | 1 + src/styles/sidebar.scss | 21 ++- src/utils/utils.tsx | 17 ++- 6 files changed, 87 insertions(+), 118 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index ed9718e..768156d 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -64,6 +64,7 @@ const Rewards = ({ const [cumulativePrice, setCumulativePrice] = useState(0); const [availableReward, setAvailableReward] = useState(0); const [showClaim, setShowClaim] = useState(false); + const [firstLoad, setFirstLoad] = useState(true); const OWNER_POSITIONS = gql` query ownerPools($owner: String!) { @@ -172,6 +173,7 @@ const Rewards = ({ const { loading, data, error, refetch } = useQuery(OWNER_POSITIONS, { fetchPolicy: "no-cache", + pollInterval: 60000, notifyOnNetworkStatusChange: true, variables: { owner: ownerAddress.toLowerCase() }, onError: () => { @@ -180,6 +182,7 @@ const Rewards = ({ onCompleted: () => { if (signer.signer && ownerAddress !== "") { loadData(data); + setFirstLoad(false); } }, }); @@ -446,7 +449,7 @@ const Rewards = ({ {ownerAddress !== "" ? ( <> - {loading ? ( + {loading && firstLoad ? ( ) : ( <>{ethTcapPositions.length === 0 ? RenderEmptyLP() : RenderRewards()} diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 72634fd..127535c 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -68,48 +68,28 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { diff --git a/src/components/Welcome/Welcome.tsx b/src/components/Welcome/Welcome.tsx index e94b78e..4e5808e 100644 --- a/src/components/Welcome/Welcome.tsx +++ b/src/components/Welcome/Welcome.tsx @@ -44,17 +44,6 @@ const Welcome = ({ signerAddress, loadingContracts }: props) => { const tokens = useContext(TokensContext); const oracles = useContext(OraclesContext); - /* - const TCAP_PRICE = gql` - query { - oracles(first: 1, orderBy: updatedAt, orderDirection: desc) { - answer - } - } - `; - - const { data } = useQuery(TCAP_PRICE); - */ useEffect(() => { const loadAddress = async () => { if (oracles.tcapOracleRead) { diff --git a/src/styles/app.scss b/src/styles/app.scss index 5aa9518..a54af3e 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -257,6 +257,7 @@ html, height: 100%; } + .farm-tooltip > .tooltip-inner { max-width: 300px; width: 300px; diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index e6ac24e..a649cd0 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -1,7 +1,7 @@ @import "./colors"; .sidebar { - width: 5rem; + width: 5.3rem; height: 100%; background-color: $darker; border-right: solid 2px $dark; @@ -25,6 +25,13 @@ margin-right: auto; display: block; } + + a { + display: flex; + flex-direction: column; + align-items: center; + color: $light; + } a svg { &:hover { @@ -42,6 +49,18 @@ -webkit-filter: drop-shadow(3px 3px 2px $highlight); filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); } + .title { + font-size: 0.75rem; + margin-top: 2px; + } + .title.active { + -webkit-filter: drop-shadow(3px 3px 2px $highlight); + filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); + } + .title:hover { + -webkit-filter: drop-shadow(3px 3px 2px $highlight); + filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); + } } &.mobile { diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index cdf152d..cb8f48e 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -391,14 +391,17 @@ export const numberFormatStr = ( minDecimals: number | undefined, maxDecimals: number | undefined ) => { - const numberFormat = new Intl.NumberFormat([], { - minimumFractionDigits: minDecimals, - maximumFractionDigits: maxDecimals, - }); - if (minDecimals) { - return numberFormat.format(parseFloat(parseFloat(value).toFixed(maxDecimals))); + if (parseFloat(value) < 103849213185522) { + const numberFormat = new Intl.NumberFormat([], { + minimumFractionDigits: minDecimals, + maximumFractionDigits: maxDecimals, + }); + if (minDecimals) { + return numberFormat.format(parseFloat(parseFloat(value).toFixed(maxDecimals))); + } + return numberFormat.format(parseFloat(value)); } - return numberFormat.format(parseFloat(value)); + return Number.parseFloat(value).toExponential(minDecimals); }; // token0 = TCAP, and token1 = WETH From fe739b8efbeb08cfe0c2016fdcf0de23af4202cf Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 26 Apr 2022 21:36:05 -0600 Subject: [PATCH 096/278] vault monitoring fixes --- public/locales/de/translation.json | 6 +- public/locales/en/translation.json | 6 +- public/locales/es/translation.json | 6 +- public/locales/fr/translation.json | 6 +- public/locales/hi_IN/translation.json | 6 +- public/locales/it/translation.json | 6 +- public/locales/pt/translation.json | 6 +- public/locales/tr/translation.json | 6 +- public/locales/zh/translation.json | 6 +- src/components/Farm/UniV3Rewards/Rewards.tsx | 22 ++- src/components/Farm/UniV3Rewards/types.tsx | 2 +- src/components/Vault/Details.tsx | 109 +++++++---- src/components/Vault/Monitoring/Liquidate.tsx | 84 +++++---- src/components/Vault/Monitoring/Vaults.tsx | 6 +- src/components/Vault/Monitoring/index.tsx | 175 ++++++++++-------- src/styles/app.scss | 7 +- src/styles/farm.scss | 32 ++-- src/styles/toast.scss | 3 + src/styles/vault-monitoring.scss | 17 ++ src/styles/vault.scss | 9 + 20 files changed, 330 insertions(+), 190 deletions(-) diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index cc2eb63..48512b7 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -61,6 +61,8 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", "add": "Add Collateral", @@ -81,7 +83,9 @@ }, "errors": { "no-collateral": "Not enough collateral on vault", - "burn-too-high": "Burn value too high" + "burn-too-high": "Burn value too high", + "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", + "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, "pools": { diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index a207783..5c354b9 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -61,6 +61,8 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", "add": "Add Collateral", @@ -82,7 +84,9 @@ "errors": { "no-collateral": "Not enough collateral on vault", "burn-too-high": "Burn value too high", - "burn-balance-low": "Burn value is greater than your balance." + "burn-balance-low": "Burn value is greater than your balance.", + "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", + "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, "pools": { diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index ba2d78c..e094887 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -56,6 +56,8 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", "add": "Add Collateral", @@ -76,7 +78,9 @@ }, "errors": { "no-collateral": "Not enough collateral on vault", - "burn-too-high": "Burn value too high" + "burn-too-high": "Burn value too high", + "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", + "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, "pools": { diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index e08f63f..a7ca2a8 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -59,6 +59,8 @@ "balance-title": "{{vault}} Solde", "ratio-title": "Proportion de collatéral", "ratio-warning": "Le ratio de collatéral doit être > {{minRatio}}% ou votre collatéral sera liquidé.", + "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Collatéral Bloqué", "add": "Ajouter du Collatéral", @@ -79,7 +81,9 @@ }, "errors": { "no-collateral": "Pas assez de collatéral dans le Coffre-fort", - "burn-too-high": "La valeur à bruler est trop élevée" + "burn-too-high": "La valeur à bruler est trop élevée", + "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", + "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, "pools": { diff --git a/public/locales/hi_IN/translation.json b/public/locales/hi_IN/translation.json index cc2eb63..48512b7 100644 --- a/public/locales/hi_IN/translation.json +++ b/public/locales/hi_IN/translation.json @@ -61,6 +61,8 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", "add": "Add Collateral", @@ -81,7 +83,9 @@ }, "errors": { "no-collateral": "Not enough collateral on vault", - "burn-too-high": "Burn value too high" + "burn-too-high": "Burn value too high", + "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", + "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, "pools": { diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index 03d8cdf..186d583 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -61,6 +61,8 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", "add": "Add Collateral", @@ -81,7 +83,9 @@ }, "errors": { "no-collateral": "Not enough collateral on vault", - "burn-too-high": "Burn value too high" + "burn-too-high": "Burn value too high", + "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", + "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, "pools": { diff --git a/public/locales/pt/translation.json b/public/locales/pt/translation.json index cc2eb63..48512b7 100644 --- a/public/locales/pt/translation.json +++ b/public/locales/pt/translation.json @@ -61,6 +61,8 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", "add": "Add Collateral", @@ -81,7 +83,9 @@ }, "errors": { "no-collateral": "Not enough collateral on vault", - "burn-too-high": "Burn value too high" + "burn-too-high": "Burn value too high", + "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", + "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, "pools": { diff --git a/public/locales/tr/translation.json b/public/locales/tr/translation.json index cc2eb63..48512b7 100644 --- a/public/locales/tr/translation.json +++ b/public/locales/tr/translation.json @@ -61,6 +61,8 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", + "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", "add": "Add Collateral", @@ -81,7 +83,9 @@ }, "errors": { "no-collateral": "Not enough collateral on vault", - "burn-too-high": "Burn value too high" + "burn-too-high": "Burn value too high", + "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", + "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, "pools": { diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json index 4e64c59..d0fa779 100644 --- a/public/locales/zh/translation.json +++ b/public/locales/zh/translation.json @@ -61,6 +61,8 @@ "balance-title": "{{vault}} 余额", "ratio-title": "保险库比率", "ratio-warning": "比率必须大于 {{minRatio}}% 以避免被清算。", + "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "抵押担保品", "add": "添加抵押品", @@ -82,7 +84,9 @@ "errors": { "no-collateral": "保险库没有足够的抵押品", "burn-too-high": "销毁值太高", - "burn-balance-low": "Burn value is greater than your balance." + "burn-balance-low": "Burn value is greater than your balance.", + "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", + "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, "pools": { diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 768156d..5676e40 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -266,6 +266,18 @@ const Rewards = ({ const RenderRewards = () => ( <>
+
+
Fee tier:
+ +
Available to Claim:
@@ -279,9 +291,9 @@ const Rewards = ({ />
-
-
- +
+ +
RewardRequired TCAP + Reward + {helpToolTip(0)} + + Required TCAP + {helpToolTip(1)} + Burn FeeNet Reward + Net Reward + {helpToolTip(3)} +
${numberFormatStr(rewardUSD, 2, 2)}
@@ -317,8 +329,8 @@ const Rewards = ({ Pending: LP token needs to be approved in order to be staked.
- Empty: LP token hasn't been staked or - deposited.
+ Unstaked: LP token hasn't been staked + or deposited.
Deposited: LP token needs to be stake to earn rewards.
Staked: LP token is staked and earning diff --git a/src/components/Farm/UniV3Rewards/types.tsx b/src/components/Farm/UniV3Rewards/types.tsx index d778dc9..26e7472 100644 --- a/src/components/Farm/UniV3Rewards/types.tsx +++ b/src/components/Farm/UniV3Rewards/types.tsx @@ -1,6 +1,6 @@ export const StakeStatus = { not_approved: "not_approved", - empty: "empty", + empty: "unstaked", deposited: "deposited", staked: "staked", out_range: "out_range", diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx index 37f9f03..abc9a09 100644 --- a/src/components/Vault/Details.tsx +++ b/src/components/Vault/Details.tsx @@ -630,6 +630,20 @@ const Details = ({ address, t }: props) => { }; // forms + const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { + if (isHardMode()) { + const d = parseFloat(vaultDebt); + let newDebt = 0; + if (isMint) { + newDebt = amount + d; + } else { + newDebt = d - amount; + } + return newDebt >= 20 || newDebt === 0; + } + return true; + }; + const onChangeAddCollateral = async (event: React.ChangeEvent) => { setAddCollateralTxt(event.target.value); if (event.target.value !== "") { @@ -848,22 +862,26 @@ const Details = ({ address, t }: props) => { const mintTCAP = async () => { if (mintTxt) { - setBtnDisabled(true); - try { - const amount = ethers.utils.parseEther(mintTxt); - const tx = await selectedVaultContract?.mint(amount); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.no-collateral")); + if (isMinRequiredTcap(parseFloat(mintTxt), true)) { + setBtnDisabled(true); + try { + const amount = ethers.utils.parseEther(mintTxt); + const tx = await selectedVaultContract?.mint(amount); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.no-collateral")); + } } + setBtnDisabled(false); + setMintTxt(""); + setMintUSD("0"); + } else { + errorNotification(t("vault.errors.min-tcap")); } - setBtnDisabled(false); - setMintTxt(""); - setMintUSD("0"); } else { errorNotification(t("errors.empty")); } @@ -894,34 +912,31 @@ const Details = ({ address, t }: props) => { const burnTCAP = async () => { if (burnTxt) { - const amount = ethers.utils.parseEther(burnTxt); - // const currentBalanceCall = await tokens.tcapTokenRead?.balanceOf(address); - // @ts-ignore - // const [currentBalance] = await signer.ethcallProvider?.all([currentBalanceCall]); - // if (amount.lt(currentBalance)) { - setBtnDisabled(true); - try { - const currentBurnFee = await selectedVaultContract?.getFee(amount); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - const tx = await selectedVaultContract?.burn(amount, { value: increasedFee }); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.burn-too-high")); + if (isMinRequiredTcap(parseFloat(burnTxt), false)) { + const amount = ethers.utils.parseEther(burnTxt); + setBtnDisabled(true); + try { + const currentBurnFee = await selectedVaultContract?.getFee(amount); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + const tx = await selectedVaultContract?.burn(amount, { value: increasedFee }); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.burn-too-high")); + } } + setBtnDisabled(false); + setBurnTxt(""); + setBurnUSD("0"); + setBurnFee("0"); + } else { + errorNotification(t("vault.errors.min-tcap2")); } - setBtnDisabled(false); - setBurnTxt(""); - setBurnUSD("0"); - setBurnFee("0"); - /* } else { - errorNotification(t("vault.errors.burn-balance-low")); - } */ } else { errorNotification(t("errors.empty")); } @@ -1187,6 +1202,20 @@ const Details = ({ address, t }: props) => { ))} + {isHardMode() && ( + + {t("vault.hard-mode-info")}
+ {t("vault.hard-mode-info2")} +
+ } + > + + + )} {loadingMode ? (
diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index 7be7d4a..d69aee0 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -118,45 +118,51 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = break; } if (liqVault.id !== "" && cVault && cVaultRead) { - setCurrentVault(cVault); - const tcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(currentAddress); - const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP( - BigNumber.from(liqVault.id) - ); - const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(liqVault.id)); - const oraclePriceCall = await oracleRead?.getLatestAnswer(); - const ethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + try { + setCurrentVault(cVault); + const tcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(currentAddress); + const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP( + BigNumber.from(liqVault.id) + ); + const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(liqVault.id)); + const oraclePriceCall = await oracleRead?.getLatestAnswer(); + const ethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + // @ts-ignore + const [balance, tcapOraclePrice, reqTcap, liqReward, collateralPrice, ethPrice] = + await signer.ethcallProvider?.all([ + tcapBalanceCall, + tcapPriceCall, + reqTcapCall, + liqRewardCall, + oraclePriceCall, + ethOraclePriceCall, + ]); + const tcapBalanceText = ethers.utils.formatEther(balance); + const tcapPriceText = ethers.utils.formatEther(tcapOraclePrice); + const reqTcapText = ethers.utils.formatEther(reqTcap); + const liqRewardText = ethers.utils.formatUnits(liqReward, liqVault.decimals); + const priceText = ethers.utils.formatEther(collateralPrice.mul(10000000000)); + const ethPriceText = ethers.utils.formatEther(ethPrice.mul(10000000000)); + const currentLiqFee = await cVault?.getFee(reqTcap); + const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); - // @ts-ignore - const [balance, tcapOraclePrice, reqTcap, liqReward, collateralPrice, ethPrice] = - await signer.ethcallProvider?.all([ - tcapBalanceCall, - tcapPriceCall, - reqTcapCall, - liqRewardCall, - oraclePriceCall, - ethOraclePriceCall, - ]); - const tcapBalanceText = ethers.utils.formatEther(balance); - const tcapPriceText = ethers.utils.formatEther(tcapOraclePrice); - const reqTcapText = ethers.utils.formatEther(reqTcap); - const liqRewardText = ethers.utils.formatUnits(liqReward, liqVault.decimals); - const priceText = ethers.utils.formatEther(collateralPrice.mul(10000000000)); - const ethPriceText = ethers.utils.formatEther(ethPrice.mul(10000000000)); - const currentLiqFee = await cVault?.getFee(reqTcap); - const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - - setTcapBalance(tcapBalanceText); - setTcapPrice(tcapPriceText); - setRequiredTcap(reqTcapText); - setMaxTcap(reqTcapText); - setMaxTcapUSD(toUSD(reqTcapText, tcapPriceText).toFixed(2)); - setReward(liqRewardText); - setRewardUSD(toUSD(liqRewardText, priceText).toFixed(2)); - setBurnFee(ethFee); - setBurnFeeUsd(toUSD(ethFee, ethPriceText).toFixed(2)); + setTcapBalance(tcapBalanceText); + setTcapPrice(tcapPriceText); + setRequiredTcap(reqTcapText); + setMaxTcap(reqTcapText); + setMaxTcapUSD(toUSD(reqTcapText, tcapPriceText).toFixed(2)); + setReward(liqRewardText); + setRewardUSD(toUSD(liqRewardText, priceText).toFixed(2)); + setBurnFee(ethFee); + setBurnFeeUsd(toUSD(ethFee, ethPriceText).toFixed(2)); + } catch (error) { + // Error happens when trying to calculate reward on a not liquidable vault + if (error.code !== "UNPREDICTABLE_GAS_LIMIT") { + console.log(error.code); + } + } } } } @@ -196,7 +202,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = { value: increasedFee } ); notifyUser(tx, refresh); - refresh(); + await refresh(); setMaxTcap(""); onHide(); } catch (error) { diff --git a/src/components/Vault/Monitoring/Vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx index bcbd9d8..708d3c1 100644 --- a/src/components/Vault/Monitoring/Vaults.tsx +++ b/src/components/Vault/Monitoring/Vaults.tsx @@ -3,6 +3,7 @@ import Button from "react-bootstrap/esm/Button"; import Table from "react-bootstrap/Table"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; +import { FaGopuram } from "react-icons/fa"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; import { ReactComponent as SortIcon } from "../../../assets/images/sort.svg"; import { ReactComponent as SortUpIcon } from "../../../assets/images/sort-up.svg"; @@ -239,7 +240,10 @@ export const Vaults = ({ return (
- {" "} - - {ethTcapPositions.map((position, index) => { + {ethTcapPositions.sort(sortPositions).map((position, index) => { console.log(""); return ( From 6cc0223f2fee5704beb80c56b0152a86eeedf150 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 27 Apr 2022 10:31:28 -0600 Subject: [PATCH 100/278] fixing stats on optimism --- src/App.tsx | 6 +++--- src/components/Graph.tsx | 1 - src/components/Sidebar.tsx | 13 +------------ 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index d001fb1..d9b2f19 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -17,7 +17,7 @@ import Sidebar from "./components/Sidebar"; import Topbar from "./components/Topbar"; import WelcomeWrapper from "./components/Welcome/index"; import Graph from "./components/Graph"; -import { Vault, Monitoring } from "./components/Vault"; +import { Vault } from "./components/Vault"; import Pool from "./components/Pool"; import Delegators from "./components/Governance/Delegators"; import Loading from "./components/Loading"; @@ -735,9 +735,9 @@ const App = () => { - + {/* - + */} diff --git a/src/components/Graph.tsx b/src/components/Graph.tsx index 9842c46..bd5e0db 100644 --- a/src/components/Graph.tsx +++ b/src/components/Graph.tsx @@ -81,7 +81,6 @@ const Graph = () => { data && signer && !isUndefined(tokens.tcapTokenRead) && - !isUndefined(tokens.ctxPoolTokenRead) && validOracles(currentNetwork.chainId || 1, oracles) ) { const currentTotalPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index a88656e..a2580ff 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -9,7 +9,7 @@ import { ReactComponent as Logo } from "../assets/images/favicon.svg"; import { ReactComponent as MenuLogo } from "../assets/images/menu.svg"; import { ReactComponent as DashboardIcon } from "../assets/images/welcome/dashboard.svg"; import { ReactComponent as VaultIcon } from "../assets/images/welcome/vault.svg"; -import { ReactComponent as VaultMonitoringIcon } from "../assets/images/welcome/vault-monitoring.svg"; +// import { ReactComponent as VaultMonitoringIcon } from "../assets/images/welcome/vault-monitoring.svg"; import { ReactComponent as PoolsIcon } from "../assets/images/welcome/pool.svg"; import { ReactComponent as LogoutIcon } from "../assets/images/welcome/logout.svg"; import { ReactComponent as GraphIcon } from "../assets/images/welcome/graph.svg"; @@ -112,17 +112,6 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { )} - - { - setActive("vault-monitoring"); - }} - > - - - {isInLayer1(currentNetwork.chainId) && ( {active === "pools" ? ( From e71894294f35f7e8bad9605f9468726987c4ea83 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 28 Apr 2022 14:29:19 -0600 Subject: [PATCH 101/278] fixing vaults UI --- public/locales/de/translation.json | 2 +- public/locales/en/translation.json | 2 +- public/locales/es/translation.json | 2 +- public/locales/fr/translation.json | 2 +- public/locales/hi_IN/translation.json | 2 +- public/locales/it/translation.json | 2 +- public/locales/pt/translation.json | 2 +- public/locales/tr/translation.json | 2 +- public/locales/zh/translation.json | 2 +- src/components/Farm/index.tsx | 2 +- src/components/Governance/StakerStats.tsx | 2 +- src/components/Vault/Monitoring/Vaults.tsx | 3 +- src/components/Vault/Monitoring/index.tsx | 50 +++++++++++++++++++++- src/styles/app.scss | 4 +- src/styles/header.scss | 6 +++ src/styles/sidebar.scss | 13 +++--- src/styles/vault-monitoring.scss | 42 ++++++++++++++---- 17 files changed, 108 insertions(+), 32 deletions(-) diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 48512b7..033fbff 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -61,7 +61,7 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", - "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info": "Hard mode vaults have a minimum required ratio of 110%.", "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 5c354b9..dc00cae 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -61,7 +61,7 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", - "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info": "Hard mode vaults have a minimum required ratio of 110%.", "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index e094887..5995843 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -56,7 +56,7 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", - "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info": "Hard mode vaults have a minimum required ratio of 110%.", "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index a7ca2a8..3d47776 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -59,7 +59,7 @@ "balance-title": "{{vault}} Solde", "ratio-title": "Proportion de collatéral", "ratio-warning": "Le ratio de collatéral doit être > {{minRatio}}% ou votre collatéral sera liquidé.", - "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info": "Hard mode vaults have a minimum required ratio of 110%.", "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Collatéral Bloqué", diff --git a/public/locales/hi_IN/translation.json b/public/locales/hi_IN/translation.json index 48512b7..033fbff 100644 --- a/public/locales/hi_IN/translation.json +++ b/public/locales/hi_IN/translation.json @@ -61,7 +61,7 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", - "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info": "Hard mode vaults have a minimum required ratio of 110%.", "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index 186d583..b6678ea 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -61,7 +61,7 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", - "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info": "Hard mode vaults have a minimum required ratio of 110%.", "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", diff --git a/public/locales/pt/translation.json b/public/locales/pt/translation.json index 48512b7..033fbff 100644 --- a/public/locales/pt/translation.json +++ b/public/locales/pt/translation.json @@ -61,7 +61,7 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", - "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info": "Hard mode vaults have a minimum required ratio of 110%.", "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", diff --git a/public/locales/tr/translation.json b/public/locales/tr/translation.json index 48512b7..033fbff 100644 --- a/public/locales/tr/translation.json +++ b/public/locales/tr/translation.json @@ -61,7 +61,7 @@ "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", - "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info": "Hard mode vaults have a minimum required ratio of 110%.", "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json index d0fa779..88409c1 100644 --- a/public/locales/zh/translation.json +++ b/public/locales/zh/translation.json @@ -61,7 +61,7 @@ "balance-title": "{{vault}} 余额", "ratio-title": "保险库比率", "ratio-warning": "比率必须大于 {{minRatio}}% 以避免被清算。", - "hard-mode-info": "Hard mode vaults have a min required ratio of 110%.", + "hard-mode-info": "Hard mode vaults have a minimum required ratio of 110%.", "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "抵押担保品", diff --git a/src/components/Farm/index.tsx b/src/components/Farm/index.tsx index d974525..0df3f25 100644 --- a/src/components/Farm/index.tsx +++ b/src/components/Farm/index.tsx @@ -497,7 +497,7 @@ const Farm = () => { {" "} - + diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 4591c74..e0d1597 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -107,7 +107,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro {t("last")} {t("staked")} - + diff --git a/src/components/Vault/Monitoring/Vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx index 708d3c1..2b32884 100644 --- a/src/components/Vault/Monitoring/Vaults.tsx +++ b/src/components/Vault/Monitoring/Vaults.tsx @@ -3,7 +3,6 @@ import Button from "react-bootstrap/esm/Button"; import Table from "react-bootstrap/Table"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; -import { FaGopuram } from "react-icons/fa"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; import { ReactComponent as SortIcon } from "../../../assets/images/sort.svg"; import { ReactComponent as SortUpIcon } from "../../../assets/images/sort-up.svg"; @@ -242,7 +241,7 @@ export const Vaults = ({ +
Vaults
{vaultsTotals.vaults} @@ -881,7 +900,10 @@ export const Monitoring = () => {
Collateral:
- handleTokenChange(eventKey || "ALL")}> + handleTokenChange(eventKey || "ALL")} + > {
+
+
Mode:
+ handleModeChange(eventKey || "ALL")} + > + +
+ {capitalize(vaultMode)} +
+
+ + {modeList.map((item) => ( + + {item.name} + + ))} + +
+
{currentAddress !== "" && (
diff --git a/src/styles/app.scss b/src/styles/app.scss index 404d9cc..e6ac0ef 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -288,8 +288,8 @@ html, padding: 0.9rem; } .ttip-hard-vault > .tooltip-inner { - max-width: 350px; - width: 350px; + max-width: 390px; + width: 390px; text-align: left; } diff --git a/src/styles/header.scss b/src/styles/header.scss index 0cacdda..b572292 100644 --- a/src/styles/header.scss +++ b/src/styles/header.scss @@ -163,6 +163,12 @@ justify-content: center; margin-top: 50px; + .address { + font-size: 1rem; + } + .neon-pink { + font-size: 1rem; + } .network-container { .dropdown { width: 85%; diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index a649cd0..f8e2a45 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -32,9 +32,12 @@ align-items: center; color: $light; } - - a svg { - &:hover { + a:hover { + svg { + -webkit-filter: drop-shadow(3px 3px 2px $highlight); + filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); + } + .title { -webkit-filter: drop-shadow(3px 3px 2px $highlight); filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); } @@ -57,10 +60,6 @@ -webkit-filter: drop-shadow(3px 3px 2px $highlight); filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); } - .title:hover { - -webkit-filter: drop-shadow(3px 3px 2px $highlight); - filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); - } } &.mobile { diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 36c6873..d60980e 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -12,13 +12,11 @@ .card { padding: 1.5rem 2.8125rem; width: 100%; + @media (max-width: 1400px) { + padding: 1.5rem 2rem; + } .actions { display: flex; - .dd-container { - display: flex; - align-items: center; - margin-left: 1rem; - } .dropdown { padding-left: 0.5rem; .dropdown-toggle { @@ -51,7 +49,7 @@ border-bottom: 0; border-left: 0.4em solid transparent; margin-top: 7px; - margin-left: 65%; + margin-left: 65%; } .dropdown-menu { width: 85%; @@ -70,6 +68,28 @@ } } } + .dd { + &-container { + display: flex; + align-items: center; + margin-left: 1rem; + } + @media (max-width: 1450px) { + &-collateral, &-mode { + .dropdown-toggle { + width: 6.7rem; + } + .dropdown-toggle::after { + margin-left: 62%; + } + .dropdown-menu { + width: 7rem; + min-width: 7rem; + } + } + } + } + .btn-group { border: 1px solid #dfd1ea; border-radius: 5px; @@ -205,12 +225,18 @@ } .status { display: flex; - align-items: center; + flex-direction: column; + //align-items: center; font-family: "Nineteen Ninety Seven"; font-size: 15px; -webkit-animation: fire 2s infinite alternate; animation: fire 2s infinite alternate; color: #fff !important; + .mode { + font-size: 0.6rem; + text-shadow: none; + color: $off-white; + } svg { margin-left: 7px; &.empty { @@ -272,7 +298,7 @@ } } .card.totals { - .container { + .totals-container { display: flex; flex-direction: row; } From ddd169f5dd06e3f2df4b797dea82a33bb3357626 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 6 May 2022 18:49:17 -0600 Subject: [PATCH 102/278] unified summary and stats page --- public/locales/en/translation.json | 18 +- src/assets/images/graph/usdc.svg | 2 +- src/assets/images/noti-error.png | Bin 0 -> 207995 bytes src/assets/images/noti-success.png | Bin 0 -> 219315 bytes src/components/Sidebar.tsx | 18 +- src/components/Vault/Details.tsx | 2 +- src/components/Vault/Monitoring/index.tsx | 11 +- src/components/Vault/Monitoring/types.tsx | 1 + src/components/Welcome/Protocol.tsx | 496 ++++++++++++++++++++++ src/components/Welcome/Summary.tsx | 350 +++++++++++++++ src/components/Welcome/index.tsx | 4 +- src/styles/farm.scss | 19 +- src/styles/header.scss | 67 ++- src/styles/summary.scss | 365 ++++++++++++++++ src/styles/welcome.scss | 25 ++ src/utils/utils.tsx | 9 +- 16 files changed, 1342 insertions(+), 45 deletions(-) create mode 100644 src/assets/images/noti-error.png create mode 100644 src/assets/images/noti-success.png create mode 100644 src/components/Welcome/Protocol.tsx create mode 100644 src/components/Welcome/Summary.tsx create mode 100644 src/styles/summary.scss diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index dc00cae..3847d30 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -150,13 +150,17 @@ } }, "graph": { - "staked-usd": "Total Staked in USD", - "staked-eth": "Total Staked in ETH", - "staked-dai": "Total Staked in DAI", - "staked-aave": "Total Staked in AAVE", - "staked-link": "Total Staked in LINK", - "staked-matic": "Total Staked in MATIC", - "total-supply": "Total Supply", + "staked-usd": "Total Staked USD", + "staked-eth": "Staked in ETH", + "staked-dai": "Staked in DAI", + "staked-aave": "Staked in AAVE", + "staked-link": "Staked in LINK", + "staked-matic": "Staked in MATIC", + "staked-wbtc": "Staked in WBTC", + "staked-usdc": "Staked in USDC", + "staked-uni": "Staked in UNI", + "staked-snx": "Staked in SNX", + "total-supply": "TCAP Supply", "tcap-price": "TCAP Price", "ctx-price": "CTX Price" }, diff --git a/src/assets/images/graph/usdc.svg b/src/assets/images/graph/usdc.svg index fc365b3..6893f75 100644 --- a/src/assets/images/graph/usdc.svg +++ b/src/assets/images/graph/usdc.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/images/noti-error.png b/src/assets/images/noti-error.png new file mode 100644 index 0000000000000000000000000000000000000000..a66aab8cfe921bfd0ef1c1fc72d8db485ae99739 GIT binary patch literal 207995 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%0AclTz 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 z

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 UK@D}ST>t<807*qoM6N<$f-XHdLjV8( literal 0 HcmV?d00001 diff --git a/src/assets/images/noti-success.png b/src/assets/images/noti-success.png new file mode 100644 index 0000000000000000000000000000000000000000..e41d26b97437e701dc748fdd4081b82790e7a8dd GIT binary patch literal 219315 zcmd2?gL5TMw2tkK?~QF+8{6F2wzaWs`^NUhww)Vp>}>4p?%Ut1djG@gs;TLjsjfcr z&3C%L(`PzbMM)YJi4X|_0s>W5MnVk&0*3d$0|ENqovpdN-hU?;D^W#J2#BUce`Ue|0()1r14QX9YqcA$$P;7a}?wVisN8A|OCKUU-ffpvOgMj!jI* zh~xI}kr_^n8Fm#MA}Rt31|m8x$`=3(JQ5n_7eur#$S7!N_~g(qaIR1_glJMm5NY`2 zjCep276C~dJbZF0I%ZCObRwEqh&>E4MpA$d9i}Tb4L3R*zC3 U}_~h8h)&lO06< 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 { }} > - Vaults + Mint @@ -101,7 +101,7 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { > - Liquidate + Monitor @@ -131,18 +131,6 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { )} - - { - setActive("graph"); - }} - > - - Stats - - { const vaults = useContext(VaultsContext); const hardVaults = useContext(HardVaultsContext); const signer = useContext(SignerContext); - const [vaultMode, setVaultMode] = useState("normal"); + const [vaultMode, setVaultMode] = useState("hard"); const [loadingMode, setLoadingMode] = useState(false); const radios = [ { name: "Regular Mode", value: "normal" }, diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 8a5da9d..7549814 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -9,6 +9,7 @@ import ToggleButton from "react-bootstrap/esm/ToggleButton"; import Spinner from "react-bootstrap/Spinner"; import "../../../styles/vault-monitoring.scss"; import { useQuery, gql } from "@apollo/client"; +import { useLocation } from "react-router-dom"; import NetworkContext from "../../../state/NetworkContext"; import OraclesContext from "../../../state/OraclesContext"; import SignerContext from "../../../state/SignerContext"; @@ -43,6 +44,7 @@ const pagDefault = { current: 0, next: 0, pages: 0, + lastDataPage: 0, itemsPerPage: 10, itemsCount: 0, lastId: "0", @@ -71,6 +73,7 @@ export const Monitoring = () => { const vaults = useContext(vaultsContext); const hardVaults = useContext(hardVaultsContext); const signer = useContext(SignerContext); + const { state } = useLocation(); const [skipQuery, setSkipQuery] = useState(false); const [currentAddress, setCurrentAddress] = useState(""); const [oraclePrices, setOraclePrices] = useState(); @@ -80,8 +83,10 @@ export const Monitoring = () => { const [pagination, setPagination] = useState(pagDefault); const [loadMore, setLoadMore] = useState(false); const [pricesUpdated, setPricesUpdated] = useState(false); - const [ownerAddress, setOwnerAddress] = useState(""); - const [radioValue, setRadioValue] = useState("1"); + // @ts-ignore + const [ownerAddress, setOwnerAddress] = useState(state && state.address ? state.address : ""); + // @ts-ignore + const [radioValue, setRadioValue] = useState(state && state.address ? "2" : "1"); const [tokenSymbol, setTokenSymbol] = useState("all"); const [currentStatus, setCurrentStatus] = useState("all"); const [vaultMode, setVaultMode] = useState("all"); @@ -446,11 +451,13 @@ export const Monitoring = () => { const lastVaultId = vData[vData.length - 1].blockTS; const itemsCount = vData.length; const pages = Math.ceil(itemsCount / itemsPerPage); + const lastDataPage = Math.ceil(itemsCount / itemsPerPage); const pag = { previous: 0, current: 1, next: 2, pages, + lastDataPage, itemsPerPage, itemsCount, lastId: lastVaultId, diff --git a/src/components/Vault/Monitoring/types.tsx b/src/components/Vault/Monitoring/types.tsx index e7d55b0..e4883a8 100644 --- a/src/components/Vault/Monitoring/types.tsx +++ b/src/components/Vault/Monitoring/types.tsx @@ -3,6 +3,7 @@ export type PaginationType = { current: number; next: number; pages: number; + lastDataPage: number; itemsPerPage: number; itemsCount: number; lastId: string; diff --git a/src/components/Welcome/Protocol.tsx b/src/components/Welcome/Protocol.tsx new file mode 100644 index 0000000..311e453 --- /dev/null +++ b/src/components/Welcome/Protocol.tsx @@ -0,0 +1,496 @@ +import React, { useContext, useEffect, useState } from "react"; +import Card from "react-bootstrap/esm/Card"; +import { BigNumber, ethers } from "ethers"; +import { useTranslation } from "react-i18next"; +import NumberFormat from "react-number-format"; +import NetworkContext from "../../state/NetworkContext"; +import TokensContext from "../../state/TokensContext"; +import SignerContext from "../../state/SignerContext"; +import OraclesContext from "../../state/OraclesContext"; +import { ReactComponent as StakeIcon } from "../../assets/images/graph/stake.svg"; +import { ReactComponent as H24Icon } from "../../assets/images/graph/24h.svg"; +import { ReactComponent as WETHIcon } from "../../assets/images/graph/weth.svg"; +import { ReactComponent as DAIIcon } from "../../assets/images/graph/DAI.svg"; +import { ReactComponent as AAVEIcon } from "../../assets/images/graph/aave.svg"; +import { ReactComponent as LINKIcon } from "../../assets/images/graph/chainlink.svg"; +import { ReactComponent as UNIIcon } from "../../assets/images/graph/uni.svg"; +import { ReactComponent as SNXIcon } from "../../assets/images/graph/snx.svg"; +import { ReactComponent as POLYGONIcon } from "../../assets/images/graph/polygon3.svg"; +import { ReactComponent as WBTCIcon } from "../../assets/images/graph/wbtc.svg"; +import { ReactComponent as USDCIcon } from "../../assets/images/graph/usdc.svg"; +import cryptexJson from "../../contracts/cryptex.json"; +import Loading from "../Loading"; +import { + isInLayer1, + isOptimism, + isPolygon, + isUndefined, + toUSD, + validOracles, +} from "../../utils/utils"; +import { NETWORKS } from "../../utils/constants"; + +type props = { + data: any; +}; + +const Protocol = ({ data }: props) => { + const { t } = useTranslation(); + const currentNetwork = useContext(NetworkContext); + const tokens = useContext(TokensContext); + const signer = useContext(SignerContext); + const oracles = useContext(OraclesContext); + const [ethStake, setETHStake] = useState("0"); + const [daiStake, setDAIStake] = useState("0"); + const [maticStake, setMATICStake] = useState("0"); + const [aaveStake, setAaveStake] = useState("0"); + const [linkStake, setLinkStake] = useState("0"); + const [snxStake, setSNXStake] = useState("0"); + const [uniStake, setUNIStake] = useState("0"); + const [wbtcStake, setWBTCStake] = useState("0"); + const [usdcStake, setUSDCStake] = useState("0"); + const [TotalStake, setTotalStake] = useState("0"); + const [totalSupply, setTotalSupply] = useState("0.0"); + const [loading, setLoading] = useState(true); + + const getMaticUSD = async () => { + const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); + // @ts-ignore + const [maticOraclePrice] = await signer.ethcallProvider?.all([maticOraclePriceCall]); + const maticUSD = ethers.utils.formatEther(maticOraclePrice.mul(10000000000)); + return maticUSD; + }; + + useEffect(() => { + const load = async () => { + if ( + oracles && + tokens && + data && + signer && + !isUndefined(tokens.tcapTokenRead) && + !isUndefined(tokens.ctxPoolTokenRead) && + validOracles(currentNetwork.chainId || 1, oracles) + ) { + const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); + const currentTotalSupplyCall = await tokens.tcapTokenRead?.totalSupply(); + const ethcalls = [daiOraclePriceCall, currentTotalSupplyCall]; + + if (isInLayer1(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + ethcalls.push(aaveOraclePriceCall); + ethcalls.push(linkOraclePriceCall); + ethcalls.push(wbtcOraclePriceCall); + ethcalls.push(usdcOraclePriceCall); + } + if (isOptimism(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); + const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + ethcalls.push(linkOraclePriceCall); + ethcalls.push(snxOraclePriceCall); + ethcalls.push(uniOraclePriceCall); + } + if (isPolygon(currentNetwork.chainId)) { + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + ethcalls.push(wbtcOraclePriceCall); + } + let daiOraclePrice; + let currentTotalSupply; + let wethOraclePrice; + let aaveOraclePrice; + let linkOraclePrice; + let snxOraclePrice; + let uniOraclePrice; + let wbtcOraclePrice; + let usdcOraclePrice; + + if (isInLayer1(currentNetwork.chainId)) { + // @ts-ignore + [ + daiOraclePrice, + currentTotalSupply, + wethOraclePrice, + aaveOraclePrice, + linkOraclePrice, + wbtcOraclePrice, + usdcOraclePrice, + ] = await signer.ethcallProvider?.all(ethcalls); + } else if (isOptimism(currentNetwork.chainId)) { + // @ts-ignore + [ + daiOraclePrice, + currentTotalSupply, + wethOraclePrice, + linkOraclePrice, + snxOraclePrice, + uniOraclePrice, + ] = await signer.ethcallProvider?.all(ethcalls); + } else { + // @ts-ignore + [daiOraclePrice, currentTotalSupply, wbtcOraclePrice] = await signer.ethcallProvider?.all( + ethcalls + ); + } + + let currentDAIStake = BigNumber.from(0); + let currentWETHStake = BigNumber.from(0); + let currentAAVEStake = BigNumber.from(0); + let currentLINKStake = BigNumber.from(0); + let currentSNXStake = BigNumber.from(0); + let currentUNIStake = BigNumber.from(0); + let currentMATICStake = BigNumber.from(0); + let currentWBTCStake = BigNumber.from(0); + let currentUSDCStake = BigNumber.from(0); + + const networkId = currentNetwork.chainId; + // @ts-ignore + let contracts; + switch (networkId) { + case NETWORKS.mainnet.chainId: + contracts = cryptexJson[1].mainnet.contracts; + break; + case NETWORKS.rinkeby.chainId: + contracts = cryptexJson[4].rinkeby.contracts; + break; + case NETWORKS.optimism.chainId: + contracts = cryptexJson[10].optimism.contracts; + break; + case NETWORKS.okovan.chainId: + contracts = cryptexJson[69].okovan.contracts; + break; + case NETWORKS.polygon.chainId: + contracts = cryptexJson[137].polygon.contracts; + break; + case NETWORKS.mumbai.chainId: + contracts = cryptexJson[80001].mumbai.contracts; + break; + default: + contracts = cryptexJson[4].rinkeby.contracts; + break; + } + await data.states.forEach((s: any) => { + const cAddress = s.id.toLowerCase(); + // @ts-ignore + if (cAddress === contracts.DAIVaultHandler.address.toLowerCase()) { + currentDAIStake = currentDAIStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); + } + + if (isPolygon(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.MATICVaultHandler.address.toLowerCase()) { + currentMATICStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + } else if (isInLayer1(currentNetwork.chainId) || isPolygon(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.WBTCVaultHandler.address.toLowerCase()) { + currentWBTCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + } else { + // @ts-ignore + if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { + currentWETHStake = currentWETHStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); + } + // @ts-ignore + if (cAddress === contracts.LinkVaultHandler.address.toLowerCase()) { + currentLINKStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + } + + if (isInLayer1(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.AaveVaultHandler.address.toLowerCase()) { + currentAAVEStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + // @ts-ignore + if (cAddress === contracts.HardUSDCVaultHandler.address.toLowerCase()) { + currentUSDCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + // @ts-ignore + if (cAddress === contracts.HardWETHVaultHandler.address.toLowerCase()) { + currentWETHStake = currentWETHStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); + } + // @ts-ignore + if (cAddress === contracts.HardDaiVaultHandler.address.toLowerCase()) { + currentDAIStake = currentDAIStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); + } + } + if (isOptimism(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.SNXVaultHandler.address.toLowerCase()) { + currentSNXStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + // @ts-ignore + if (cAddress === contracts.UNIVaultHandler.address.toLowerCase()) { + currentUNIStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + } + }); + + const formatDAI = ethers.utils.formatEther(currentDAIStake); + setDAIStake(formatDAI); + const formatETH = ethers.utils.formatEther(currentWETHStake); + setETHStake(formatETH); + const formatAAVE = ethers.utils.formatEther(currentAAVEStake); + setAaveStake(formatAAVE); + const formatLINK = ethers.utils.formatEther(currentLINKStake); + setLinkStake(formatLINK); + const formatSNX = ethers.utils.formatEther(currentSNXStake); + setSNXStake(formatSNX); + const formatUNI = ethers.utils.formatEther(currentUNIStake); + setUNIStake(formatUNI); + const formatMATIC = ethers.utils.formatEther(currentMATICStake); + setMATICStake(formatMATIC); + const formatWBTC = ethers.utils.formatUnits(currentWBTCStake, 8); + setWBTCStake(formatWBTC); + const formatUSDC = ethers.utils.formatUnits(currentUSDCStake, 6); + setUSDCStake(formatUSDC); + + const daiUSD = ethers.utils.formatEther(daiOraclePrice.mul(10000000000)); + let ethUSD = "0"; + let aaveUSD = "0"; + let linkUSD = "0"; + let snxUSD = "0"; + let uniUSD = "0"; + let maticUSD = "0"; + let wbtcUSD = "0"; + let usdcUSD = "0"; + if (isInLayer1(currentNetwork.chainId)) { + ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + aaveUSD = ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)); + linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); + wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); + usdcUSD = ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)); + } + if (isOptimism(currentNetwork.chainId)) { + ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); + snxUSD = ethers.utils.formatEther(snxOraclePrice.mul(10000000000)); + uniUSD = ethers.utils.formatEther(uniOraclePrice.mul(10000000000)); + } + if (isPolygon(currentNetwork.chainId)) { + maticUSD = await getMaticUSD(); + wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); + } + + const totalUSD = + toUSD(ethUSD, formatETH) + + toUSD(daiUSD, formatDAI) + + toUSD(aaveUSD, formatAAVE) + + toUSD(linkUSD, formatLINK) + + toUSD(snxUSD, formatSNX) + + toUSD(uniUSD, formatUNI) + + toUSD(maticUSD, formatMATIC) + + toUSD(wbtcUSD, formatWBTC) + + toUSD(usdcUSD, formatUSDC); + setTotalStake(totalUSD.toString()); + setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); + } + setLoading(false); + }; + load(); + // eslint-disable-next-line + }, [data]); + + if (loading) { + return ; + } + + return ( + + +

Protocol Summary

+ + +
+
+ +
+
{t("graph.staked-usd")}
+
+ +
+
+
+
+ +
+
{t("graph.total-supply")}
+
+ +
+
+
+ {!isPolygon(currentNetwork.chainId) && ( +
+ +
+
{t("graph.staked-eth")}
+
+ +
+
+
+ )} +
+ +
+
{t("graph.staked-dai")}
+
+ +
+
+
+ {isInLayer1(currentNetwork.chainId) && ( +
+ +
+
{t("graph.staked-aave")}
+
+ +
+
+
+ )} + {!isPolygon(currentNetwork.chainId) && ( +
+ +
+
{t("graph.staked-link")}
+
+ +
+
+
+ )} + {isOptimism(currentNetwork.chainId) && ( + <> +
+ +
+

{t("graph.staked-uni")}

+
+ +
+
+
+
+ +
+

{t("graph.staked-snx")}

+
+ +
+
+
+ + )} + {isPolygon(currentNetwork.chainId) && ( +
+ +
+
{t("graph.staked-matic")}
+
+ +
+
+
+ )} + {!isOptimism(currentNetwork.chainId) && ( +
+ +
+
{t("graph.staked-wbtc")}
+
+ +
+
+
+ )} +
+ +
+
{t("graph.staked-usdc")}
+
+ +
+
+
+
+
+ + ); +}; + +export default Protocol; diff --git a/src/components/Welcome/Summary.tsx b/src/components/Welcome/Summary.tsx new file mode 100644 index 0000000..74cd0c0 --- /dev/null +++ b/src/components/Welcome/Summary.tsx @@ -0,0 +1,350 @@ +import React, { useContext, useEffect, useState } from "react"; +import Button from "react-bootstrap/esm/Button"; +import Card from "react-bootstrap/esm/Card"; +import Col from "react-bootstrap/esm/Col"; +import Row from "react-bootstrap/esm/Row"; +import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; +import Tooltip from "react-bootstrap/esm/Tooltip"; +import { useHistory } from "react-router-dom"; +import { useTranslation } from "react-i18next"; +import { ethers } from "ethers"; +import NumberFormat from "react-number-format"; +import { useQuery, gql } from "@apollo/client"; +import NetworkContext from "../../state/NetworkContext"; +import SignerContext from "../../state/SignerContext"; +import TokensContext from "../../state/TokensContext"; +import OraclesContext from "../../state/OraclesContext"; +import { Web3ModalContext } from "../../state/Web3ModalContext"; +import { makeShortAddress, getPriceInUSDFromPair, getENS, isInLayer1 } from "../../utils/utils"; +import { NETWORKS } from "../../utils/constants"; +import "../../styles/summary.scss"; +import Protocol from "./Protocol"; +import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; +import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; +import Loading from "../Loading"; + +type props = { + signerAddress: string; + loadingContracts: boolean; +}; + +const Summary = ({ signerAddress, loadingContracts }: props) => { + const { t } = useTranslation(); + const history = useHistory(); + const [address, setAddress] = useState(""); + const [currentAddress, setCurrentAddress] = useState(""); + const [tcapBalance, setTcapBalance] = useState("0.0"); + const [tcapUSDBalance, setTcapUSDBalance] = useState("0.0"); + const [totalPrice, setTotalPrice] = useState("0.0"); + const [tcapPrice, setTcapPrice] = useState("0.0"); + const [ctxPrice, setCtxPrice] = useState("0.0"); + const [ctxUSDBalance, setCtxUSDBalance] = useState("0.0"); + const [ctxBalance, setCtxBalance] = useState("0.0"); + const [isLoading, setIsLoading] = useState(true); + const currentNetwork = useContext(NetworkContext); + const signer = useContext(SignerContext); + const web3Modal = useContext(Web3ModalContext); + const tokens = useContext(TokensContext); + const oracles = useContext(OraclesContext); + + const VAULTS_STATE = gql` + { + states { + amountStaked + id + } + } + `; + + const { data } = useQuery(VAULTS_STATE, { + notifyOnNetworkStatusChange: true, + pollInterval: 35000, + fetchPolicy: "no-cache", + }); + + useEffect(() => { + const loadAddress = async () => { + if (oracles.tcapOracleRead) { + const currentTcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + // @ts-ignore + const [currentTcapPrice] = await signer.ethcallProvider?.all([currentTcapPriceCall]); + const TotalTcapPrice = currentTcapPrice.mul(10000000000); + const tPrice = ethers.utils.formatEther(TotalTcapPrice.div(10000000000)); + setTotalPrice(ethers.utils.formatEther(TotalTcapPrice)); + setTcapPrice(tPrice); + + if ( + signer.signer && + tokens.tcapTokenRead && + signerAddress !== "" && + signerAddress !== currentAddress + ) { + const ens = await getENS(signerAddress); + if (ens) { + setAddress(ens); + } else { + setAddress(makeShortAddress(signerAddress)); + } + + const currentTcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(signerAddress); + // @ts-ignore + const [currentTcapBalance] = await signer.ethcallProvider?.all([currentTcapBalanceCall]); + const tcapString = ethers.utils.formatEther(currentTcapBalance); + setTcapBalance(tcapString); + const tcapUSD = parseFloat(tcapString) * parseFloat(tPrice); + setTcapUSDBalance(tcapUSD.toString()); + + if (isInLayer1(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(signerAddress); + const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); + // @ts-ignore + const [wethOraclePrice, currentCtxBalance, reservesCtxPool] = + await signer.ethcallProvider?.all([ + wethOraclePriceCall, + currentCtxBalanceCall, + reservesCtxPoolCall, + ]); + const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + const ctxString = ethers.utils.formatEther(currentCtxBalance); + setCtxBalance(ctxString); + const currentPriceCTX = await getPriceInUSDFromPair( + reservesCtxPool[0], + reservesCtxPool[1], + parseFloat(currentPriceETH) + ); + const ctxUSD = parseFloat(ctxString) * currentPriceCTX; + setCtxPrice(currentPriceCTX.toString()); + setCtxUSDBalance(ctxUSD.toString()); + } + setCurrentAddress(signerAddress); + } + setIsLoading(false); + console.log(totalPrice); + } + }; + loadAddress(); + + // eslint-disable-next-line + }, [signerAddress, loadingContracts]); + + if (isLoading) { + return ; + } + + return ( +
+
+
+

+ + {t("welcome.tcap-info")}} + > + + +

+

{t("welcome.tcap")}:

+
+
+

+ +

+

TCAP Price:

+
+
+

+ +

+

CTX Price:

+
+
+
+
+ {address !== "" ? ( + <> + + +
+

{t("welcome.title1")}

+
+
+ +
+
+
+
{t("welcome.tcap-balance")}
+
+
+
+
+ +
+ +
+

+ +

+
+
+
+
+
{t("welcome.ctx-balance")}
+
+
+
+
+ +
+ +
+

+ +

+
+
+
+
+
+ + +

{t("welcome.title2")}

+
+ +

{t("welcome.subtitle2")}

+ +
+ + + + + + + + + + + + + + ) : ( + +
+

{t("welcome.title3")}

+

{t("welcome.subtitle3")}

+
+ +
+ + + + + )} + + + + + + + ); +}; + +export default Summary; diff --git a/src/components/Welcome/index.tsx b/src/components/Welcome/index.tsx index e40af82..b626bb5 100644 --- a/src/components/Welcome/index.tsx +++ b/src/components/Welcome/index.tsx @@ -2,7 +2,7 @@ import React, { useContext, useEffect, useState } from "react"; import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; import NetworkContext from "../../state/NetworkContext"; import { GRAPHQL_ENDPOINT, NETWORKS } from "../../utils/constants"; -import Welcome from "./Welcome"; +import Summary from "./Summary"; const clientOracle = (graphqlEndpoint: string) => new ApolloClient({ @@ -48,7 +48,7 @@ const WelcomeWrapper = ({ signerAddress, loadingContracts }: props) => { return ( - + ); }; diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 412b161..c68602c 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -400,21 +400,24 @@ } .ranges { display: flex; - width: 82%; + width: 100%; flex-direction: row; align-items: center; - justify-content: space-between; - @media (max-width: 1500px) { - width: 90%; - } - @media (max-width: 1400px) { - width: 100%; - } .min-range { font-size: 1rem; + margin-right: 2.5rem; } .max-range { font-size: 1rem; + margin-left: 2.5rem; + } + @media (max-width: 1350px) { + .min-range { + margin-right: 1rem; + } + .max-range { + margin-left: 1rem; + } } } } diff --git a/src/styles/header.scss b/src/styles/header.scss index b572292..6c74a8a 100644 --- a/src/styles/header.scss +++ b/src/styles/header.scss @@ -89,7 +89,6 @@ } } @media (max-width: 600px) { - margin-bottom: 1rem; padding-left: 0rem; justify-content: center; } @@ -158,18 +157,58 @@ margin-top:-5px; } + @media (max-width: 769px) { + .address { + font-size: 1rem; + } + .neon-pink { + font-size: 1rem; + } + .network-container { + padding-left: 2rem; + .btn { + height: 2.9rem; + } + .dropdown { + width: 85%; + + button{ + width: 100% !important; + } + } + .dropdown-menu { + width: 100%; + } + .dropdown-toggle::after { + margin-left: 75%; + } + .network-toggle { + h6 { + font-size: 0.9rem; + } + svg { + height: 1.8rem; + margin-right: 10px; + } + } + } + } @media (max-width: 600px) { padding-right: 0rem; justify-content: center; margin-top: 50px; - + .address { - font-size: 1rem; + font-size: 0.9rem; } .neon-pink { - font-size: 1rem; + font-size: 0.9rem; } .network-container { + padding-left: 0.5rem; + .btn { + height: 2.8rem; + } .dropdown { width: 85%; @@ -181,11 +220,14 @@ width: 100%; } .dropdown-toggle::after { - margin-left: 85%; + margin-left: 75%; } .network-toggle { - svg { - margin-right: 15px; + h6 { + font-size: 0.8rem; + } + svg { + height: 1.7rem; } } } @@ -193,4 +235,15 @@ justify-content: center; } } + @media (max-width: 530px) { + .network-container { + margin-bottom: 1rem; + .dropdown-toggle::after { + margin-left: 82%; + } + } + .btn-language { + display: none; + } + } } diff --git a/src/styles/summary.scss b/src/styles/summary.scss new file mode 100644 index 0000000..5e5374a --- /dev/null +++ b/src/styles/summary.scss @@ -0,0 +1,365 @@ +@import "./colors"; +@import "./fonts"; + +.summary { + display: flex; + flex-direction: column; + padding: 3rem 2rem; + padding-bottom: 2rem; + + h2 { + font-size: 1.375rem; + margin-bottom: 0rem; + } + h3 { + font-size: 1.1rem; + margin-bottom: 0rem; + } + h4 { + font-size: 0.9rem; + } + h5 { + font-size: 0.9rem; + text-align: right; + } + h6 { + color: $off-white; + } + + .btn { + background-color: $darker; + width: 7rem; + height: 2.7rem; + font-size: 0.8rem; + + &.question { + border-radius: 2px; + width: 20px; + height: 20px; + margin-right: 0px; + font-size: 10px; + padding: 2px; + margin-left: 5px; + } + } + + #connect { + background-color: $pink; + width: 15rem; + height: 3rem; + border-radius: 0; + } + .prices { + display: flex; + flex-direction: row; + padding: 1rem; + margin: 0rem 1rem; + border: 0.7px solid #a440f2; + border-radius: 5px; + background-color: #281e31; + .token-price { + display: flex; + flex-direction: row-reverse; + align-items: center; + margin-left: 0.5rem; + margin-right: 1.5rem; + } + .number { + margin-left: 0.5rem; + display: flex; + flex-direction: row; + align-items: center; + } + h4 { + margin-bottom: 0rem; + @media (max-width: 1499px) { + font-size: 0.8rem; + } + @media (max-width: 1400px) { + font-size: 0.75rem; + } + @media (max-width: 1320px) { + font-size: 0.7rem; + } + @media (max-width: 1279px) { + font-size: 0.65rem; + } + } + } + .summary2 { + display: flex; + flex-direction: row; + flex-wrap: wrap; + margin-top: 2rem; + } + .card { + padding: 1.5rem; + &-header { + padding: 0.5rem 1rem; + } + + .cls-1 { + fill: $darker; + } + b { + font-family: "Nineteen Ninety Seven"; + color: $purple; + } + p { + margin-bottom: 1.5rem; + } + .row { + margin-top: 0rem; + } + + &.diamond { + background-image: url("../assets/images/welcome/diamond.svg"); + background-repeat: no-repeat; + background-position: right bottom; + padding-bottom: 0rem; + + p { + width: 80%; + } + .btn { + width: 11.0625rem; + margin-bottom: 0.8rem; + margin-left: 0.8rem; + border-radius: 5px; + + &.neon-green { + box-shadow: 0px 0px 39px -6px rgba(63, 217, 180, 0.4); + } + &.neon-blue { + box-shadow: 0px 0px 39px -6px rgba(15, 217, 255, 0.4); + } + } + } + } + + .col-wrapper { + p { + font-size: 1rem; + } + div[class*="col-"] { + padding: 0rem; + } + .balance { + margin-bottom: 1.5rem; + padding-bottom: 0.8rem; + } + } + + .balance-section { + display: flex; + flex-direction: row; + justify-content: space-between; + p { + margin-bottom: 0rem; + margin-left: 1rem; + } + .balance-box { + display: flex; + flex-direction: column; + justify-content: space-between; + + h5 { + text-align: left; + margin-bottom: 0rem; + margin-left: 0.5rem; + } + svg { + height: 2rem; + } + .title { + display: flex; + justify-content: flex-end; + padding-top: 0.7rem; + padding-bottom: 0.9rem; + } + .values { + display: flex; + flex-direction: column; + align-items: flex-end; + h5 { + font-size: 1.2rem; + } + } + .asset-value { + display: flex; + align-items: center; + flex-direction: row-reverse; + } + } + } + + .protocol { + height: 100%; + padding-left: 1rem; + padding-right: 1rem; + .card-body { + display: flex; + } + svg { + width: 2rem; + } + .weth { + height: 2.1rem; + width: 1rem; + } + .totals { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + height: fit-content; + padding: 0.7rem; + background-color: #281e31; + border: 0.7px solid $highlight; + border-radius: 5px; + } + .detail { + display: grid; + grid-template-columns: auto auto; + gap: 1rem; + row-gap: 1.7rem; + height: fit-content; + width: 100%; + } + .asset { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + height: fit-content; + min-height: 4rem; + padding: 0.7rem; + background-color: #281e31; + border: 0.7px solid $highlight; + border-radius: 5px; + h5 { + margin-bottom: 0.5rem; + } + } + .staked { + display: flex; + flex-direction: column-reverse; + margin-left: 1rem; + h6 { + margin-bottom: 0rem; + text-align: right; + color: $light; + } + } + .card-footer { + padding-top: 2rem; + padding-bottom: 0rem; + } + .use-tcap { + display: flex; + justify-content: space-evenly; + .btn.neon-blue { + box-shadow: 0px 0px 14px -6px $blue; + } + } + @media (min-width: 1149px) and (max-width: 1320px) { + h6 { + font-size: 0.9rem; + } + } + @media (min-width: 760px) and (max-width: 1150px) { + .detail { + grid-template-columns: auto; + } + } + } + + @media (max-width: 1000px) { + padding: 3rem 1.2rem; + + .card-wrapper { + .card { + margin-bottom: 1.2rem; + + &.diamond { + p { + width: 85%; + } + } + } + } + } + @media (max-width: 769px) { + .prices { + flex-wrap: wrap; + padding: 0.5rem; + .token-price { + margin-bottom: 0.5rem; + } + h4 { + font-size: 0.68rem; + } + } + .protocol { + margin-top: 2rem; + } + } + @media (max-width: 600px) { + .prices { + .token-price.total { + flex-direction: column; + align-items: flex-start; + margin-bottom: 1rem; + .number{ + margin-left: 0rem; + margin-bottom: 0.2rem; + } + } + h4 { + font-size: 0.85rem; + } + } + } + @media (max-width: 550px) { + padding-left: 1rem; + padding-right: 1rem; + h2 { + font-size: 1.2rem; + } + .card-header { + padding: 0.5rem 0rem; + } + .card-body { + padding-left: 0rem; + padding-right: 0rem; + } + .prices { + .title { + display: none; + } + .token-price { + width: 100%; + margin-right: 0rem; + justify-content: space-between; + } + } + .balance-section { + flex-direction: column; + .balance-box { + margin-bottom: 1.2rem; + .title { + justify-content: flex-start; + } + .values { + align-items: flex-start; + } + } + } + .protocol { + .detail { + grid-template-columns: auto; + row-gap: 1rem; + } + } + } +} diff --git a/src/styles/welcome.scss b/src/styles/welcome.scss index e49b82d..051e395 100644 --- a/src/styles/welcome.scss +++ b/src/styles/welcome.scss @@ -178,6 +178,31 @@ } } + .protocol { + + h5 { + font-size: 1rem; + } + h6 { + color: $off-white; + } + .card-body { + padding: 0rem; + } + .asset { + display: flex; + flex-direction: row; + align-items: center; + padding: 0.5rem; + } + .staked { + display: flex; + flex-direction: column-reverse; + margin-left: 1rem; + } + } + + @media (max-height: 820px) and (min-width: 992px) { padding-top: 1rem; .card-wrapper { diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index cb8f48e..30c3536 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -2,7 +2,8 @@ import React from "react"; import { BigNumber, ethers, utils } from "ethers"; import { Fragment, JsonFragment } from "@ethersproject/abi"; import { toast } from "react-toastify"; -import toasty from "../assets/images/toasty.png"; +import successImg from "../assets/images/noti-success.png"; +import errorImg from "../assets/images/noti-error.png"; import { FEATURES, NETWORKS } from "./constants"; import { OraclesContext } from "../state/OraclesContext"; import { VaultsContext } from "../state/VaultsContext"; @@ -86,7 +87,11 @@ export const sendNotification = async ( ) => { const toastConstant = (
- toasty + {className === "success" ? ( + toasty + ) : ( + toasty + )}
{title}

{body}

From 63b9d2a0b2101bc05026c9d962cab50860173abf Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 6 May 2022 20:45:04 -0600 Subject: [PATCH 103/278] updating summary page when not connected --- src/components/Welcome/Protocol.tsx | 227 +-- src/components/Welcome/Summary.tsx | 264 +-- src/contracts/cryptex.json | 2930 +++++++++++++++++++++++++++ src/styles/app.scss | 4 + src/styles/summary.scss | 10 +- 5 files changed, 3193 insertions(+), 242 deletions(-) diff --git a/src/components/Welcome/Protocol.tsx b/src/components/Welcome/Protocol.tsx index 311e453..c36ae0e 100644 --- a/src/components/Welcome/Protocol.tsx +++ b/src/components/Welcome/Protocol.tsx @@ -1,5 +1,6 @@ import React, { useContext, useEffect, useState } from "react"; import Card from "react-bootstrap/esm/Card"; +import Spinner from "react-bootstrap/Spinner"; import { BigNumber, ethers } from "ethers"; import { useTranslation } from "react-i18next"; import NumberFormat from "react-number-format"; @@ -19,7 +20,6 @@ import { ReactComponent as POLYGONIcon } from "../../assets/images/graph/polygon import { ReactComponent as WBTCIcon } from "../../assets/images/graph/wbtc.svg"; import { ReactComponent as USDCIcon } from "../../assets/images/graph/usdc.svg"; import cryptexJson from "../../contracts/cryptex.json"; -import Loading from "../Loading"; import { isInLayer1, isOptimism, @@ -69,7 +69,6 @@ const Protocol = ({ data }: props) => { data && signer && !isUndefined(tokens.tcapTokenRead) && - !isUndefined(tokens.ctxPoolTokenRead) && validOracles(currentNetwork.chainId || 1, oracles) ) { const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); @@ -307,84 +306,40 @@ const Protocol = ({ data }: props) => { // eslint-disable-next-line }, [data]); - if (loading) { - return ; - } - return (

Protocol Summary

-
-
- -
-
{t("graph.staked-usd")}
-
- -
-
-
-
- -
-
{t("graph.total-supply")}
-
- -
-
+ {loading ? ( +
+
- {!isPolygon(currentNetwork.chainId) && ( -
- + ) : ( +
+
+
-
{t("graph.staked-eth")}
-
+
{t("graph.staked-usd")}
+
- )} -
- -
-
{t("graph.staked-dai")}
-
- -
-
-
- {isInLayer1(currentNetwork.chainId) && ( -
- +
+
-
{t("graph.staked-aave")}
-
+
{t("graph.total-supply")}
+
{
- )} - {!isPolygon(currentNetwork.chainId) && ( + {!isPolygon(currentNetwork.chainId) && ( +
+ +
+
{t("graph.staked-eth")}
+
+ +
+
+
+ )}
- +
-
{t("graph.staked-link")}
-
+
{t("graph.staked-dai")}
+
{
- )} - {isOptimism(currentNetwork.chainId) && ( - <> + {isInLayer1(currentNetwork.chainId) && (
- +
-

{t("graph.staked-uni")}

+
{t("graph.staked-aave")}
{
+ )} + {!isPolygon(currentNetwork.chainId) && (
- +
-

{t("graph.staked-snx")}

+
{t("graph.staked-link")}
{
- - )} - {isPolygon(currentNetwork.chainId) && ( -
- -
-
{t("graph.staked-matic")}
-
- -
+ )} + {isOptimism(currentNetwork.chainId) && ( + <> +
+ +
+

{t("graph.staked-uni")}

+
+ +
+
+
+
+ +
+

{t("graph.staked-snx")}

+
+ +
+
+
+ + )} + {isPolygon(currentNetwork.chainId) && ( +
+ +
+
{t("graph.staked-matic")}
+
+ +
+
-
- )} - {!isOptimism(currentNetwork.chainId) && ( + )} + {!isOptimism(currentNetwork.chainId) && ( +
+ +
+
{t("graph.staked-wbtc")}
+
+ +
+
+
+ )}
- +
-
{t("graph.staked-wbtc")}
+
{t("graph.staked-usdc")}
{
- )} -
- -
-
{t("graph.staked-usdc")}
-
- -
-
-
+ )} ); diff --git a/src/components/Welcome/Summary.tsx b/src/components/Welcome/Summary.tsx index 74cd0c0..21de07f 100644 --- a/src/components/Welcome/Summary.tsx +++ b/src/components/Welcome/Summary.tsx @@ -73,6 +73,24 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { setTotalPrice(ethers.utils.formatEther(TotalTcapPrice)); setTcapPrice(tPrice); + let currentPriceCTX = 0; + if (signerAddress === "" || isInLayer1(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); + // @ts-ignore + const [wethOraclePrice, reservesCtxPool] = await signer.ethcallProvider?.all([ + wethOraclePriceCall, + reservesCtxPoolCall, + ]); + const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + currentPriceCTX = await getPriceInUSDFromPair( + reservesCtxPool[0], + reservesCtxPool[1], + parseFloat(currentPriceETH) + ); + setCtxPrice(currentPriceCTX.toString()); + } + if ( signer.signer && tokens.tcapTokenRead && @@ -95,26 +113,12 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { setTcapUSDBalance(tcapUSD.toString()); if (isInLayer1(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(signerAddress); - const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); // @ts-ignore - const [wethOraclePrice, currentCtxBalance, reservesCtxPool] = - await signer.ethcallProvider?.all([ - wethOraclePriceCall, - currentCtxBalanceCall, - reservesCtxPoolCall, - ]); - const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + const [currentCtxBalance] = await signer.ethcallProvider?.all([currentCtxBalanceCall]); const ctxString = ethers.utils.formatEther(currentCtxBalance); setCtxBalance(ctxString); - const currentPriceCTX = await getPriceInUSDFromPair( - reservesCtxPool[0], - reservesCtxPool[1], - parseFloat(currentPriceETH) - ); const ctxUSD = parseFloat(ctxString) * currentPriceCTX; - setCtxPrice(currentPriceCTX.toString()); setCtxUSDBalance(ctxUSD.toString()); } setCurrentAddress(signerAddress); @@ -170,61 +174,63 @@ const Summary = ({ signerAddress, loadingContracts }: props) => {

TCAP Price:

-
-

- -

-

CTX Price:

-
+ {isInLayer1(currentNetwork.chainId) && ( +
+

+ +

+

CTX Price:

+
+ )}
{address !== "" ? ( - <> - - -
-

{t("welcome.title1")}

-
-
- -
-
-
-
{t("welcome.tcap-balance")}
-
-
-
-
- -
- -
-

+ + +

+

{t("welcome.title1")}

+
+ + +
+
+
+
{t("welcome.tcap-balance")}
+
+
+
+
-

+
+
+

+ +

+
+ {isInLayer1(currentNetwork.chainId) && (
{t("welcome.ctx-balance")}
@@ -254,90 +260,92 @@ const Summary = ({ signerAddress, loadingContracts }: props) => {

-
-
- - - -

{t("welcome.title2")}

-
- -

{t("welcome.subtitle2")}

- -
- - - - - - - - - - - - - + )} + + + ) : ( -
+

{t("welcome.title3")}

-

{t("welcome.subtitle3")}

-
+ + + +

{t("welcome.subtitle3")}

+
+ +
+
+
+
+ )} + + +

{t("welcome.title2")}

+
+ +

{t("welcome.subtitle2")}

+ - - )} + + + + + + + + diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index df9343f..f910a73 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -66618,6 +66618,2936 @@ "type": "receive" } ] + }, + "SNXOracle": { + "address": "0x2b5726B892FD346Ed449271A54BeaffE24A88DdA", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "SNXVaultHandler": { + "address": "0x443366a7a5821619D8d57405511E4fadD9964771", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardHandler", + "outputs": [ + { + "internalType": "contract IRewardHandler", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "UNIOracle": { + "address": "0x2b5726B892FD346Ed449271A54BeaffE24A88DdA", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "UNIVaultHandler": { + "address": "0x5B577578565c2404BB84E734F583CF8523236eF1", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardHandler", + "outputs": [ + { + "internalType": "contract IRewardHandler", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] } } } diff --git a/src/styles/app.scss b/src/styles/app.scss index e6ac0ef..ae0e3e2 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -399,6 +399,10 @@ form { } } +.spinner-container { + display: block; + height: 100%; +} .spinner { margin: 5rem 50%; color: $highlight !important; diff --git a/src/styles/summary.scss b/src/styles/summary.scss index 5e5374a..ac45e29 100644 --- a/src/styles/summary.scss +++ b/src/styles/summary.scss @@ -6,7 +6,10 @@ flex-direction: column; padding: 3rem 2rem; padding-bottom: 2rem; - + .spinner-container { + padding-top: 3rem; + width: 100%; + } h2 { font-size: 1.375rem; margin-bottom: 0rem; @@ -42,12 +45,17 @@ margin-left: 5px; } } + .btn:disabled { + color: $light; + opacity: 0.8; + } #connect { background-color: $pink; width: 15rem; height: 3rem; border-radius: 0; + font-size: 1rem; } .prices { display: flex; From 6821d6a5d5a561a3670d8afbcf015eef66f29ea9 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 12 May 2022 09:48:52 -0600 Subject: [PATCH 104/278] working on mint page --- public/locales/en/translation.json | 2 +- src/assets/images/noti-error.png | Bin 207995 -> 29651 bytes src/assets/images/noti-success.png | Bin 219315 -> 32789 bytes src/components/Farm/UniV3Rewards/Rewards.tsx | 18 +- src/components/Vault/Mint.tsx | 1545 +++++++++++++++++ src/components/Vault/Mint2.tsx | 1593 ++++++++++++++++++ src/components/Vault/Vault.tsx | 6 +- src/components/Welcome/Protocol.tsx | 4 +- src/components/Welcome/Welcome.tsx | 339 ---- src/styles/farm.scss | 14 +- src/styles/mint.scss | 799 +++++++++ src/styles/mint2.scss | 749 ++++++++ src/styles/summary.scss | 4 - src/styles/welcome.scss | 246 --- src/utils/utils.tsx | 6 +- 15 files changed, 4724 insertions(+), 601 deletions(-) create mode 100644 src/components/Vault/Mint.tsx create mode 100644 src/components/Vault/Mint2.tsx delete mode 100644 src/components/Welcome/Welcome.tsx create mode 100644 src/styles/mint.scss create mode 100644 src/styles/mint2.scss delete mode 100644 src/styles/welcome.scss diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 3847d30..66efb52 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -42,7 +42,7 @@ "title1": "My Total Balance", "subtitle1": "Connected Account", "title2": "Use TCAP", - "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "subtitle2": "Trade TCAP using Uniswap or create new supply using a vault", "title3": "Connect Your Account", "subtitle3": "Mint TCAP, or check your balance connecting your account", "tcap-balance": "TCAP Balance", diff --git a/src/assets/images/noti-error.png b/src/assets/images/noti-error.png index a66aab8cfe921bfd0ef1c1fc72d8db485ae99739..9bf3c0327b6aae88e2b84bd95548abf0c88caa39 100644 GIT binary patch literal 29651 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
LWdg{hW)k6osAsz-FX~LS3;U4DF;a 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%0AclTz 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 z

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 LNkvXXu0mjfRdp>6 literal 219315 zcmd2?gL5TMw2tkK?~QF+8{6F2wzaWs`^NUhww)Vp>}>4p?%Ut1djG@gs;TLjsjfcr z&3C%L(`PzbMM)YJi4X|_0s>W5MnVk&0*3d$0|ENqovpdN-hU?;D^W#J2#BUce`Ue|0()1r14QX9YqcA$$P;7a}?wVisN8A|OCKUU-ffpvOgMj!jI* zh~xI}kr_^n8Fm#MA}Rt31|m8x$`=3(JQ5n_7eur#$S7!N_~g(qaIR1_glJMm5NY`2 zjCep276C~dJbZF0I%ZCObRwEqh&>E4MpA$d9i}Tb4L3R*zC3 U}_~h8h)&lO06< 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

-
Available to Claim:
+
+ Available to Claim + + In order to claim rewards, you need to unstake your token. + + } + > + + + : +
{ + const currentNetwork = useContext(NetworkContext); + const oracles = useContext(OraclesContext); + const tokens = useContext(TokensContext); + const vaults = useContext(VaultsContext); + const hardVaults = useContext(HardVaultsContext); + const signer = useContext(SignerContext); + const [vaultMode, setVaultMode] = useState("hard"); + const [loadingMode, setLoadingMode] = useState(false); + const radios = [ + { name: "Regular Mode", value: "normal" }, + { name: "Hard Mode", value: "hard" }, + ]; + let currency = !isPolygon(currentNetwork.chainId) ? "ETH" : "MATIC"; + const match = useRouteMatch("/vault/:currency"); + const history = useHistory(); + const isHardMode = () => vaultMode === "hard"; + + // @ts-ignore + switch (match?.params?.currency?.toLowerCase()) { + case "eth": + currency = "ETH"; + if (FEATURES.POLYGON && isPolygon(currentNetwork.chainId)) { + history?.push(`/vault/MATIC`); + currency = "MATIC"; + } + break; + case "weth": + currency = "WETH"; + if (FEATURES.POLYGON && isPolygon(currentNetwork.chainId)) { + history?.push(`/vault/MATIC`); + currency = "MATIC"; + } + break; + case "wbtc": + currency = "WBTC"; + if (isOptimism(currentNetwork.chainId) || isHardMode()) { + history?.push(`/vault/ETH`); + currency = "ETH"; + } + break; + case "dai": + currency = "DAI"; + break; + case "aave": + if (isInLayer1(currentNetwork.chainId) && !isHardMode()) { + currency = "AAVE"; + } else { + currency = "ETH"; + history?.push(`/vault/ETH`); + } + break; + case "usdc": + if (isInLayer1(currentNetwork.chainId) && isHardMode()) { + currency = "USDC"; + } else { + currency = "ETH"; + history?.push(`/vault/ETH`); + } + break; + case "link": + if (!isPolygon(currentNetwork.chainId) && !isHardMode()) { + currency = "LINK"; + } else { + currency = "ETH"; + history?.push(`/vault/ETH`); + } + break; + case "matic": + currency = "MATIC"; + if ((!FEATURES.POLYGON && !isPolygon(currentNetwork.chainId)) || isHardMode()) { + history?.push(`/vault/ETH`); + currency = "ETH"; + } + setVaultMode("normal"); + break; + default: + currency = FEATURES.POLYGON && isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"; + break; + } + + // Actions + const [title, setTitle] = useState(t("vault.create")); + const [text, setText] = useState(t("vault.create-text")); + const [isApproved, setIsApproved] = useState(false); + const [isLoading, setIsLoading] = useState(true); + const [btnDisabled, setBtnDisabled] = useState(false); + + // Vault Data + const [vaultOptions, setVaultOptions] = useState>([]); + const [selectedVaultId, setSelectedVaultId] = useState("0"); + const [vaultDebt, setVaultDebt] = useState("0"); + const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); + const [vaultCollateral, setVaultCollateral] = useState("0"); + const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); + const [vaultRatio, setVaultRatio] = useState("0"); + const [tempRatio, setTempRatio] = useState(""); + const [minRatio, setMinRatio] = useState("0"); + const [selectedVault, setSelectedVault] = useState(currency); + const [selectedVaultContract, setSelectedVaultContract] = useState(); + const [selectedVaultRead, setSelectedVaultRead] = useState(); + const [selectedOracleRead, setSelectedOracleRead] = useState(); + const [selectedCollateralContract, setSelectedCollateralContract] = useState(); + const [selectedVaultDecimals, setSelectedVaultDecimals] = useState(18); + + // General Data + const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); + const [tokenBalance, setTokenBalance] = useState("0"); + const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); + + // Inputs + const [addCollateralTxt, setAddCollateralTxt] = useState("0"); + const [addCollateralUSD, setAddCollateralUSD] = useState("0"); + const [removeCollateralTxt, setRemoveCollateralTxt] = useState(""); + const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); + const [mintTxt, setMintTxt] = useState("0"); + const [mintUSD, setMintUSD] = useState("0"); + const [burnTxt, setBurnTxt] = useState("0"); + const [burnUSD, setBurnUSD] = useState("0"); + const [burnFee, setBurnFee] = useState("0"); + const [vaultStatus, setVaultStatus] = useState(""); + + // Infinite Approval + const approveValue = BigNumber.from("1157920892373161954235709850086879078532699"); + + const USER_VAULT = gql` + query getVault($owner: String!) { + vaults(where: { owner: $owner }) { + id + vaultId + owner + collateral + debt + address + owner + hardVault + } + _meta { + block { + number + hash + } + hasIndexingErrors + } + } + `; + + const tcapPrice = async () => { + const currentTCAPPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentTCAPPrice] = await signer.ethcallProvider?.all([currentTCAPPriceCall]); + return currentTCAPPrice; + }; + + const collateralPrice = async () => { + const collateralPriceCall = await selectedOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentCollateralPrice] = await signer.ethcallProvider?.all([collateralPriceCall]); + return currentCollateralPrice; + }; + + const validVaults = (): boolean => { + let valid = + !isUndefined(oracles.daiOracle) && + !isUndefined(oracles.tcapOracle) && + !isUndefined(oracles.daiOracleRead) && + !isUndefined(vaults.daiVault) && + !isUndefined(tokens.daiTokenRead); + + if (isInLayer1(currentNetwork.chainId)) { + valid = + valid && + !isUndefined(oracles.wethOracle) && + !isUndefined(oracles.aaveOracle) && + !isUndefined(oracles.linkOracle) && + !isUndefined(oracles.wethOracleRead) && + !isUndefined(oracles.aaveOracleRead) && + !isUndefined(oracles.linkOracleRead) && + !isUndefined(vaults.wethVault) && + !isUndefined(vaults.aaveVault) && + !isUndefined(vaults.linkVault) && + !isUndefined(tokens.aaveToken) && + !isUndefined(tokens.linkToken) && + !isUndefined(tokens.wethTokenRead) && + !isUndefined(tokens.aaveTokenRead) && + !isUndefined(tokens.linkTokenRead); + } + if (isOptimism(currentNetwork.chainId)) { + valid = + valid && + !isUndefined(oracles.linkOracle) && + !isUndefined(oracles.snxOracle) && + !isUndefined(oracles.uniOracle) && + !isUndefined(oracles.linkOracleRead) && + !isUndefined(oracles.snxOracleRead) && + !isUndefined(oracles.uniOracleRead) && + !isUndefined(vaults.linkVault) && + !isUndefined(vaults.snxVault) && + !isUndefined(vaults.uniVault) && + !isUndefined(tokens.linkToken) && + !isUndefined(tokens.snxToken) && + !isUndefined(tokens.uniToken) && + !isUndefined(tokens.linkTokenRead) && + !isUndefined(tokens.snxTokenRead) && + !isUndefined(tokens.uniTokenRead); + } + if (isPolygon(currentNetwork.chainId)) { + valid = + valid && + !isUndefined(oracles.maticOracle) && + !isUndefined(oracles.maticOracleRead) && + !isUndefined(oracles.wbtcOracle) && + !isUndefined(oracles.wbtcOracleRead) && + !isUndefined(vaults.maticVault) && + !isUndefined(vaults.maticVaultRead) && + !isUndefined(vaults.wbtcVault) && + !isUndefined(vaults.wbtcVaultRead) && + !isUndefined(tokens.maticToken) && + !isUndefined(tokens.maticTokenRead) && + !isUndefined(tokens.wbtcToken) && + !isUndefined(tokens.maticTokenRead); + } + + return valid; + }; + + const isGasAsset = () => + (!isPolygon(currentNetwork.chainId) && selectedVault === "ETH") || + (isPolygon(currentNetwork.chainId) && selectedVault === "MATIC"); + + async function loadVault(vaultType: string, vaultData: any) { + if (signer.signer && validVaults() && vaultData) { + let currentVault: any; + let currentVaultRead: any; + let currentToken; + let currentOracleRead; + let currentTokenRead; + let balance; + const provider = getDefaultProvider( + currentNetwork.chainId || NETWORKS.mainnet.chainId, + currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.rinkeby.name + ); + switch (vaultType) { + case "ETH": + currentVault = !isHardMode() ? vaults.wethVault : hardVaults.wethVault; + currentVaultRead = !isHardMode() ? vaults.wethVaultRead : hardVaults.wethVaultRead; + currentToken = tokens.wethToken; + currentOracleRead = oracles.wethOracleRead; + currentTokenRead = tokens.wethTokenRead; + balance = await provider.getBalance(address); + break; + case "WETH": + currentVault = !isHardMode() ? vaults.wethVault : hardVaults.wethVault; + currentVaultRead = !isHardMode() ? vaults.wethVaultRead : hardVaults.wethVaultRead; + currentToken = tokens.wethToken; + currentOracleRead = oracles.wethOracleRead; + currentTokenRead = tokens.wethTokenRead; + break; + case "DAI": + currentVault = !isHardMode() ? vaults.daiVault : hardVaults.daiVault; + currentVaultRead = !isHardMode() ? vaults.daiVaultRead : hardVaults.daiVaultRead; + currentToken = tokens.daiToken; + currentOracleRead = oracles.daiOracleRead; + currentTokenRead = tokens.daiTokenRead; + break; + case "AAVE": + currentVault = vaults.aaveVault; + currentVaultRead = vaults.aaveVaultRead; + currentToken = tokens.aaveToken; + currentOracleRead = oracles.aaveOracleRead; + currentTokenRead = tokens.aaveTokenRead; + break; + case "LINK": + currentVault = vaults.linkVault; + currentVaultRead = vaults.linkVaultRead; + currentToken = tokens.linkToken; + currentOracleRead = oracles.linkOracleRead; + currentTokenRead = tokens.linkTokenRead; + break; + case "SNX": + currentVault = vaults.snxVault; + currentVaultRead = vaults.snxVaultRead; + currentToken = tokens.snxToken; + currentOracleRead = oracles.snxOracleRead; + currentTokenRead = tokens.snxTokenRead; + break; + case "UNI": + currentVault = vaults.uniVault; + currentVaultRead = vaults.uniVaultRead; + currentToken = tokens.uniToken; + currentOracleRead = oracles.uniOracleRead; + currentTokenRead = tokens.uniTokenRead; + break; + case "MATIC": + currentVault = vaults.maticVault; + currentVaultRead = vaults.maticVaultRead; + currentToken = tokens.maticToken; + currentOracleRead = oracles.maticOracleRead; + currentTokenRead = tokens.maticTokenRead; + // balance = await provider.getBalance(address); + break; + case "WBTC": + currentVault = vaults.wbtcVault; + currentVaultRead = vaults.wbtcVaultRead; + currentToken = tokens.wbtcToken; + currentOracleRead = oracles.wbtcOracleRead; + currentTokenRead = tokens.wbtcTokenRead; + // balance = await provider.getBalance(address); + break; + case "USDC": + currentVault = hardVaults.usdcVault; + currentVaultRead = hardVaults.usdcVaultRead; + currentToken = tokens.usdcToken; + currentOracleRead = oracles.usdcOracleRead; + currentTokenRead = tokens.usdcTokenRead; + // balance = await provider.getBalance(address); + break; + default: + currentVault = vaults.wethVault; + currentVaultRead = vaults.wethVaultRead; + currentToken = tokens.wethToken; + currentOracleRead = oracles.wethOracleRead; + currentTokenRead = tokens.wethTokenRead; + break; + } + setSelectedVaultContract(currentVault); + setSelectedCollateralContract(currentToken); + setSelectedVaultRead(currentVaultRead); + setSelectedOracleRead(currentOracleRead); + + let currentVaultData: any; + // Removed GRAPH + // if data is empty load vault data from contract + /* const graphBlock = vaultData._meta.block.number; + let currentBlock = await provider.getBlockNumber(); + currentBlock -= 10; + if ( + isInLayer1(currentNetwork.chainId) && + vaultData.vaults.length > 0 && + !vaultData._meta.hasIndexingErrors && + graphBlock >= currentBlock + ) { + await vaultData.vaults.forEach((v: any) => { + if (v.address.toLowerCase() === currentVault.address.toLowerCase()) { + currentVaultData = v; + } + }); + } else { + const vaultID = await currentVault.userToVault(address); + if (!vaultID.eq(0)) { + const vault = await currentVault.vaults(vaultID); + currentVaultData = { + vaultId: vaultID, + collateral: vault.Collateral, + debt: vault.Debt, + }; + } + } */ + const vaultID = await currentVault.userToVault(address); + if (!vaultID.eq(0)) { + const vault = await currentVault.vaults(vaultID); + currentVaultData = { + vaultId: vaultID, + collateral: vault.Collateral, + debt: vault.Debt, + }; + } + + if (vaultType !== "ETH") { + // @ts-ignore + balance = await currentToken.balanceOf(address); + } + + let decimals = 18; + let currentPrice; + + if (currentVaultData) { + const { vaultId, collateral, debt } = currentVaultData; + // @ts-ignore + const allowanceCall = await currentTokenRead.allowance(address, currentVault.address); + const currentRatioCall = await currentVaultRead.getVaultRatio(vaultId); + + // @ts-ignore + const currentTCAPPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + // @ts-ignore + const decimalsCall = await currentTokenRead.decimals(); + // @ts-ignore + const currentPriceCall = await currentOracleRead.getLatestAnswer(); + const currentMinRatioCall = await currentVaultRead.ratio(); + + // @ts-ignore + const [ + allowance, + currentRatio, + currentTCAPPrice, + decimalsVal, + currentPriceVal, + currentMinRatio, + ] = await signer.ethcallProvider?.all([ + allowanceCall, + currentRatioCall, + currentTCAPPriceCall, + decimalsCall, + currentPriceCall, + currentMinRatioCall, + ]); + + decimals = decimalsVal; + currentPrice = ethers.utils.formatEther(currentPriceVal.mul(10000000000)); + setSelectedVaultId(vaultId); + + if (!allowance.isZero() || vaultType === "ETH") { + const safeValue = isHardMode() ? 20 : 50; + const warnValue = isHardMode() ? 10 : 30; + + setMinRatio(currentMinRatio.toString()); + setIsApproved(true); + setVaultRatio(currentRatio.toString()); + if (currentRatio.toString() === "0") { + setVaultStatus("N/A"); + } else if ( + currentRatio.toString() >= + parseFloat(currentMinRatio.toString()) + safeValue + ) { + setVaultStatus("safe"); + } else if ( + currentRatio.toString() >= + parseFloat(currentMinRatio.toString()) + warnValue + ) { + setVaultStatus("warning"); + } else { + setVaultStatus("danger"); + } + + const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); + + // const parsedCollateral = ethers.utils.formatEther(collateral); + setVaultCollateral(parsedCollateral); + const usdCollateral = toUSD(currentPrice, parsedCollateral); + setVaultCollateralUSD(usdCollateral.toString()); + + const currentTCAPPriceFormat = ethers.utils.formatEther(currentTCAPPrice); + const parsedDebt = ethers.utils.formatEther(debt); + setVaultDebt(parsedDebt); + const usdTCAP = toUSD(currentTCAPPriceFormat, parsedDebt); + setVaultDebtUSD(usdTCAP.toString()); + } else { + setText(t("vault.approve-text")); + setTitle(t("vault.approve")); + setIsApproved(false); + } + } else { + // @ts-ignore + const decimalsCall = await currentTokenRead.decimals(); + // @ts-ignore + const currentPriceCall = await currentOracleRead.getLatestAnswer(); + // @ts-ignore + const [decimalsVal, currentPriceVal] = await signer.ethcallProvider?.all([ + decimalsCall, + currentPriceCall, + ]); + decimals = decimalsVal; + currentPrice = ethers.utils.formatEther(currentPriceVal.mul(10000000000)); + + setSelectedVaultId("0"); + setText(t("vault.create-text")); + setTitle(t("vault.create")); + setIsApproved(false); + } + + setSelectedVaultDecimals(decimals); + const currentBalance = ethers.utils.formatUnits(balance, decimals); + if (parseFloat(currentBalance) < 0.09) { + setTokenBalanceDecimals(4); + } else { + setTokenBalanceDecimals(2); + } + setTokenBalance(currentBalance); + + const usdBalance = toUSD(currentPrice, currentBalance); + setTokenBalanceUSD(usdBalance.toString()); + setLoadingMode(false); + } + } + + const { data, error, refetch, networkStatus } = useQuery(USER_VAULT, { + variables: { owner: address }, + pollInterval: 200000, + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + onError: () => { + console.log(error); + }, + onCompleted: () => { + let vaultType = selectedVault; + if (isPolygon(currentNetwork.chainId) && vaultType === "ETH") { + vaultType = "MATIC"; + setSelectedVault("MATIC"); + } + loadVault(vaultType, data); + }, + }); + + const refresh = async () => { + try { + if (!isOptimism(currentNetwork.chainId)) { + await refetch(); + } else { + loadVault(selectedVault, data); + } + } catch (error) { + console.log(error); + // catch error in case the vault screen is changed + } + }; + + const resetFields = () => { + setBurnFee("0"); + setAddCollateralUSD("0"); + setAddCollateralTxt(""); + setRemoveCollateralTxt(""); + setRemoveCollateralUSD("0"); + setMintTxt(""); + setMintUSD("0"); + setBurnUSD("0"); + setBurnTxt(""); + }; + + const handleRadioBtnChange = async (value: string) => { + setLoadingMode(true); + setVaultMode(value); + setIsApproved(false); + setTokenBalance("0"); + setTokenBalanceUSD("0"); + setSelectedVault("ETH"); + + history?.push(`/vault/ETH`); + resetFields(); + await refetch(); + }; + + const changeVault = async (newRatio: number, reset = false) => { + const safeValue = isHardMode() ? 20 : 50; + const warnValue = isHardMode() ? 10 : 30; + let r = newRatio; + + if (reset) { + r = parseFloat(tempRatio); + setVaultRatio(tempRatio); + setTempRatio(""); + resetFields(); + } else { + if (tempRatio === "") { + setTempRatio(vaultRatio); + } + r = newRatio; + setVaultRatio(r.toString()); + } + + if (r === 0) { + setVaultStatus(t("vault.status.na")); + } else if (r >= parseFloat(minRatio) + safeValue) { + setVaultStatus(t("vault.status.safe")); + } else if (r >= parseFloat(minRatio) + warnValue) { + setVaultStatus(t("vault.status.warning")); + } else if (r >= parseFloat(minRatio)) { + setVaultStatus(t("vault.status.danger")); + } else { + setVaultRatio("0"); + setVaultStatus(t("vault.status.error")); + } + }; + + // forms + const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { + if (isHardMode()) { + const d = parseFloat(vaultDebt); + let newDebt = 0; + if (isMint) { + newDebt = amount + d; + } else { + newDebt = d - amount; + } + return newDebt >= 20 || newDebt === 0; + } + return true; + }; + + const onChangeAddCollateral = async (event: React.ChangeEvent) => { + setAddCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); + changeVault(r); + setAddCollateralUSD(usd.toString()); + } else { + changeVault(0, true); + setAddCollateralUSD("0"); + } + }; + + const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { + setRemoveCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + } else { + changeVault(0, true); + setRemoveCollateralUSD("0"); + } + }; + + const onChangeMint = async (event: React.ChangeEvent) => { + setMintTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + let usd = toUSD(currentTcapPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentTcapPrice); + changeVault(r); + setMintUSD(usd.toString()); + } else { + changeVault(0, true); + setMintUSD("0"); + } + }; + + const onChangeBurn = async (event: React.ChangeEvent) => { + try { + setBurnTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + let usd = toUSD(currentTcapPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); + const r = await getRatio( + vaultCollateral, + currentPrice, + newDebt.toString(), + currentTcapPrice + ); + changeVault(r); + setBurnUSD(usd.toString()); + const currentBurnFee = await selectedVaultContract?.getFee( + ethers.utils.parseEther(event.target.value) + ); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + changeVault(0, true); + setBurnUSD("0"); + setBurnFee("0"); + } + } catch (error) { + console.error(error); + changeVault(0, true); + setBurnUSD("0"); + setBurnFee("0"); + } + }; + + const addCollateral = async () => { + if (addCollateralTxt) { + setBtnDisabled(true); + // fix decimals + const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); + try { + if (isGasAsset()) { + let tx; + if (selectedVault === "ETH") { + tx = await selectedVaultContract?.addCollateralETH({ + value: amount, + }); + } else { + tx = await selectedVaultContract?.addCollateralMATIC({ + value: amount, + }); + } + notifyUser(tx, refresh); + } else { + const tx = await selectedVaultContract?.addCollateral(amount); + notifyUser(tx, refresh); + } + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("errors.no-funds")); + } + } + setBtnDisabled(false); + setAddCollateralTxt(""); + setAddCollateralUSD("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const maxAddCollateral = async (e: React.MouseEvent) => { + e.preventDefault(); + let balance = "0"; + if (selectedVault === "ETH") { + const provider = getDefaultProvider(currentNetwork.chainId, currentNetwork.name); + balance = ethers.utils.formatEther(await provider.getBalance(address)); + } else if (selectedCollateralContract) { + const value = BigNumber.from(await selectedCollateralContract.balanceOf(address)); + balance = ethers.utils.formatUnits(value, selectedVaultDecimals); + } + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + setAddCollateralTxt(balance); + let usd = toUSD(currentPrice, balance); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(balance) + parseFloat(vaultCollateral); + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); + changeVault(r); + setAddCollateralUSD(usd.toString()); + }; + + const removeCollateral = async () => { + if (removeCollateralTxt) { + const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); + setBtnDisabled(true); + try { + if (isGasAsset()) { + let tx; + if (selectedVault === "ETH") { + tx = await selectedVaultContract?.removeCollateralETH(amount); + } else { + tx = await selectedVaultContract?.removeCollateralMATIC(amount); + } + notifyUser(tx, refresh); + } else { + const tx = await selectedVaultContract?.removeCollateral(amount); + notifyUser(tx, refresh); + } + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.tran-rejected")); + } + } + setBtnDisabled(false); + setRemoveCollateralTxt(""); + setRemoveCollateralUSD("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const safeRemoveCollateral = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + let collateralToRemove = await getSafeRemoveCollateral( + minRatio, + vaultCollateral, + currentPrice, + currentTcapPrice, + vaultDebt, + isHardMode() + ); + if (selectedVaultDecimals === 8) { + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); + } + setRemoveCollateralTxt(collateralToRemove.toString()); + let usd = toUSD(currentPrice, collateralToRemove.toString()); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - collateralToRemove; + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + }; + + const mintTCAP = async () => { + if (mintTxt) { + if (isMinRequiredTcap(parseFloat(mintTxt), true)) { + setBtnDisabled(true); + try { + const amount = ethers.utils.parseEther(mintTxt); + const tx = await selectedVaultContract?.mint(amount); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.no-collateral")); + } + } + setBtnDisabled(false); + setMintTxt(""); + setMintUSD("0"); + } else { + errorNotification(t("vault.errors.min-tcap")); + } + } else { + errorNotification(t("errors.empty")); + } + }; + + const safeMintTCAP = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + const safeMint = await getSafeMint( + minRatio, + vaultCollateral, + currentPrice, + currentTcapPrice, + vaultDebt, + isHardMode() + ); + setMintTxt(safeMint.toString()); + let usd = toUSD(currentTcapPrice, safeMint.toString()); + if (!usd) { + usd = 0; + } + const newDebt = safeMint + parseFloat(vaultDebt); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentTcapPrice); + changeVault(r); + setMintUSD(usd.toString()); + }; + + const burnTCAP = async () => { + if (burnTxt) { + if (isMinRequiredTcap(parseFloat(burnTxt), false)) { + const amount = ethers.utils.parseEther(burnTxt); + setBtnDisabled(true); + try { + const currentBurnFee = await selectedVaultContract?.getFee(amount); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + const tx = await selectedVaultContract?.burn(amount, { value: increasedFee }); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.burn-too-high")); + } + } + setBtnDisabled(false); + setBurnTxt(""); + setBurnUSD("0"); + setBurnFee("0"); + } else { + errorNotification(t("vault.errors.min-tcap2")); + } + } else { + errorNotification(t("errors.empty")); + } + }; + + const maxBurnTCAP = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + const currentBalanceCall = await tokens.tcapTokenRead?.balanceOf(address); + const currentVaultDebtCall = await selectedVaultRead?.vaults(selectedVaultId); + + // @ts-ignore + const [currentBalance, currentVault] = await signer.ethcallProvider?.all([ + currentBalanceCall, + currentVaultDebtCall, + ]); + + let balanceFormat = "0"; + let balance; + if (currentBalance.lt(currentVault.Debt)) { + balanceFormat = ethers.utils.formatEther(currentBalance); + balance = currentBalance; + } else { + balanceFormat = vaultDebt; + balance = currentVault.Debt; + } + setBurnTxt(balanceFormat); + let usd = toUSD(currentTcapPrice, balanceFormat); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(balanceFormat) - parseFloat(balanceFormat); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentTcapPrice); + changeVault(r); + setBurnUSD(usd.toString()); + + if (balanceFormat !== "0") { + const currentBurnFee = await selectedVaultContract?.getFee(balance); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + setBurnFee("0"); + } + }; + + const action = async () => { + if (selectedVaultId === "0") { + setBtnDisabled(true); + try { + const tx = await selectedVaultContract?.createVault(); + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification(t("errors.tran-rejected")); + } + } + setBtnDisabled(false); + } else { + setBtnDisabled(true); + try { + const amount = approveValue; + const tx = await selectedCollateralContract?.approve( + selectedVaultContract?.address, + amount + ); + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification(t("errors.tran-rejected")); + } + } + setBtnDisabled(false); + } + }; + + const handleTokenChange = async (value: string) => { + setIsApproved(false); + setTokenBalance("0"); + setTokenBalanceUSD("0"); + setSelectedVault(value); + // Clean form + setAddCollateralTxt(""); + setAddCollateralUSD("0"); + setRemoveCollateralTxt(""); + setRemoveCollateralUSD("0"); + setMintTxt(""); + setMintUSD("0"); + setBurnTxt(""); + setBurnUSD("0"); + setBurnFee("0"); + // Load values + history?.push(`/vault/${value}`); + await refetch(); + }; + + useEffect(() => { + async function load() { + let vOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK", "WBTC"]; + if (isHardMode()) { + vOptions = ["ETH", "WETH", "DAI", "USDC"]; + } + if (isOptimism(currentNetwork.chainId) && !isHardMode()) { + vOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; + } + if (isPolygon(currentNetwork.chainId) && !isHardMode()) { + vOptions = ["MATIC", "DAI", "WBTC"]; + } + setVaultOptions(vOptions); + // TODO : if stuck at pending do something + if (networkStatus === NetworkStatus.ready || networkStatus === NetworkStatus.error) { + setIsLoading(false); + } + } + load(); + // eslint-disable-next-line + }, [address, data]); + + if (isLoading) { + return ( +
+ +
+ ); + } + + const CollateralDropdown = () => ( +
+
Collateral:
+ handleTokenChange(eventKey || "ETH")}> + +
+ {selectedVault.toUpperCase()} +
+
+ + {vaultOptions.map((item) => ( + + {item} + + ))} + +
+
+ ); + + const CollateralBalance = () => ( +
+
+ {(() => { + switch (selectedVault) { + case "DAI": + return ; + case "AAVE": + return ; + case "LINK": + return ; + case "UNI": + return ; + case "SNX": + return ; + case "MATIC": + return ; + case "WBTC": + return ; + case "USDC": + return ; + default: + return ; + } + })()} +

+ +

+
+

+ 1000 ? 0 : 2} + /> +

+
+ ); + + const CollateralBalance2 = () => ( +
+
+ {(() => { + switch (selectedVault) { + case "DAI": + return ; + case "AAVE": + return ; + case "LINK": + return ; + case "UNI": + return ; + case "SNX": + return ; + case "MATIC": + return ; + case "WBTC": + return ; + case "USDC": + return ; + default: + return ; + } + })()} +

+ +

+ / +
+ 1000 ? 0 : 2} + /> +
+ ); + + /* if (loadingMode) { + return ; + } */ + + return ( + <> +
+ + {radios.map((radio, idx) => ( + handleRadioBtnChange(e.currentTarget.value)} + > + {radio.name} + + ))} + + {isHardMode() && ( + + {t("vault.hard-mode-info")}
+ {t("vault.hard-mode-info2")} + + } + > + +
+ )} +
+ {loadingMode ? ( +
+ +
+ ) : ( + <> + {isApproved ? ( + <> +
+
+ + + + + +
+

{t("vault.balance-title", { vault: selectedVault })}

+ +
+
+
+ + +
+

{t("vault.ratio-title")}

{" "} + + {t("vault.ratio-warning", { minRatio })} + + } + > + + +
+
+

+ +

+
+

{vaultStatus.toUpperCase()}

+
+
+
+
+
+
+ +
+
+

{t("vault.debt.title")}

+
+
+ +

+ +

+
+

+ 1000 ? 0 : 2} + /> +

+
+
+ +
+ + {t("vault.debt.mint")} + + + {t("max-safe")} + + + + + + + + + + + + + + {t("vault.debt.burn")} + + + {t("max")} + + + + + + + + + + + + + {t("vault.debt.fee")}:{" "} + {" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} + + + +
+
+
+
+
+ + ) : ( +
+ + + + + + +
{title}
+

{text}

+ +
+
+
+ )} + + )} + + ); +}; + +export default Mint; diff --git a/src/components/Vault/Mint2.tsx b/src/components/Vault/Mint2.tsx new file mode 100644 index 0000000..ba5c779 --- /dev/null +++ b/src/components/Vault/Mint2.tsx @@ -0,0 +1,1593 @@ +import React, { useState, useEffect, useContext } from "react"; +import Button from "react-bootstrap/esm/Button"; +import ButtonGroup from "react-bootstrap/esm/ButtonGroup"; +import Card from "react-bootstrap/esm/Card"; +import Dropdown from "react-bootstrap/Dropdown"; +import Form from "react-bootstrap/esm/Form"; +import InputGroup from "react-bootstrap/esm/InputGroup"; +import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; +import ToggleButton from "react-bootstrap/esm/ToggleButton"; +import Tooltip from "react-bootstrap/esm/Tooltip"; +import { Contract } from "ethers-multicall"; +import { ethers, BigNumber } from "ethers"; +import NumberFormat from "react-number-format"; +import { useRouteMatch, useHistory } from "react-router-dom"; +import { useQuery, gql, NetworkStatus } from "@apollo/client"; +import NetworkContext from "../../state/NetworkContext"; +import OraclesContext from "../../state/OraclesContext"; +import TokensContext from "../../state/TokensContext"; +import VaultsContext from "../../state/VaultsContext"; +import HardVaultsContext from "../../state/HardVaultsContext"; +import SignerContext from "../../state/SignerContext"; +import "../../styles/mint2.scss"; +import { ReactComponent as ETHIconSmall } from "../../assets/images/vault/eth.svg"; +import { ReactComponent as DAIIconSmall } from "../../assets/images/vault/dai.svg"; +import { ReactComponent as AAVEIconSmall } from "../../assets/images/vault/aave.svg"; +import { ReactComponent as LINKIconSmall } from "../../assets/images/vault/chainlink.svg"; +import { ReactComponent as UNIIconSmall } from "../../assets/images/vault/uni.svg"; +import { ReactComponent as SNXIconSmall } from "../../assets/images/vault/snx2.svg"; +import { ReactComponent as POLYGONIconSmall } from "../../assets/images/vault/polygon.svg"; +import { ReactComponent as WBTCIconSmall } from "../../assets/images/vault/bitcoin.svg"; +import { ReactComponent as USDCIconSmall } from "../../assets/images/vault/usdc.svg"; +import { ReactComponent as RatioIcon } from "../../assets/images/vault/ratio.svg"; +import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; +import { + notifyUser, + toUSD, + errorNotification, + getDefaultProvider, + isInLayer1, + isPolygon, + isOptimism, + getRatio, + getSafeRemoveCollateral, + getSafeMint, + isUndefined, +} from "../../utils/utils"; +import Loading from "../Loading"; +import { FEATURES, NETWORKS } from "../../utils/constants"; + +type props = { + address: string; + t: any; +}; + +// TODO: Vault doesn't show if approve is 0 even if there is data in the vault + +const Mint2 = ({ address, t }: props) => { + const currentNetwork = useContext(NetworkContext); + const oracles = useContext(OraclesContext); + const tokens = useContext(TokensContext); + const vaults = useContext(VaultsContext); + const hardVaults = useContext(HardVaultsContext); + const signer = useContext(SignerContext); + const [vaultMode, setVaultMode] = useState("hard"); + const [loadingMode, setLoadingMode] = useState(false); + const radios = [ + { name: "Regular Mode", value: "normal" }, + { name: "Hard Mode", value: "hard" }, + ]; + let currency = !isPolygon(currentNetwork.chainId) ? "ETH" : "MATIC"; + const match = useRouteMatch("/vault/:currency"); + const history = useHistory(); + const isHardMode = () => vaultMode === "hard"; + + // @ts-ignore + switch (match?.params?.currency?.toLowerCase()) { + case "eth": + currency = "ETH"; + if (FEATURES.POLYGON && isPolygon(currentNetwork.chainId)) { + history?.push(`/vault/MATIC`); + currency = "MATIC"; + } + break; + case "weth": + currency = "WETH"; + if (FEATURES.POLYGON && isPolygon(currentNetwork.chainId)) { + history?.push(`/vault/MATIC`); + currency = "MATIC"; + } + break; + case "wbtc": + currency = "WBTC"; + if (isOptimism(currentNetwork.chainId) || isHardMode()) { + history?.push(`/vault/ETH`); + currency = "ETH"; + } + break; + case "dai": + currency = "DAI"; + break; + case "aave": + if (isInLayer1(currentNetwork.chainId) && !isHardMode()) { + currency = "AAVE"; + } else { + currency = "ETH"; + history?.push(`/vault/ETH`); + } + break; + case "usdc": + if (isInLayer1(currentNetwork.chainId) && isHardMode()) { + currency = "USDC"; + } else { + currency = "ETH"; + history?.push(`/vault/ETH`); + } + break; + case "link": + if (!isPolygon(currentNetwork.chainId) && !isHardMode()) { + currency = "LINK"; + } else { + currency = "ETH"; + history?.push(`/vault/ETH`); + } + break; + case "matic": + currency = "MATIC"; + if ((!FEATURES.POLYGON && !isPolygon(currentNetwork.chainId)) || isHardMode()) { + history?.push(`/vault/ETH`); + currency = "ETH"; + } + setVaultMode("normal"); + break; + default: + currency = FEATURES.POLYGON && isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"; + break; + } + + // Actions + const [title, setTitle] = useState(t("vault.create")); + const [text, setText] = useState(t("vault.create-text")); + const [isApproved, setIsApproved] = useState(false); + const [isLoading, setIsLoading] = useState(true); + const [btnDisabled, setBtnDisabled] = useState(false); + + // Vault Data + const [vaultOptions, setVaultOptions] = useState>([]); + const [selectedVaultId, setSelectedVaultId] = useState("0"); + const [vaultDebt, setVaultDebt] = useState("0"); + const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); + const [vaultCollateral, setVaultCollateral] = useState("0"); + const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); + const [vaultRatio, setVaultRatio] = useState("0"); + const [tempRatio, setTempRatio] = useState(""); + const [minRatio, setMinRatio] = useState("0"); + const [selectedVault, setSelectedVault] = useState(currency); + const [selectedVaultContract, setSelectedVaultContract] = useState(); + const [selectedVaultRead, setSelectedVaultRead] = useState(); + const [selectedOracleRead, setSelectedOracleRead] = useState(); + const [selectedCollateralContract, setSelectedCollateralContract] = useState(); + const [selectedVaultDecimals, setSelectedVaultDecimals] = useState(18); + + // General Data + const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); + const [tokenBalance, setTokenBalance] = useState("0"); + const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); + + // Inputs + const [addCollateralTxt, setAddCollateralTxt] = useState("0"); + const [addCollateralUSD, setAddCollateralUSD] = useState("0"); + const [removeCollateralTxt, setRemoveCollateralTxt] = useState("0"); + const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); + const [mintTxt, setMintTxt] = useState("0"); + const [mintUSD, setMintUSD] = useState("0"); + const [burnTxt, setBurnTxt] = useState("0"); + const [burnUSD, setBurnUSD] = useState("0"); + const [burnFee, setBurnFee] = useState("0"); + const [vaultStatus, setVaultStatus] = useState(""); + + // Infinite Approval + const approveValue = BigNumber.from("1157920892373161954235709850086879078532699"); + + const USER_VAULT = gql` + query getVault($owner: String!) { + vaults(where: { owner: $owner }) { + id + vaultId + owner + collateral + debt + address + owner + hardVault + } + _meta { + block { + number + hash + } + hasIndexingErrors + } + } + `; + + const tcapPrice = async () => { + const currentTCAPPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentTCAPPrice] = await signer.ethcallProvider?.all([currentTCAPPriceCall]); + return currentTCAPPrice; + }; + + const collateralPrice = async () => { + const collateralPriceCall = await selectedOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentCollateralPrice] = await signer.ethcallProvider?.all([collateralPriceCall]); + return currentCollateralPrice; + }; + + const validVaults = (): boolean => { + let valid = + !isUndefined(oracles.daiOracle) && + !isUndefined(oracles.tcapOracle) && + !isUndefined(oracles.daiOracleRead) && + !isUndefined(vaults.daiVault) && + !isUndefined(tokens.daiTokenRead); + + if (isInLayer1(currentNetwork.chainId)) { + valid = + valid && + !isUndefined(oracles.wethOracle) && + !isUndefined(oracles.aaveOracle) && + !isUndefined(oracles.linkOracle) && + !isUndefined(oracles.wethOracleRead) && + !isUndefined(oracles.aaveOracleRead) && + !isUndefined(oracles.linkOracleRead) && + !isUndefined(vaults.wethVault) && + !isUndefined(vaults.aaveVault) && + !isUndefined(vaults.linkVault) && + !isUndefined(tokens.aaveToken) && + !isUndefined(tokens.linkToken) && + !isUndefined(tokens.wethTokenRead) && + !isUndefined(tokens.aaveTokenRead) && + !isUndefined(tokens.linkTokenRead); + } + if (isOptimism(currentNetwork.chainId)) { + valid = + valid && + !isUndefined(oracles.linkOracle) && + !isUndefined(oracles.snxOracle) && + !isUndefined(oracles.uniOracle) && + !isUndefined(oracles.linkOracleRead) && + !isUndefined(oracles.snxOracleRead) && + !isUndefined(oracles.uniOracleRead) && + !isUndefined(vaults.linkVault) && + !isUndefined(vaults.snxVault) && + !isUndefined(vaults.uniVault) && + !isUndefined(tokens.linkToken) && + !isUndefined(tokens.snxToken) && + !isUndefined(tokens.uniToken) && + !isUndefined(tokens.linkTokenRead) && + !isUndefined(tokens.snxTokenRead) && + !isUndefined(tokens.uniTokenRead); + } + if (isPolygon(currentNetwork.chainId)) { + valid = + valid && + !isUndefined(oracles.maticOracle) && + !isUndefined(oracles.maticOracleRead) && + !isUndefined(oracles.wbtcOracle) && + !isUndefined(oracles.wbtcOracleRead) && + !isUndefined(vaults.maticVault) && + !isUndefined(vaults.maticVaultRead) && + !isUndefined(vaults.wbtcVault) && + !isUndefined(vaults.wbtcVaultRead) && + !isUndefined(tokens.maticToken) && + !isUndefined(tokens.maticTokenRead) && + !isUndefined(tokens.wbtcToken) && + !isUndefined(tokens.maticTokenRead); + } + + return valid; + }; + + const isGasAsset = () => + (!isPolygon(currentNetwork.chainId) && selectedVault === "ETH") || + (isPolygon(currentNetwork.chainId) && selectedVault === "MATIC"); + + async function loadVault(vaultType: string, vaultData: any) { + if (signer.signer && validVaults() && vaultData) { + let currentVault: any; + let currentVaultRead: any; + let currentToken; + let currentOracleRead; + let currentTokenRead; + let balance; + const provider = getDefaultProvider( + currentNetwork.chainId || NETWORKS.mainnet.chainId, + currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.rinkeby.name + ); + switch (vaultType) { + case "ETH": + currentVault = !isHardMode() ? vaults.wethVault : hardVaults.wethVault; + currentVaultRead = !isHardMode() ? vaults.wethVaultRead : hardVaults.wethVaultRead; + currentToken = tokens.wethToken; + currentOracleRead = oracles.wethOracleRead; + currentTokenRead = tokens.wethTokenRead; + balance = await provider.getBalance(address); + break; + case "WETH": + currentVault = !isHardMode() ? vaults.wethVault : hardVaults.wethVault; + currentVaultRead = !isHardMode() ? vaults.wethVaultRead : hardVaults.wethVaultRead; + currentToken = tokens.wethToken; + currentOracleRead = oracles.wethOracleRead; + currentTokenRead = tokens.wethTokenRead; + break; + case "DAI": + currentVault = !isHardMode() ? vaults.daiVault : hardVaults.daiVault; + currentVaultRead = !isHardMode() ? vaults.daiVaultRead : hardVaults.daiVaultRead; + currentToken = tokens.daiToken; + currentOracleRead = oracles.daiOracleRead; + currentTokenRead = tokens.daiTokenRead; + break; + case "AAVE": + currentVault = vaults.aaveVault; + currentVaultRead = vaults.aaveVaultRead; + currentToken = tokens.aaveToken; + currentOracleRead = oracles.aaveOracleRead; + currentTokenRead = tokens.aaveTokenRead; + break; + case "LINK": + currentVault = vaults.linkVault; + currentVaultRead = vaults.linkVaultRead; + currentToken = tokens.linkToken; + currentOracleRead = oracles.linkOracleRead; + currentTokenRead = tokens.linkTokenRead; + break; + case "SNX": + currentVault = vaults.snxVault; + currentVaultRead = vaults.snxVaultRead; + currentToken = tokens.snxToken; + currentOracleRead = oracles.snxOracleRead; + currentTokenRead = tokens.snxTokenRead; + break; + case "UNI": + currentVault = vaults.uniVault; + currentVaultRead = vaults.uniVaultRead; + currentToken = tokens.uniToken; + currentOracleRead = oracles.uniOracleRead; + currentTokenRead = tokens.uniTokenRead; + break; + case "MATIC": + currentVault = vaults.maticVault; + currentVaultRead = vaults.maticVaultRead; + currentToken = tokens.maticToken; + currentOracleRead = oracles.maticOracleRead; + currentTokenRead = tokens.maticTokenRead; + // balance = await provider.getBalance(address); + break; + case "WBTC": + currentVault = vaults.wbtcVault; + currentVaultRead = vaults.wbtcVaultRead; + currentToken = tokens.wbtcToken; + currentOracleRead = oracles.wbtcOracleRead; + currentTokenRead = tokens.wbtcTokenRead; + // balance = await provider.getBalance(address); + break; + case "USDC": + currentVault = hardVaults.usdcVault; + currentVaultRead = hardVaults.usdcVaultRead; + currentToken = tokens.usdcToken; + currentOracleRead = oracles.usdcOracleRead; + currentTokenRead = tokens.usdcTokenRead; + // balance = await provider.getBalance(address); + break; + default: + currentVault = vaults.wethVault; + currentVaultRead = vaults.wethVaultRead; + currentToken = tokens.wethToken; + currentOracleRead = oracles.wethOracleRead; + currentTokenRead = tokens.wethTokenRead; + break; + } + setSelectedVaultContract(currentVault); + setSelectedCollateralContract(currentToken); + setSelectedVaultRead(currentVaultRead); + setSelectedOracleRead(currentOracleRead); + + let currentVaultData: any; + // Removed GRAPH + // if data is empty load vault data from contract + /* const graphBlock = vaultData._meta.block.number; + let currentBlock = await provider.getBlockNumber(); + currentBlock -= 10; + if ( + isInLayer1(currentNetwork.chainId) && + vaultData.vaults.length > 0 && + !vaultData._meta.hasIndexingErrors && + graphBlock >= currentBlock + ) { + await vaultData.vaults.forEach((v: any) => { + if (v.address.toLowerCase() === currentVault.address.toLowerCase()) { + currentVaultData = v; + } + }); + } else { + const vaultID = await currentVault.userToVault(address); + if (!vaultID.eq(0)) { + const vault = await currentVault.vaults(vaultID); + currentVaultData = { + vaultId: vaultID, + collateral: vault.Collateral, + debt: vault.Debt, + }; + } + } */ + const vaultID = await currentVault.userToVault(address); + if (!vaultID.eq(0)) { + const vault = await currentVault.vaults(vaultID); + currentVaultData = { + vaultId: vaultID, + collateral: vault.Collateral, + debt: vault.Debt, + }; + } + + if (vaultType !== "ETH") { + // @ts-ignore + balance = await currentToken.balanceOf(address); + } + + let decimals = 18; + let currentPrice; + + if (currentVaultData) { + const { vaultId, collateral, debt } = currentVaultData; + // @ts-ignore + const allowanceCall = await currentTokenRead.allowance(address, currentVault.address); + const currentRatioCall = await currentVaultRead.getVaultRatio(vaultId); + + // @ts-ignore + const currentTCAPPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + // @ts-ignore + const decimalsCall = await currentTokenRead.decimals(); + // @ts-ignore + const currentPriceCall = await currentOracleRead.getLatestAnswer(); + const currentMinRatioCall = await currentVaultRead.ratio(); + + // @ts-ignore + const [ + allowance, + currentRatio, + currentTCAPPrice, + decimalsVal, + currentPriceVal, + currentMinRatio, + ] = await signer.ethcallProvider?.all([ + allowanceCall, + currentRatioCall, + currentTCAPPriceCall, + decimalsCall, + currentPriceCall, + currentMinRatioCall, + ]); + + decimals = decimalsVal; + currentPrice = ethers.utils.formatEther(currentPriceVal.mul(10000000000)); + setSelectedVaultId(vaultId); + + if (!allowance.isZero() || vaultType === "ETH") { + const safeValue = isHardMode() ? 20 : 50; + const warnValue = isHardMode() ? 10 : 30; + + setMinRatio(currentMinRatio.toString()); + setIsApproved(true); + setVaultRatio(currentRatio.toString()); + if (currentRatio.toString() === "0") { + setVaultStatus("N/A"); + } else if ( + currentRatio.toString() >= + parseFloat(currentMinRatio.toString()) + safeValue + ) { + setVaultStatus("safe"); + } else if ( + currentRatio.toString() >= + parseFloat(currentMinRatio.toString()) + warnValue + ) { + setVaultStatus("warning"); + } else { + setVaultStatus("danger"); + } + + const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); + + // const parsedCollateral = ethers.utils.formatEther(collateral); + setVaultCollateral(parsedCollateral); + const usdCollateral = toUSD(currentPrice, parsedCollateral); + setVaultCollateralUSD(usdCollateral.toString()); + + const currentTCAPPriceFormat = ethers.utils.formatEther(currentTCAPPrice); + const parsedDebt = ethers.utils.formatEther(debt); + setVaultDebt(parsedDebt); + const usdTCAP = toUSD(currentTCAPPriceFormat, parsedDebt); + setVaultDebtUSD(usdTCAP.toString()); + } else { + setText(t("vault.approve-text")); + setTitle(t("vault.approve")); + setIsApproved(false); + } + } else { + // @ts-ignore + const decimalsCall = await currentTokenRead.decimals(); + // @ts-ignore + const currentPriceCall = await currentOracleRead.getLatestAnswer(); + // @ts-ignore + const [decimalsVal, currentPriceVal] = await signer.ethcallProvider?.all([ + decimalsCall, + currentPriceCall, + ]); + decimals = decimalsVal; + currentPrice = ethers.utils.formatEther(currentPriceVal.mul(10000000000)); + + setSelectedVaultId("0"); + setText(t("vault.create-text")); + setTitle(t("vault.create")); + setIsApproved(false); + } + + setSelectedVaultDecimals(decimals); + const currentBalance = ethers.utils.formatUnits(balance, decimals); + if (parseFloat(currentBalance) < 0.09) { + setTokenBalanceDecimals(4); + } else { + setTokenBalanceDecimals(2); + } + setTokenBalance(currentBalance); + + const usdBalance = toUSD(currentPrice, currentBalance); + setTokenBalanceUSD(usdBalance.toString()); + setLoadingMode(false); + } + } + + const { data, error, refetch, networkStatus } = useQuery(USER_VAULT, { + variables: { owner: address }, + pollInterval: 200000, + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + onError: () => { + console.log(error); + }, + onCompleted: () => { + let vaultType = selectedVault; + if (isPolygon(currentNetwork.chainId) && vaultType === "ETH") { + vaultType = "MATIC"; + setSelectedVault("MATIC"); + } + loadVault(vaultType, data); + }, + }); + + const refresh = async () => { + try { + if (!isOptimism(currentNetwork.chainId)) { + await refetch(); + } else { + loadVault(selectedVault, data); + } + } catch (error) { + console.log(error); + // catch error in case the vault screen is changed + } + }; + + const resetFields = () => { + setBurnFee("0"); + setAddCollateralUSD("0"); + setAddCollateralTxt("0"); + setRemoveCollateralTxt("0"); + setRemoveCollateralUSD("0"); + setMintTxt("0"); + setMintUSD("0"); + setBurnUSD("0"); + setBurnTxt("0"); + }; + + const handleRadioBtnChange = async (value: string) => { + setLoadingMode(true); + setVaultMode(value); + setIsApproved(false); + setTokenBalance("0"); + setTokenBalanceUSD("0"); + setSelectedVault("ETH"); + + history?.push(`/vault/ETH`); + resetFields(); + await refetch(); + }; + + const changeVault = async (newRatio: number, reset = false) => { + const safeValue = isHardMode() ? 20 : 50; + const warnValue = isHardMode() ? 10 : 30; + let r = newRatio; + + if (reset) { + r = parseFloat(tempRatio); + setVaultRatio(tempRatio); + setTempRatio(""); + resetFields(); + } else { + if (tempRatio === "") { + setTempRatio(vaultRatio); + } + r = newRatio; + setVaultRatio(r.toString()); + } + + if (r === 0) { + setVaultStatus(t("vault.status.na")); + } else if (r >= parseFloat(minRatio) + safeValue) { + setVaultStatus(t("vault.status.safe")); + } else if (r >= parseFloat(minRatio) + warnValue) { + setVaultStatus(t("vault.status.warning")); + } else if (r >= parseFloat(minRatio)) { + setVaultStatus(t("vault.status.danger")); + } else { + setVaultRatio("0"); + setVaultStatus(t("vault.status.error")); + } + }; + + // forms + const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { + if (isHardMode()) { + const d = parseFloat(vaultDebt); + let newDebt = 0; + if (isMint) { + newDebt = amount + d; + } else { + newDebt = d - amount; + } + return newDebt >= 20 || newDebt === 0; + } + return true; + }; + + const onChangeAddCollateral = async (event: React.ChangeEvent) => { + setAddCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); + changeVault(r); + setAddCollateralUSD(usd.toString()); + } else { + changeVault(0, false); + setAddCollateralUSD("0"); + } + }; + + const onFocusAddCollateral = () => { + if (addCollateralTxt && parseFloat(addCollateralTxt) === 0) { + setAddCollateralTxt(""); + } + }; + + const onBlurAddCollateral = () => { + if (!addCollateralTxt) { + setAddCollateralTxt("0"); + } + }; + + const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { + setRemoveCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + } else { + changeVault(0, false); + setRemoveCollateralUSD("0"); + } + }; + + const onFocusRemoveCollateral = () => { + if (removeCollateralTxt && parseFloat(removeCollateralTxt) === 0) { + setRemoveCollateralTxt(""); + } + }; + + const onBlurRemoveCollateral = () => { + if (!removeCollateralTxt) { + setRemoveCollateralTxt("0"); + } + }; + + const onChangeMint = async (event: React.ChangeEvent) => { + setMintTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + let usd = toUSD(currentTcapPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentTcapPrice); + changeVault(r); + setMintUSD(usd.toString()); + } else { + changeVault(0, false); + setMintUSD("0"); + } + }; + + const onFocusMint = () => { + if (mintTxt && parseFloat(mintTxt) === 0) { + setMintTxt(""); + } + }; + + const onBlurMint = () => { + if (!mintTxt) { + setMintTxt("0"); + } + }; + + const onChangeBurn = async (event: React.ChangeEvent) => { + try { + setBurnTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + let usd = toUSD(currentTcapPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); + const r = await getRatio( + vaultCollateral, + currentPrice, + newDebt.toString(), + currentTcapPrice + ); + changeVault(r); + setBurnUSD(usd.toString()); + const currentBurnFee = await selectedVaultContract?.getFee( + ethers.utils.parseEther(event.target.value) + ); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + changeVault(0, false); + setBurnUSD("0"); + setBurnFee("0"); + } + } catch (error) { + console.error(error); + changeVault(0, true); + setBurnUSD("0"); + setBurnFee("0"); + } + }; + + const onFocusBurn = () => { + if (burnTxt && parseFloat(burnTxt) === 0) { + setBurnTxt(""); + } + }; + + const onBlurBurn = () => { + if (!burnTxt) { + setBurnTxt("0"); + } + }; + + const addCollateral = async () => { + if (addCollateralTxt && parseFloat(addCollateralTxt) > 0) { + setBtnDisabled(true); + // fix decimals + const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); + try { + if (isGasAsset()) { + let tx; + if (selectedVault === "ETH") { + tx = await selectedVaultContract?.addCollateralETH({ + value: amount, + }); + } else { + tx = await selectedVaultContract?.addCollateralMATIC({ + value: amount, + }); + } + notifyUser(tx, refresh); + } else { + const tx = await selectedVaultContract?.addCollateral(amount); + notifyUser(tx, refresh); + } + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("errors.no-funds")); + } + } + setBtnDisabled(false); + setAddCollateralTxt("0"); + setAddCollateralUSD("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const maxAddCollateral = async (e: React.MouseEvent) => { + e.preventDefault(); + let balance = "0"; + if (selectedVault === "ETH") { + const provider = getDefaultProvider(currentNetwork.chainId, currentNetwork.name); + balance = ethers.utils.formatEther(await provider.getBalance(address)); + } else if (selectedCollateralContract) { + const value = BigNumber.from(await selectedCollateralContract.balanceOf(address)); + balance = ethers.utils.formatUnits(value, selectedVaultDecimals); + } + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + setAddCollateralTxt(balance); + let usd = toUSD(currentPrice, balance); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(balance) + parseFloat(vaultCollateral); + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); + changeVault(r); + setAddCollateralUSD(usd.toString()); + }; + + const removeCollateral = async () => { + if (removeCollateralTxt && parseFloat(removeCollateralTxt) > 0) { + const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); + setBtnDisabled(true); + try { + if (isGasAsset()) { + let tx; + if (selectedVault === "ETH") { + tx = await selectedVaultContract?.removeCollateralETH(amount); + } else { + tx = await selectedVaultContract?.removeCollateralMATIC(amount); + } + notifyUser(tx, refresh); + } else { + const tx = await selectedVaultContract?.removeCollateral(amount); + notifyUser(tx, refresh); + } + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.tran-rejected")); + } + } + setBtnDisabled(false); + setRemoveCollateralTxt("0"); + setRemoveCollateralUSD("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const safeRemoveCollateral = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + let collateralToRemove = await getSafeRemoveCollateral( + minRatio, + vaultCollateral, + currentPrice, + currentTcapPrice, + vaultDebt, + isHardMode() + ); + if (selectedVaultDecimals === 8) { + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); + } + setRemoveCollateralTxt(collateralToRemove.toString()); + let usd = toUSD(currentPrice, collateralToRemove.toString()); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - collateralToRemove; + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + }; + + const mintTCAP = async () => { + if (mintTxt && parseFloat(mintTxt) > 0) { + if (isMinRequiredTcap(parseFloat(mintTxt), true)) { + setBtnDisabled(true); + try { + const amount = ethers.utils.parseEther(mintTxt); + const tx = await selectedVaultContract?.mint(amount); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.no-collateral")); + } + } + setBtnDisabled(false); + setMintTxt("0"); + setMintUSD("0"); + } else { + errorNotification(t("vault.errors.min-tcap")); + } + } else { + errorNotification(t("errors.empty")); + } + }; + + const safeMintTCAP = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + const safeMint = await getSafeMint( + minRatio, + vaultCollateral, + currentPrice, + currentTcapPrice, + vaultDebt, + isHardMode() + ); + setMintTxt(safeMint.toString()); + let usd = toUSD(currentTcapPrice, safeMint.toString()); + if (!usd) { + usd = 0; + } + const newDebt = safeMint + parseFloat(vaultDebt); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentTcapPrice); + changeVault(r); + setMintUSD(usd.toString()); + }; + + const burnTCAP = async () => { + if (burnTxt && parseFloat(burnTxt) > 0) { + const amount = ethers.utils.parseEther(burnTxt); + setBtnDisabled(true); + try { + const currentBurnFee = await selectedVaultContract?.getFee(amount); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + const tx = await selectedVaultContract?.burn(amount, { value: increasedFee }); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.burn-too-high")); + } + } + setBtnDisabled(false); + setBurnTxt("0"); + setBurnUSD("0"); + setBurnFee("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const maxBurnTCAP = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); + const currentBalanceCall = await tokens.tcapTokenRead?.balanceOf(address); + const currentVaultDebtCall = await selectedVaultRead?.vaults(selectedVaultId); + + // @ts-ignore + const [currentBalance, currentVault] = await signer.ethcallProvider?.all([ + currentBalanceCall, + currentVaultDebtCall, + ]); + + let balanceFormat = "0"; + let balance; + if (currentBalance.lt(currentVault.Debt)) { + balanceFormat = ethers.utils.formatEther(currentBalance); + balance = currentBalance; + } else { + balanceFormat = vaultDebt; + balance = currentVault.Debt; + } + setBurnTxt(balanceFormat); + let usd = toUSD(currentTcapPrice, balanceFormat); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(balanceFormat) - parseFloat(balanceFormat); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentTcapPrice); + changeVault(r); + setBurnUSD(usd.toString()); + + if (balanceFormat !== "0") { + const currentBurnFee = await selectedVaultContract?.getFee(balance); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + setBurnFee("0"); + } + }; + + const action = async () => { + if (selectedVaultId === "0") { + setBtnDisabled(true); + try { + const tx = await selectedVaultContract?.createVault(); + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification(t("errors.tran-rejected")); + } + } + setBtnDisabled(false); + } else { + setBtnDisabled(true); + try { + const amount = approveValue; + const tx = await selectedCollateralContract?.approve( + selectedVaultContract?.address, + amount + ); + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification(t("errors.tran-rejected")); + } + } + setBtnDisabled(false); + } + }; + + const handleTokenChange = async (value: string) => { + setIsApproved(false); + setTokenBalance("0"); + setTokenBalanceUSD("0"); + setSelectedVault(value); + // Clean form + setAddCollateralTxt(""); + setAddCollateralUSD("0"); + setRemoveCollateralTxt(""); + setRemoveCollateralUSD("0"); + setMintTxt(""); + setMintUSD("0"); + setBurnTxt(""); + setBurnUSD("0"); + setBurnFee("0"); + // Load values + history?.push(`/vault/${value}`); + await refetch(); + }; + + useEffect(() => { + async function load() { + let vOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK", "WBTC"]; + if (isHardMode()) { + vOptions = ["ETH", "WETH", "DAI", "USDC"]; + } + if (isOptimism(currentNetwork.chainId) && !isHardMode()) { + vOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; + } + if (isPolygon(currentNetwork.chainId) && !isHardMode()) { + vOptions = ["MATIC", "DAI", "WBTC"]; + } + setVaultOptions(vOptions); + // TODO : if stuck at pending do something + if (networkStatus === NetworkStatus.ready || networkStatus === NetworkStatus.error) { + setIsLoading(false); + } + } + load(); + // eslint-disable-next-line + }, [address, data]); + + if (isLoading) { + return ( +
+ +
+ ); + } + + const CollateralDropdown = () => ( +
+
Collateral:
+ handleTokenChange(eventKey || "ETH")}> + +
+ {selectedVault.toUpperCase()} +
+
+ + {vaultOptions.map((item) => ( + + {item} + + ))} + +
+
+ ); + + const CollateralBalance = () => ( +
+
+ {(() => { + switch (selectedVault) { + case "DAI": + return ; + case "AAVE": + return ; + case "LINK": + return ; + case "UNI": + return ; + case "SNX": + return ; + case "MATIC": + return ; + case "WBTC": + return ; + case "USDC": + return ; + default: + return ; + } + })()} +

+ +

+
+

+ 1000 ? 0 : 2} + /> +

+
+ ); + + const CollateralBalance2 = () => ( +
+
+ {(() => { + switch (selectedVault) { + case "DAI": + return ; + case "AAVE": + return ; + case "LINK": + return ; + case "UNI": + return ; + case "SNX": + return ; + case "MATIC": + return ; + case "WBTC": + return ; + case "USDC": + return ; + default: + return ; + } + })()} +

+ +

+ / +
+ 1000 ? 0 : 2} + /> +
+ ); + + /* if (loadingMode) { + return ; + } */ + + return ( + <> +
+ + {radios.map((radio, idx) => ( + handleRadioBtnChange(e.currentTarget.value)} + > + {radio.name} + + ))} + + {isHardMode() && ( + + {t("vault.hard-mode-info")}
+ {t("vault.hard-mode-info2")} + + } + > + +
+ )} +
+ {loadingMode ? ( +
+ +
+ ) : ( + <> + {isApproved ? ( + <> +
+
+ + + + + +
+

{t("vault.balance-title", { vault: selectedVault })}

+ +
+
+
+ + +
+

{t("vault.ratio-title")}

{" "} + + {t("vault.ratio-warning", { minRatio })} + + } + > + + +
+
+

+ +

+
+

{vaultStatus.toUpperCase()}

+
+
+
+
+
+ +
+

{t("vault.collateral.title")}

+
+
+ {(() => { + switch (selectedVault) { + case "DAI": + return ; + case "AAVE": + return ; + case "LINK": + return ; + case "SNX": + return ; + case "UNI": + return ; + case "MATIC": + return ; + case "WBTC": + return ; + case "USDC": + return ; + default: + return ; + } + })()} +

+ +

+
+

+ 1000 ? 0 : 2} + /> +

+
+
+
+ + Add {selectedVault} + + + {t("max")} + + + + + + + + + + + + + + Remove {selectedVault} + + + {t("max-safe")} + + + + + + + + + + + + + +
+
+
+ +
+

{t("vault.debt.title")}

+
+
+ +

+ +

+
+

+ 1000 ? 0 : 2} + /> +

+
+
+
+ + {t("vault.debt.mint")} + + + {t("max-safe")} + + + + + + + + + + + + + + {t("vault.debt.burn")} + + + {t("max")} + + + + + + + + + + + + + {t("vault.debt.fee")}:{" "} + {" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} + + + +
+
+
+ + ) : ( +
+ + + + + + +
{title}
+

{text}

+ +
+
+
+ )} + + )} + + ); +}; + +export default Mint2; diff --git a/src/components/Vault/Vault.tsx b/src/components/Vault/Vault.tsx index 100daab..685830e 100644 --- a/src/components/Vault/Vault.tsx +++ b/src/components/Vault/Vault.tsx @@ -3,10 +3,10 @@ import Button from "react-bootstrap/esm/Button"; import { useTranslation } from "react-i18next"; import { Web3ModalContext } from "../../state/Web3ModalContext"; import SignerContext from "../../state/SignerContext"; -import "../../styles/vault.scss"; +import "../../styles/mint2.scss"; import Loading from "../Loading"; -import Details from "./Details"; +import Mint2 from "./Mint2"; export const Vault = () => { const { t } = useTranslation(); @@ -53,7 +53,7 @@ export const Vault = () => {
) : ( -
+ )}
diff --git a/src/components/Welcome/Protocol.tsx b/src/components/Welcome/Protocol.tsx index c36ae0e..38a0292 100644 --- a/src/components/Welcome/Protocol.tsx +++ b/src/components/Welcome/Protocol.tsx @@ -9,7 +9,7 @@ import TokensContext from "../../state/TokensContext"; import SignerContext from "../../state/SignerContext"; import OraclesContext from "../../state/OraclesContext"; import { ReactComponent as StakeIcon } from "../../assets/images/graph/stake.svg"; -import { ReactComponent as H24Icon } from "../../assets/images/graph/24h.svg"; +import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; import { ReactComponent as WETHIcon } from "../../assets/images/graph/weth.svg"; import { ReactComponent as DAIIcon } from "../../assets/images/graph/DAI.svg"; import { ReactComponent as AAVEIcon } from "../../assets/images/graph/aave.svg"; @@ -334,7 +334,7 @@ const Protocol = ({ data }: props) => {
- +
{t("graph.total-supply")}
diff --git a/src/components/Welcome/Welcome.tsx b/src/components/Welcome/Welcome.tsx deleted file mode 100644 index 4e5808e..0000000 --- a/src/components/Welcome/Welcome.tsx +++ /dev/null @@ -1,339 +0,0 @@ -import React, { useContext, useEffect, useState } from "react"; -import Card from "react-bootstrap/esm/Card"; -import Button from "react-bootstrap/esm/Button"; -import Col from "react-bootstrap/esm/Col"; -import Row from "react-bootstrap/esm/Row"; -import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; -import Tooltip from "react-bootstrap/esm/Tooltip"; -import { useTranslation } from "react-i18next"; -import { ethers } from "ethers"; -import NumberFormat from "react-number-format"; -import { useHistory } from "react-router-dom"; -import NetworkContext from "../../state/NetworkContext"; -import SignerContext from "../../state/SignerContext"; -import TokensContext from "../../state/TokensContext"; -import OraclesContext from "../../state/OraclesContext"; -import { Web3ModalContext } from "../../state/Web3ModalContext"; -import { makeShortAddress, getPriceInUSDFromPair, getENS, isInLayer1 } from "../../utils/utils"; -import "../../styles/welcome.scss"; -import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; -import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; -import { NETWORKS } from "../../utils/constants"; -import Loading from "../Loading"; - -type props = { - signerAddress: string; - loadingContracts: boolean; -}; - -const Welcome = ({ signerAddress, loadingContracts }: props) => { - const { t } = useTranslation(); - const [address, setAddress] = useState(""); - const [currentAddress, setCurrentAddress] = useState(""); - const [tcapBalance, setTcapBalance] = useState("0.0"); - const [tcapUSDBalance, setTcapUSDBalance] = useState("0.0"); - const [totalPrice, setTotalPrice] = useState("0.0"); - const [tcapPrice, setTcapPrice] = useState("0.0"); - const [ctxUSDBalance, setCtxUSDBalance] = useState("0.0"); - const [ctxBalance, setCtxBalance] = useState("0.0"); - const [isLoading, setIsLoading] = useState(true); - const currentNetwork = useContext(NetworkContext); - const signer = useContext(SignerContext); - const web3Modal = useContext(Web3ModalContext); - const history = useHistory(); - const tokens = useContext(TokensContext); - const oracles = useContext(OraclesContext); - - useEffect(() => { - const loadAddress = async () => { - if (oracles.tcapOracleRead) { - const currentTcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - // @ts-ignore - const [currentTcapPrice] = await signer.ethcallProvider?.all([currentTcapPriceCall]); - const TotalTcapPrice = currentTcapPrice.mul(10000000000); - const tPrice = ethers.utils.formatEther(TotalTcapPrice.div(10000000000)); - setTotalPrice(ethers.utils.formatEther(TotalTcapPrice)); - setTcapPrice(tPrice); - - if ( - signer.signer && - tokens.tcapTokenRead && - signerAddress !== "" && - signerAddress !== currentAddress - ) { - const ens = await getENS(signerAddress); - if (ens) { - setAddress(ens); - } else { - setAddress(makeShortAddress(signerAddress)); - } - - const currentTcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(signerAddress); - // @ts-ignore - const [currentTcapBalance] = await signer.ethcallProvider?.all([currentTcapBalanceCall]); - const tcapString = ethers.utils.formatEther(currentTcapBalance); - setTcapBalance(tcapString); - const tcapUSD = parseFloat(tcapString) * parseFloat(tPrice); - setTcapUSDBalance(tcapUSD.toString()); - - if (isInLayer1(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(signerAddress); - const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); - // @ts-ignore - const [wethOraclePrice, currentCtxBalance, reservesCtxPool] = - await signer.ethcallProvider?.all([ - wethOraclePriceCall, - currentCtxBalanceCall, - reservesCtxPoolCall, - ]); - const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - const ctxString = ethers.utils.formatEther(currentCtxBalance); - setCtxBalance(ctxString); - const currentPriceCTX = await getPriceInUSDFromPair( - reservesCtxPool[0], - reservesCtxPool[1], - parseFloat(currentPriceETH) - ); - const ctxUSD = parseFloat(ctxString) * currentPriceCTX; - setCtxUSDBalance(ctxUSD.toString()); - } - setCurrentAddress(signerAddress); - } - setIsLoading(false); - } - /* if (data) { - let currentTotalPrice = BigNumber.from(0); - const prices = await data?.oracles; - if (prices.length > 0) { - currentTotalPrice = BigNumber.from(prices[0].answer); - } - const TotalTcapPrice = currentTotalPrice.mul(10000000000); - const tprice = ethers.utils.formatEther(TotalTcapPrice.div(10000000000)); - setTotalPrice(ethers.utils.formatEther(TotalTcapPrice)); - setTcapPrice(tprice); - const tcapUSD = parseFloat(tcapString) * parseFloat(tprice); - setTcapUSDBalance(tcapUSD.toString()); - setIsLoading(false); - } */ - }; - loadAddress(); - - // eslint-disable-next-line - }, [signerAddress, loadingContracts]); - - if (isLoading) { - return ; - } - - return ( -
-
- -

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 UK@D}ST>t<807*qoM6N<$f-XHdLjV8( diff --git a/src/assets/images/noti-success.png b/src/assets/images/noti-success.png index e41d26b97437e701dc748fdd4081b82790e7a8dd..c807cfafa37a7e5db2ed6ad543cefd67ec3106b4 100644 GIT binary patch literal 32789 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

-

- -

-

- {t("welcome.tcap")} - {t("welcome.tcap-info")}} - > - - -

- -
-

- -

-

{t("welcome.tcap-token")}

- - - -
- {address !== "" ? ( - -
-

{t("welcome.title1")}

-

- {t("welcome.subtitle1")} {address} -

-
- -
-
- -
-

- -

-

- 1000 ? 0 : 2} - /> -

-
-
-

{t("welcome.tcap-balance")}

- - {isInLayer1(currentNetwork.chainId) && ( -
-
- -
-

- -

-

- 1000 ? 0 : 2} - /> -

-
-
-

{t("welcome.ctx-balance")}

- - )} - - - ) : ( - -
-

{t("welcome.title3")}

-

{t("welcome.subtitle3")}

-
- -
- - - - - )} - - - -

{t("welcome.title2")}

-

{t("welcome.subtitle2")}

- -
- - {address !== "" ? ( - - ) : ( - - )} - - - - - {address !== "" ? ( - - ) : ( - - )} - {address !== "" ? ( - - ) : ( - - )} - - - - - - - - ); -}; -export default Welcome; diff --git a/src/styles/farm.scss b/src/styles/farm.scss index c68602c..dc9155a 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -75,7 +75,7 @@ p { font-size: 0.875; } - + // Small devices (landscape phones, 576px and up) @media (min-width: 576px) { .use-tcap { @@ -348,7 +348,7 @@ h6 { color: $white; margin-top: 3px; - margin-right: 10px; + margin-right: 20px; font-size: 1.1rem; } .number { @@ -548,6 +548,16 @@ margin-right: 0.5rem; } } + .question-small { + border-radius: 2px; + width: 20px !important; + height: 20px !important; + margin-right: 0; + font-size: 10px; + padding: 2px; + margin-left: 5px; + margin-bottom: 0px !important; + } } @media (max-width: 1050px) { diff --git a/src/styles/mint.scss b/src/styles/mint.scss new file mode 100644 index 0000000..30a2ef3 --- /dev/null +++ b/src/styles/mint.scss @@ -0,0 +1,799 @@ +@import "./colors"; +@import "./fonts"; + +.vault { + padding-bottom: 0px; + margin-bottom: 3rem; + + .lightning{ + position: fixed; + height: 100%; + width: 100%; + z-index: 1; + + -webkit-animation: flash ease-out 7s infinite; + -moz-animation: flash ease-out 7s infinite; + animation: flash ease-out 7s infinite; + animation-delay: 2s; + @-webkit-keyframes flash { + from { opacity: 0; } + 92% { opacity: 0; } + 93% { opacity: 0.6; } + 94% { opacity: 0.2; } + 96% { opacity: 0.9; } + to { opacity: 0; } + } + + @keyframes flash { + from { opacity: 0; } + 92% { opacity: 0; } + 93% { opacity: 0.6; } + 94% { opacity: 0.2; } + 96% { opacity: 1; } + to { opacity: 0; } + } + /*End! is that simple! */ + } + // Small devices (landscape phones, 576px and up) + @media (min-width: 576px) { + padding: 1rem 3rem; + } + + // Large devices (desktops, 992px and up) + @media (min-width: 992px) { + padding: 3rem 1.5rem; + } + + // Large devices (small laptos) + @media (min-width: 1300px) { + padding: 3rem 3rem; + } + + .loading-container { + padding-top: 12.5%; + } + + .icon-container { + display: flex; + flex-direction: row; + margin-top: 3rem; + margin-bottom: 2rem; + svg { + margin-top: 7px; + vertical-align: top; + width: 0.9rem; + + &.btc { + margin-top: 10px; + width: 1.5rem; + } + &.dai { + margin-top: 12px; + width: 1.3rem; + } + &.aave { + margin-top: 10px; + width: 1.5rem; + } + &.link { + margin-top: 3px; + width: 1.5rem; + } + &.uni { + margin-top: 3px; + width: 1.7rem; + } + } + + .btn-group { + width: fit-content; + border: 1px solid #dfd1ea; + border-radius: 5px; + margin-bottom: 0rem !important; + margin-right: 0.5rem; + input[type="radio"] { + display: none; + } + .btn-secondary { + margin-bottom: 0rem; + font-size: 0.8rem; + background-color: #281e31; + } + .btn-secondary.active { + background-color: $neon-highlight; + } + } + } + + .alert-warning { + margin-top: 0rem; + margin-bottom: 0rem; + padding: 0.2rem 1rem; + height: 2rem; + width: 70%; + } + + .dd-collateral { + display: flex; + align-items: center; + h6 { + color: $white; + margin: 0px; + } + .balance-container { + display: flex; + align-items: center; + margin: 0rem 1rem; + color: $light; + .number { + margin-bottom: 0rem; + color: $light; + } + } + .dropdown { + padding-left: 0.5rem; + .btn { + margin-top: 0rem; + } + .dropdown-toggle { + display: flex; + height: 2.1rem; + width: 150px; + background-color: #281e31; + border: 1px solid #dfd1ea; + border-radius: 5px; + + div { + display: flex; + align-items: center; + flex: 1; + } + span { + font-size: 0.8rem; + } + svg { + height: 20px; + margin-right: 5px; + } + } + .dropdown-toggle::after { + position: absolute; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.4em solid; + border-right: 0.4em solid transparent; + border-bottom: 0; + border-left: 0.4em solid transparent; + margin-top: 7px; + margin-left: 65%; + } + .dropdown-menu { + width: 85%; + margin-top: 3px !important; + margin-right: 1rem; + background-color: #211828; + + .dropdown-item { + color: $white; + } + .dropdown-item.active { + background-color: rgba(121, 64, 242, 0.4); + } + .dropdown-item:hover { + background-color: rgba(121, 64, 242, 0.3); + } + } + } + } + + .collateral-balance { + display: flex; + flex: 1; + flex-direction: column; + justify-content: center; + align-items: flex-end; + h4 { + margin-bottom: 0rem; + } + p { + margin-bottom: 0rem; + text-align: right; + } + .number { + color: $light; + font-size: 1.1rem; + } + .amount { + display: flex; + align-items: center; + .number { + color: $white; + } + } + svg.small { + vertical-align: top; + width: 0.7rem; + filter: brightness(1118%) drop-shadow(0px 0px 5px $highlight); + @supports (-webkit-touch-callout: none) { + height: intrinsic; + } + + &.btc.small { + margin-top: 0px; + width: 1.5rem; + } + &.dai.small { + margin-top: 0px; + width: 1.2rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.aave.small { + margin-top: 2px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.link.small { + margin-top: 7px; + width: 1.4rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.uni.small { + margin-top: -5px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.snx.small { + margin-top: -3px; + width: 1.3rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.usdc.small { + margin-top: -5px; + width: 1.3rem; + } + } + } + + select { + font-size: 1.2rem; + font-family: "Nineteen Ninety Seven"; + background: none; + border: none; + color: $white; + -webkit-appearance: none; + appearance: none; + width: 7.8rem; + background: url("../assets/images/select-arrow.svg") 96% / 15% no-repeat; + outline: none; + + &::-ms-expand { + display: none; + } + + &:focus { + outline: none; + } + + &.form-control:focus { + color: $white; + background: url("../assets/images/select-arrow.svg") 96% / 15% no-repeat; + outline: 0; + box-shadow: 0 0 0 0 rgba(164, 64, 242, 0); + } + + &.form-control { + padding: 0; + } + + option { + background-color: $primary; + border: none; + color: $white; + } + } + + .action-title { + margin-top: 1rem; + margin-bottom: 2.25rem; + } + + .pre-actions { + p { + width: 30rem; + } + .btn { + width: 13.4375rem; + height: 3.875rem; + border-radius: 1px; + margin-top: 2rem; + } + .card { + width: 35rem; + padding: 1rem 0.5rem; + } + .card-header { + display: flex; + justify-content: space-between; + padding-bottom: 1.5rem; + } + } + + .actions-container { + display: flex; + margin-top: 1rem; + column-gap: 2rem; + p { + width: 100%; + } + .card { + padding: 2rem; + } + .card-header { + padding: 0rem; + padding-bottom: 2rem; + } + .card-body { + padding: 0rem; + } + + .info { + display: flex; + align-items: top; + height: 8rem; + div { + width: 100%; + } + p { + text-align: right; + } + .amount { + display: flex; + flex-direction: row; + justify-content: flex-end; + } + } + + .form-card { + .card { + padding: 0; + + svg { + //margin-top: -5px; + vertical-align: top; + width: 0.8rem; + filter: brightness(1118%) drop-shadow(0px 0px 5px rgba(6, 52, 255, 0.53)); + @supports (-webkit-touch-callout: none) { + height: intrinsic; + } + + &.tcap-neon { + height: 1.8rem; + width: 2rem; + margin-top: 0px; + filter: none; + } + &.btc { + margin-top: 0px; + width: 1.8rem; + } + &.dai { + margin-top: 0px; + width: 1.5rem; + filter: none; + margin-right: 2px; + filter: drop-shadow(0px 0px 5px $dark-blue); + } + + &.polygon { + margin-top: 0px; + width: 1.5rem; + } + &.aave { + width: 1.5rem; + margin-top: 2px; + } + &.link { + width: 1.6rem; + margin-top: -3px; + } + &.uni { + width: 1.6rem; + margin-top: -4px; + } + &.snx { + width: 1.5rem; + margin-top: -3px; + } + &.usdc { + margin-top: 5px; + width: 1.7rem; + } + } + } + .info { + display: flex; + flex-direction: column; + background-color: $darker; + border-radius: 5px; + // border-bottom: 1px solid $dark; + padding: 1.5rem; + margin-bottom: 1rem; + + &-values { + display: flex; + flex-direction: row; + padding: 0.5rem; + margin-top: 0.7rem; + border: 0.7px solid $dark; + border-radius: 5px; + background-color: #281e31; + } + p { + font-size: 1.1rem; + margin-bottom: 0rem; + } + h4 { + font-size: 1.2rem; + padding-bottom: 0; + margin-bottom: 0; + } + .amount { + display: flex; + justify-content: flex-start; + align-items: center; + } + svg { + //margin-top: -5px; + vertical-align: top; + width: 0.8rem; + filter: brightness(1118%) drop-shadow(0px 0px 5px rgba(6, 52, 255, 0.53)); + @supports (-webkit-touch-callout: none) { + height: intrinsic; + } + + &.tcap-neon { + margin-top: 0px; + filter: none; + width: 2rem; + } + } + } + form { + padding: 1rem 1.5rem 1rem 1.5rem; + height: 21rem; + label { + font-family: "Nineteen Ninety Seven"; + color: $white; + + &.max { + float: right; + font-size: 0.85rem; + @media (min-width: 992px) and (max-width: 1300px) { + font-size: 0.9rem; + } + a { + color: $green; + + &.orange { + color: $orange; + } + } + } + } + + .input-group { + padding: 0.7rem 0.5rem; + border: 1px solid $dark; + border-radius: 5px; + background-color: #281e31; + } + .form-group.remove { + margin-top: 3rem; + } + .text-muted { + position: absolute; + text-align: right; + font-size: 0.85rem; + margin-top: -1.8rem; + margin-left: 1rem; + } + + .burn-fee.text-muted { + position: relative; + text-align: right; + margin-top: 0.5rem; + margin-right: 0.5rem; + margin-bottom: 0; + padding-bottom: 0; + font-size: 0.8rem; + color: $off-white !important; + } + + input[type="number"] { + font-size: 1.1rem; + background: no-repeat; + border: 1px; + color: $white; + height: 2rem; + margin-right: 5px; + background-color: $darker; + border-radius: 5px; + } + input[type="number"]:focus { + box-shadow: inset -1px -5px 15px -19px $green; + } + + .btn { + background-color: $darker; + width: 6rem; + height: 3.5rem; + border-radius: 4px; + font-size: 0.85rem; + } + + } + } + + .balance { + display: flex; + flex-direction: column; + justify-content: space-between; + + .card { + min-height: 12rem; + } + &-info { + display: flex; + flex-direction: row; + } + + .eth { + filter: drop-shadow(0px 0px 15px rgba(111, 19, 202, 1)); + } + + .ratio { + width: 1.9375rem; + filter: drop-shadow(0px 0px 15px rgba(15, 217, 255, 0.53)); + } + + .info-data { + display: flex; + flex-direction: column; + } + + .info { + margin-top: 1rem; + + .btn { + margin-top: 0.7rem; + height: 40px; + } + + p, + h4 { + padding-bottom: 0; + margin-bottom: 0; + } + .amount h4 { + margin-bottom: 0.5rem; + } + } + + svg.small { + vertical-align: top; + margin-top: -5px; + width: 0.8rem; + &.btc.small { + margin-top: -5px; + width: 1.8rem; + } + + &.dai.small { + margin-top: 0px; + width: 1.2rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.aave.small { + margin-top: -5px; + width: 1.7rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.link.small { + margin-top: 0px; + width: 1.7rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.uni.small { + margin-top: -5px; + width: 1.7rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.snx.small { + margin-top: -3px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.usdc.small { + margin-top: -5px; + width: 1.7rem; + } + } + } + + .tcap { + .card { + min-height: 26rem; + } + } + + .token-icon-container { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-end; + min-height: 0rem; + min-width: 0rem; + } + + .test { + display: flex; + flex-direction: column; + .test2 { + display: flex; + flex-direction: row; + } + } + } + + // Small devices (landscape phones, 576px and up) + @media (min-width: 576px) { + .actions-container { + // display: grid; + // grid-template-columns: auto; + margin-bottom: 2rem; + } + + .balance { + grid-row-gap: 0rem; + row-gap: 0rem; + } + + .card { + margin-bottom: 2rem; + } + } + + // Large devices (desktops, 992px and up) + @media (min-width: 992px) { + .actions-container { + // display: grid; + // grid-template-columns: auto 33% 33%; + margin-bottom: 0rem; + } + .balance { + row-gap: 1.5rem; + } + + .card { + margin-bottom: 0rem; + } + } + + @media (min-width: 992px) and (max-width: 1200px) { + .actions-container { + column-gap: 1rem; + .balance { + .card { + padding: 2rem 1.2rem; + } + h4 { + font-size: 1.35rem; + } + p { + font-size: 0.9rem; + } + } + .form-card { + form { + padding: 2rem 1.2rem 0rem 1.2rem; + label { + font-size: 0.87rem; + } + } + .card { + .info { + padding: 2rem 1rem; + } + } + } + @media (max-width: 1140px) { + .form-group { + span { + font-size: 0.9rem; + } + } + .form-card { + h4 { + font-size: 1.32rem; + } + } + .balance { + h4 { + font-size: 1.25rem; + } + } + } + } + } + + @media (max-height: 820px) and (min-width: 992px) { + .icon-container { + margin-top: 1rem; + } + .actions-container { + margin-top: 0rem; + + .card { + padding: 1rem 1rem; + } + .form-card { + .card { + min-height: 23rem; + + .info { + padding-top: 1.3rem; + padding-bottom: 1.3rem; + } + } + form { + padding-top: 1.5rem; + .remove { + margin-top: 2.7rem; + } + } + } + .balance { + row-gap: 1rem; + .card { + min-height: 11.17rem; + } + } + } + } + + @media (max-width: 730px) { + padding-top: 4rem; + padding-left: 1rem; + + .pre-actions { + p { + width: 20rem; + } + } + + @media (max-width: 575px) { + .actions-container { + .card { + padding: 2rem 1.5rem; + } + .form-card { + .card { + .info { + padding: 2rem 1rem; + } + } + } + @media (max-width: 380px) { + .card { + padding: 2rem 0.9rem; + } + } + } + + .card { + margin-bottom: 2rem; + } + } + } +} diff --git a/src/styles/mint2.scss b/src/styles/mint2.scss new file mode 100644 index 0000000..4baf3b1 --- /dev/null +++ b/src/styles/mint2.scss @@ -0,0 +1,749 @@ +@import "./colors"; +@import "./fonts"; + +.vault { + padding-bottom: 0px; + margin-bottom: 3rem; + + .lightning{ + position: fixed; + height: 100%; + width: 100%; + z-index: 1; + + -webkit-animation: flash ease-out 7s infinite; + -moz-animation: flash ease-out 7s infinite; + animation: flash ease-out 7s infinite; + animation-delay: 2s; + @-webkit-keyframes flash { + from { opacity: 0; } + 92% { opacity: 0; } + 93% { opacity: 0.6; } + 94% { opacity: 0.2; } + 96% { opacity: 0.9; } + to { opacity: 0; } + } + + @keyframes flash { + from { opacity: 0; } + 92% { opacity: 0; } + 93% { opacity: 0.6; } + 94% { opacity: 0.2; } + 96% { opacity: 1; } + to { opacity: 0; } + } + /*End! is that simple! */ + } + // Small devices (landscape phones, 576px and up) + @media (min-width: 576px) { + padding: 1rem 3rem; + } + + // Large devices (desktops, 992px and up) + @media (min-width: 992px) { + padding: 3rem 1.5rem; + } + + // Large devices (small laptos) + @media (min-width: 1300px) { + padding: 3rem 3rem; + } + + .loading-container { + padding-top: 12.5%; + } + + .icon-container { + display: flex; + flex-direction: row; + margin-top: 3rem; + margin-bottom: 2rem; + svg { + margin-top: 7px; + vertical-align: top; + width: 0.9rem; + + &.btc { + margin-top: 10px; + width: 1.5rem; + } + &.dai { + margin-top: 12px; + width: 1.3rem; + } + &.aave { + margin-top: 10px; + width: 1.5rem; + } + &.link { + margin-top: 3px; + width: 1.5rem; + } + &.uni { + margin-top: 3px; + width: 1.7rem; + } + } + + .btn-group { + width: fit-content; + border: 1px solid #dfd1ea; + border-radius: 5px; + margin-bottom: 0rem !important; + margin-right: 0.5rem; + input[type="radio"] { + display: none; + } + .btn-secondary { + margin-bottom: 0rem; + font-size: 0.8rem; + background-color: #281e31; + } + .btn-secondary.active { + background-color: $neon-highlight; + } + } + } + + .alert-warning { + margin-top: 0rem; + margin-bottom: 0rem; + padding: 0.2rem 1rem; + height: 2rem; + width: 70%; + } + + .dd-collateral { + display: flex; + align-items: center; + h6 { + color: $white; + margin: 0px; + } + .balance-container { + display: flex; + align-items: center; + margin: 0rem 1rem; + color: $light; + .number { + margin-bottom: 0rem; + color: $light; + } + } + .dropdown { + padding-left: 0.5rem; + .btn { + margin-top: 0rem; + } + .dropdown-toggle { + display: flex; + height: 2.1rem; + width: 150px; + background-color: #281e31; + border: 1px solid #dfd1ea; + border-radius: 5px; + + div { + display: flex; + align-items: center; + flex: 1; + } + span { + font-size: 0.8rem; + } + svg { + height: 20px; + margin-right: 5px; + } + } + .dropdown-toggle::after { + position: absolute; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.4em solid; + border-right: 0.4em solid transparent; + border-bottom: 0; + border-left: 0.4em solid transparent; + margin-top: 7px; + margin-left: 65%; + } + .dropdown-menu { + width: 85%; + margin-top: 3px !important; + margin-right: 1rem; + background-color: #211828; + + .dropdown-item { + color: $white; + } + .dropdown-item.active { + background-color: rgba(121, 64, 242, 0.4); + } + .dropdown-item:hover { + background-color: rgba(121, 64, 242, 0.3); + } + } + } + } + + .collateral-balance { + display: flex; + align-items: center; + h4 { + margin-bottom: 0rem; + } + .number { + color: $light; + font-size: 1.1rem; + } + .amount { + display: flex; + align-items: center; + .number { + color: $white; + } + } + svg.small { + vertical-align: top; + width: 0.7rem; + filter: brightness(1118%) drop-shadow(0px 0px 5px $highlight); + @supports (-webkit-touch-callout: none) { + height: intrinsic; + } + + &.btc.small { + margin-top: 0px; + width: 1.5rem; + } + &.dai.small { + margin-top: 0px; + width: 1.2rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.aave.small { + margin-top: 2px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.link.small { + margin-top: 7px; + width: 1.4rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.uni.small { + margin-top: -5px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.snx.small { + margin-top: -3px; + width: 1.3rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.usdc.small { + margin-top: -5px; + width: 1.3rem; + } + } + } + + select { + font-size: 1.2rem; + font-family: "Nineteen Ninety Seven"; + background: none; + border: none; + color: $white; + -webkit-appearance: none; + appearance: none; + width: 7.8rem; + background: url("../assets/images/select-arrow.svg") 96% / 15% no-repeat; + outline: none; + + &::-ms-expand { + display: none; + } + + &:focus { + outline: none; + } + + &.form-control:focus { + color: $white; + background: url("../assets/images/select-arrow.svg") 96% / 15% no-repeat; + outline: 0; + box-shadow: 0 0 0 0 rgba(164, 64, 242, 0); + } + + &.form-control { + padding: 0; + } + + option { + background-color: $primary; + border: none; + color: $white; + } + } + + .action-title { + margin-top: 1rem; + margin-bottom: 2.25rem; + } + + .pre-actions { + p { + width: 30rem; + } + .btn { + width: 13.4375rem; + height: 3.875rem; + border-radius: 1px; + margin-top: 2rem; + } + .card { + width: 35rem; + padding: 1rem 0.5rem; + } + .card-header { + display: flex; + justify-content: space-between; + padding-bottom: 1.5rem; + } + } + + .actions-container { + margin-top: 1rem; + column-gap: 2rem; + p { + width: 100%; + } + .card { + padding: 2rem; + } + .card-header { + padding: 0rem; + padding-bottom: 1.5rem; + } + .card-body { + padding: 0rem; + } + + .info { + display: flex; + align-items: top; + div { + width: 100%; + } + p { + text-align: right; + } + .collateral-balance { + flex-direction: column; + } + .amount { + display: flex; + flex-direction: row; + justify-content: flex-end; + } + } + + .form-card { + .card { + min-height: 26.3rem; + padding: 0; + + .info { + border-bottom: 1px solid $dark; + padding: 1.5rem; + + p, + h4 { + padding-bottom: 0; + margin-bottom: 0; + } + h4 { + font-size: 1.4rem; + } + + .amount { + display: flex; + justify-content: flex-end; + } + } + + svg { + //margin-top: -5px; + vertical-align: top; + width: 0.8rem; + filter: brightness(1118%) drop-shadow(0px 0px 5px rgba(6, 52, 255, 0.53)); + @supports (-webkit-touch-callout: none) { + height: intrinsic; + } + + &.tcap-neon { + margin-top: 0px; + filter: none; + width: 1.9rem; + } + &.btc { + margin-top: 0px; + width: 1.8rem; + } + &.dai { + margin-top: 0px; + width: 1.5rem; + filter: none; + margin-right: 2px; + filter: drop-shadow(0px 0px 5px $dark-blue); + } + + &.polygon { + margin-top: 0px; + width: 1.5rem; + } + &.aave { + width: 1.5rem; + margin-top: 2px; + } + &.link { + width: 1.6rem; + margin-top: -3px; + } + &.uni { + width: 1.6rem; + margin-top: -4px; + } + &.snx { + width: 1.5rem; + margin-top: -3px; + } + &.usdc { + margin-top: 5px; + width: 1.7rem; + } + } + } + + form { + padding: 2rem 1.5rem 0rem 1.5rem; + + label { + font-family: "Nineteen Ninety Seven"; + color: $white; + + &.max { + float: right; + @media (min-width: 992px) and (max-width: 1300px) { + font-size: 0.9rem; + } + a { + color: $green; + + &.orange { + color: $orange; + } + } + } + } + .input-group { + background-color: #281e31; + border: 1px solid $dark; + border-radius: 5px; + } + + .text-muted { + position: absolute; + text-align: left; + font-size: 0.85rem; + margin-top: -1.7rem; + padding-left: 1rem; + } + + .burn-fee.text-muted { + position: relative; + text-align: right; + font-size: 1rem; + margin-top: 0.5rem; + margin-right: 0.2rem; + margin-bottom: 0; + padding-bottom: 0; + font-size: 0.8rem; + color: $off-white !important; + } + + input[type="number"] { + font-size: 1.2rem; + padding-bottom: 1.8rem; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + border-color: transparent; + color: $white; + height: 3.7rem; + } + + .btn { + font-size: 0.8rem; + background-color: $darker; + width: 6rem; + height: 3.7rem; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + } + + .remove { + margin-top: 3rem; + } + } + } + + .balance { + display: flex; + flex-direction: column; + justify-content: space-between; + + .card { + min-height: 11rem; + } + + .eth { + filter: drop-shadow(0px 0px 15px rgba(111, 19, 202, 1)); + } + + .ratio { + display: none; + width: 1.9375rem; + filter: drop-shadow(0px 0px 15px rgba(15, 217, 255, 0.53)); + } + + .info-data { + display: flex; + flex-direction: column; + } + + .info { + margin-top: 1.7rem; + + .btn { + margin-top: 0.7rem; + height: 40px; + } + + p, + h4 { + padding-bottom: 0; + margin-bottom: 0; + } + .amount h4 { + margin-bottom: 0.5rem; + } + } + + svg.small { + vertical-align: top; + margin-top: -5px; + width: 0.8rem; + &.btc.small { + margin-top: -5px; + width: 1.8rem; + } + + &.dai.small { + margin-top: 0px; + width: 1.2rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.aave.small { + margin-top: -5px; + width: 1.7rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.link.small { + margin-top: 0px; + width: 1.7rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.uni.small { + margin-top: -5px; + width: 1.7rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.snx.small { + margin-top: -3px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + &.usdc.small { + margin-top: -5px; + width: 1.7rem; + } + } + } + + .tcap { + .card { + min-height: 26rem; + } + } + + .token-icon-container { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-end; + min-height: 0rem; + min-width: 0rem; + } + } + + // Small devices (landscape phones, 576px and up) + @media (min-width: 576px) { + .actions-container { + display: grid; + grid-template-columns: auto; + margin-bottom: 2rem; + } + + .balance { + grid-row-gap: 0rem; + row-gap: 0rem; + } + + .card { + margin-bottom: 2rem; + } + } + + // Large devices (desktops, 992px and up) + @media (min-width: 992px) { + .actions-container { + display: grid; + grid-template-columns: auto 33% 33%; + margin-bottom: 0rem; + } + .balance { + row-gap: 1.5rem; + } + + .card { + margin-bottom: 0rem; + } + } + + @media (min-width: 992px) and (max-width: 1200px) { + .actions-container { + column-gap: 1rem; + .balance { + .card { + padding: 2rem 1.2rem; + } + h4 { + font-size: 1.35rem; + } + p { + font-size: 0.9rem; + } + } + .form-card { + form { + padding: 2rem 1.2rem 0rem 1.2rem; + label { + font-size: 0.87rem; + } + } + .card { + .info { + padding: 2rem 1rem; + } + } + } + @media (max-width: 1140px) { + .form-group { + span { + font-size: 0.9rem; + } + } + .form-card { + h4 { + font-size: 1.32rem; + } + } + .balance { + h4 { + font-size: 1.25rem; + } + } + } + } + } + + @media (max-height: 820px) and (min-width: 992px) { + .icon-container { + margin-top: 1rem; + } + .actions-container { + margin-top: 0rem; + + .card { + padding: 1rem 1rem; + } + .form-card { + .card { + min-height: 23rem; + + .info { + padding-top: 1.3rem; + padding-bottom: 1.3rem; + } + } + form { + padding-top: 1.5rem; + .remove { + margin-top: 2.7rem; + } + } + } + .balance { + row-gap: 1rem; + .card { + min-height: 11.17rem; + } + } + } + } + + @media (max-width: 730px) { + padding-top: 4rem; + padding-left: 1rem; + + .pre-actions { + p { + width: 20rem; + } + } + + @media (max-width: 575px) { + .actions-container { + .card { + padding: 2rem 1.5rem; + } + .form-card { + .card { + .info { + padding: 2rem 1rem; + } + } + } + @media (max-width: 380px) { + .card { + padding: 2rem 0.9rem; + } + } + } + + .card { + margin-bottom: 2rem; + } + } + } +} \ No newline at end of file diff --git a/src/styles/summary.scss b/src/styles/summary.scss index ac45e29..1574b55 100644 --- a/src/styles/summary.scss +++ b/src/styles/summary.scss @@ -121,11 +121,7 @@ } &.diamond { - background-image: url("../assets/images/welcome/diamond.svg"); - background-repeat: no-repeat; - background-position: right bottom; padding-bottom: 0rem; - p { width: 80%; } diff --git a/src/styles/welcome.scss b/src/styles/welcome.scss deleted file mode 100644 index 051e395..0000000 --- a/src/styles/welcome.scss +++ /dev/null @@ -1,246 +0,0 @@ -@import "./colors"; -@import "./fonts"; - -.welcome { - padding: 5rem 3rem; - padding-bottom: 2rem; - - // Small devices (landscape phones, 576px and up) - @media (min-width: 576px) { - .token-price { - margin-top: 2rem; - } - } - - // Large devices (desktops, 992px and up) - @media (min-width: 992px) { - .token-price { - margin-top: 0rem; - } - } - - h2 { - font-size: 1.75rem; - margin-bottom: 0.875rem; - - @media (max-width: 1275px) { - font-size: 1.6rem; - } - @media (max-width: 1180px) { - font-size: 1.3rem; - } - @media (max-width: 1100px) { - font-size: 1.3rem; - } - } - - .btn { - background-color: $darker; - width: 10rem; - height: 3rem; - margin-right: 30px; - - &.question { - border-radius: 2px; - width: 20px; - height: 20px; - margin-right: 0px; - font-size: 10px; - padding: 2px; - margin-left: 5px; - } - } - - #connect { - background-color: $pink; - width: 15rem; - height: 3rem; - border-radius: 0; - } - - .card-wrapper { - margin-top: 2.9375rem; - h2 { - font-size: 1.375rem; - margin-bottom: 1.5625rem; - } - - h3 { - font-size: 1.625rem; - @media (max-width: 450px) { - font-size: 1.45rem; - } - } - - p { - font-size: 0.875; - } - - // Small devices (landscape phones, 576px and up) - @media (min-width: 576px) { - .use-tcap { - margin-top: 2rem; - margin-bottom: 4rem; - } - } - - // Large devices (desktops, 992px and up) - @media (min-width: 992px) { - .use-tcap { - margin-top: 0rem; - margin-bottom: 0rem; - } - } - - .card { - padding: 3.125rem 2.8125rem; - min-height: 20.1875rem; - @media (max-width: 400px) { - padding: 3.125rem 2rem; - } - - .cls-1 { - fill: $darker; - } - b { - font-family: "Nineteen Ninety Seven"; - color: $purple; - } - p { - margin-bottom: 1.5rem; - } - .row { - margin-top: 0.5rem; - } - - &.balance { - .row { - margin-top: 2rem; - @media (min-width: 1100px) and (max-width: 1350px) { - margin-top: 1rem; - } - } - .col { - margin-top: 1rem; - } - .tcap-balance { - display: flex; - } - - svg { - height: 2rem; - margin-right: 0.5rem; - filter: drop-shadow(0px 4px 13px $dark-blue); - - &.tcap-neon { - filter: none; - } - } - - h3 { - display: flex; - align-items: center; - } - - p { - margin-top: 1rem; - } - - p.usd-balance { - margin-bottom: 0rem; - margin-top: 0.2rem; - } - p.title { - margin-left: 0.35rem; - } - } - - &.diamond { - background-image: url("../assets/images/welcome/diamond.svg"); - background-repeat: no-repeat; - background-position: right bottom; - - p { - width: 70%; - } - .btn { - width: 11.0625rem; - margin-bottom: 0.8rem; - - &.neon-green { - box-shadow: 0px 0px 39px -6px rgba(63, 217, 180, 0.4); - } - &.neon-blue { - box-shadow: 0px 0px 39px -6px rgba(15, 217, 255, 0.4); - } - } - } - } - } - - .protocol { - - h5 { - font-size: 1rem; - } - h6 { - color: $off-white; - } - .card-body { - padding: 0rem; - } - .asset { - display: flex; - flex-direction: row; - align-items: center; - padding: 0.5rem; - } - .staked { - display: flex; - flex-direction: column-reverse; - margin-left: 1rem; - } - } - - - @media (max-height: 820px) and (min-width: 992px) { - padding-top: 1rem; - .card-wrapper { - margin-top: 1.5rem; - .card { - padding: 2rem 2.8125rem; - } - } - } - - @media (min-width: 992px) and (max-width: 1280px) { - .card-wrapper { - .card { - padding-left: 2rem; - padding-right: 2rem; - } - - @media (max-width: 1200px) { - h3 { - font-size: 1.5rem; - } - } - } - } - - @media (max-width: 600px) { - padding: 5rem 1.2rem; - - .card-wrapper { - .card { - margin-bottom: 1.2rem; - - &.diamond { - p { - width: 85%; - } - } - } - } - } -} diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 30c3536..e3a4cbb 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -87,10 +87,10 @@ export const sendNotification = async ( ) => { const toastConstant = (
- {className === "success" ? ( - toasty - ) : ( + {className === "error" ? ( toasty + ) : ( + toasty )}
{title}

{body}

From c39244bcc60ff02f6d36ce329efc95f6259539ed Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 12 May 2022 15:33:59 -0600 Subject: [PATCH 105/278] change sent notification image --- src/assets/images/noti-success.png | Bin 32789 -> 50710 bytes src/components/Vault/Details.tsx | 1541 ---------------------------- src/components/Vault/Mint.tsx | 586 ++++++----- src/components/Vault/Mint2.tsx | 588 +++++------ src/components/Vault/Vault.tsx | 6 +- src/styles/mint.scss | 170 ++- src/styles/mint2.scss | 170 +-- src/styles/vault.scss | 733 ------------- 8 files changed, 760 insertions(+), 3034 deletions(-) delete mode 100644 src/components/Vault/Details.tsx delete mode 100644 src/styles/vault.scss diff --git a/src/assets/images/noti-success.png b/src/assets/images/noti-success.png index c807cfafa37a7e5db2ed6ad543cefd67ec3106b4..0cd606bfaebb4a5eae2c4c5795f6233c1ba949da 100644 GIT binary patch literal 50710 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 LNkvXXu0mjfRdp>6 diff --git a/src/components/Vault/Details.tsx b/src/components/Vault/Details.tsx deleted file mode 100644 index e5f54e0..0000000 --- a/src/components/Vault/Details.tsx +++ /dev/null @@ -1,1541 +0,0 @@ -import React, { useState, useEffect, useContext } from "react"; -import Button from "react-bootstrap/esm/Button"; -import ButtonGroup from "react-bootstrap/esm/ButtonGroup"; -import Card from "react-bootstrap/esm/Card"; -import Dropdown from "react-bootstrap/Dropdown"; -import Form from "react-bootstrap/esm/Form"; -import InputGroup from "react-bootstrap/esm/InputGroup"; -import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; -import ToggleButton from "react-bootstrap/esm/ToggleButton"; -import Tooltip from "react-bootstrap/esm/Tooltip"; -import { Contract } from "ethers-multicall"; -import { ethers, BigNumber } from "ethers"; -import NumberFormat from "react-number-format"; -import { useRouteMatch, useHistory } from "react-router-dom"; -import { useQuery, gql, NetworkStatus } from "@apollo/client"; -import NetworkContext from "../../state/NetworkContext"; -import OraclesContext from "../../state/OraclesContext"; -import TokensContext from "../../state/TokensContext"; -import VaultsContext from "../../state/VaultsContext"; -import HardVaultsContext from "../../state/HardVaultsContext"; -import SignerContext from "../../state/SignerContext"; -import "../../styles/vault.scss"; -import { ReactComponent as ETHIconSmall } from "../../assets/images/vault/eth.svg"; -import { ReactComponent as DAIIconSmall } from "../../assets/images/vault/dai.svg"; -import { ReactComponent as AAVEIconSmall } from "../../assets/images/vault/aave.svg"; -import { ReactComponent as LINKIconSmall } from "../../assets/images/vault/chainlink.svg"; -import { ReactComponent as UNIIconSmall } from "../../assets/images/vault/uni.svg"; -import { ReactComponent as SNXIconSmall } from "../../assets/images/vault/snx2.svg"; -import { ReactComponent as POLYGONIconSmall } from "../../assets/images/vault/polygon.svg"; -import { ReactComponent as WBTCIconSmall } from "../../assets/images/vault/bitcoin.svg"; -import { ReactComponent as USDCIconSmall } from "../../assets/images/vault/usdc.svg"; -import { ReactComponent as RatioIcon } from "../../assets/images/vault/ratio.svg"; -import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; -import { - notifyUser, - toUSD, - errorNotification, - getDefaultProvider, - isInLayer1, - isPolygon, - isOptimism, - getRatio, - getSafeRemoveCollateral, - getSafeMint, - isUndefined, -} from "../../utils/utils"; -import Loading from "../Loading"; -import { FEATURES, NETWORKS } from "../../utils/constants"; - -type props = { - address: string; - t: any; -}; - -// TODO: Vault doesn't show if approve is 0 even if there is data in the vault - -const Details = ({ address, t }: props) => { - const currentNetwork = useContext(NetworkContext); - const oracles = useContext(OraclesContext); - const tokens = useContext(TokensContext); - const vaults = useContext(VaultsContext); - const hardVaults = useContext(HardVaultsContext); - const signer = useContext(SignerContext); - const [vaultMode, setVaultMode] = useState("hard"); - const [loadingMode, setLoadingMode] = useState(false); - const radios = [ - { name: "Regular Mode", value: "normal" }, - { name: "Hard Mode", value: "hard" }, - ]; - let currency = !isPolygon(currentNetwork.chainId) ? "ETH" : "MATIC"; - const match = useRouteMatch("/vault/:currency"); - const history = useHistory(); - const isHardMode = () => vaultMode === "hard"; - - // @ts-ignore - switch (match?.params?.currency?.toLowerCase()) { - case "eth": - currency = "ETH"; - if (FEATURES.POLYGON && isPolygon(currentNetwork.chainId)) { - history?.push(`/vault/MATIC`); - currency = "MATIC"; - } - break; - case "weth": - currency = "WETH"; - if (FEATURES.POLYGON && isPolygon(currentNetwork.chainId)) { - history?.push(`/vault/MATIC`); - currency = "MATIC"; - } - break; - case "wbtc": - currency = "WBTC"; - if (isOptimism(currentNetwork.chainId) || isHardMode()) { - history?.push(`/vault/ETH`); - currency = "ETH"; - } - break; - case "dai": - currency = "DAI"; - break; - case "aave": - if (isInLayer1(currentNetwork.chainId) && !isHardMode()) { - currency = "AAVE"; - } else { - currency = "ETH"; - history?.push(`/vault/ETH`); - } - break; - case "usdc": - if (isInLayer1(currentNetwork.chainId) && isHardMode()) { - currency = "USDC"; - } else { - currency = "ETH"; - history?.push(`/vault/ETH`); - } - break; - case "link": - if (!isPolygon(currentNetwork.chainId) && !isHardMode()) { - currency = "LINK"; - } else { - currency = "ETH"; - history?.push(`/vault/ETH`); - } - break; - case "matic": - currency = "MATIC"; - if ((!FEATURES.POLYGON && !isPolygon(currentNetwork.chainId)) || isHardMode()) { - history?.push(`/vault/ETH`); - currency = "ETH"; - } - setVaultMode("normal"); - break; - default: - currency = FEATURES.POLYGON && isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"; - break; - } - - // Actions - const [title, setTitle] = useState(t("vault.create")); - const [text, setText] = useState(t("vault.create-text")); - const [isApproved, setIsApproved] = useState(false); - const [isLoading, setIsLoading] = useState(true); - const [btnDisabled, setBtnDisabled] = useState(false); - - // Vault Data - const [vaultOptions, setVaultOptions] = useState>([]); - const [selectedVaultId, setSelectedVaultId] = useState("0"); - const [vaultDebt, setVaultDebt] = useState("0"); - const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); - const [vaultCollateral, setVaultCollateral] = useState("0"); - const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); - const [vaultRatio, setVaultRatio] = useState("0"); - const [tempRatio, setTempRatio] = useState(""); - const [minRatio, setMinRatio] = useState("0"); - const [selectedVault, setSelectedVault] = useState(currency); - const [selectedVaultContract, setSelectedVaultContract] = useState(); - const [selectedVaultRead, setSelectedVaultRead] = useState(); - const [selectedOracleRead, setSelectedOracleRead] = useState(); - const [selectedCollateralContract, setSelectedCollateralContract] = useState(); - const [selectedVaultDecimals, setSelectedVaultDecimals] = useState(18); - - // General Data - const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); - const [tokenBalance, setTokenBalance] = useState("0"); - const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); - - // Inputs - const [addCollateralTxt, setAddCollateralTxt] = useState(""); - const [addCollateralUSD, setAddCollateralUSD] = useState("0"); - const [removeCollateralTxt, setRemoveCollateralTxt] = useState(""); - const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); - const [mintTxt, setMintTxt] = useState(""); - const [mintUSD, setMintUSD] = useState("0"); - const [burnTxt, setBurnTxt] = useState(""); - const [burnUSD, setBurnUSD] = useState("0"); - const [burnFee, setBurnFee] = useState("0"); - const [vaultStatus, setVaultStatus] = useState(""); - - // Infinite Approval - const approveValue = BigNumber.from("1157920892373161954235709850086879078532699"); - - const USER_VAULT = gql` - query getVault($owner: String!) { - vaults(where: { owner: $owner }) { - id - vaultId - owner - collateral - debt - address - owner - hardVault - } - _meta { - block { - number - hash - } - hasIndexingErrors - } - } - `; - - const tcapPrice = async () => { - const currentTCAPPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - - // @ts-ignore - const [currentTCAPPrice] = await signer.ethcallProvider?.all([currentTCAPPriceCall]); - return currentTCAPPrice; - }; - - const collateralPrice = async () => { - const collateralPriceCall = await selectedOracleRead?.getLatestAnswer(); - - // @ts-ignore - const [currentCollateralPrice] = await signer.ethcallProvider?.all([collateralPriceCall]); - return currentCollateralPrice; - }; - - const validVaults = (): boolean => { - let valid = - !isUndefined(oracles.daiOracle) && - !isUndefined(oracles.tcapOracle) && - !isUndefined(oracles.daiOracleRead) && - !isUndefined(vaults.daiVault) && - !isUndefined(tokens.daiTokenRead); - - if (isInLayer1(currentNetwork.chainId)) { - valid = - valid && - !isUndefined(oracles.wethOracle) && - !isUndefined(oracles.aaveOracle) && - !isUndefined(oracles.linkOracle) && - !isUndefined(oracles.wethOracleRead) && - !isUndefined(oracles.aaveOracleRead) && - !isUndefined(oracles.linkOracleRead) && - !isUndefined(vaults.wethVault) && - !isUndefined(vaults.aaveVault) && - !isUndefined(vaults.linkVault) && - !isUndefined(tokens.aaveToken) && - !isUndefined(tokens.linkToken) && - !isUndefined(tokens.wethTokenRead) && - !isUndefined(tokens.aaveTokenRead) && - !isUndefined(tokens.linkTokenRead); - } - if (isOptimism(currentNetwork.chainId)) { - valid = - valid && - !isUndefined(oracles.linkOracle) && - !isUndefined(oracles.snxOracle) && - !isUndefined(oracles.uniOracle) && - !isUndefined(oracles.linkOracleRead) && - !isUndefined(oracles.snxOracleRead) && - !isUndefined(oracles.uniOracleRead) && - !isUndefined(vaults.linkVault) && - !isUndefined(vaults.snxVault) && - !isUndefined(vaults.uniVault) && - !isUndefined(tokens.linkToken) && - !isUndefined(tokens.snxToken) && - !isUndefined(tokens.uniToken) && - !isUndefined(tokens.linkTokenRead) && - !isUndefined(tokens.snxTokenRead) && - !isUndefined(tokens.uniTokenRead); - } - if (isPolygon(currentNetwork.chainId)) { - valid = - valid && - !isUndefined(oracles.maticOracle) && - !isUndefined(oracles.maticOracleRead) && - !isUndefined(oracles.wbtcOracle) && - !isUndefined(oracles.wbtcOracleRead) && - !isUndefined(vaults.maticVault) && - !isUndefined(vaults.maticVaultRead) && - !isUndefined(vaults.wbtcVault) && - !isUndefined(vaults.wbtcVaultRead) && - !isUndefined(tokens.maticToken) && - !isUndefined(tokens.maticTokenRead) && - !isUndefined(tokens.wbtcToken) && - !isUndefined(tokens.maticTokenRead); - } - - return valid; - }; - - const isGasAsset = () => - (!isPolygon(currentNetwork.chainId) && selectedVault === "ETH") || - (isPolygon(currentNetwork.chainId) && selectedVault === "MATIC"); - - async function loadVault(vaultType: string, vaultData: any) { - if (signer.signer && validVaults() && vaultData) { - let currentVault: any; - let currentVaultRead: any; - let currentToken; - let currentOracleRead; - let currentTokenRead; - let balance; - const provider = getDefaultProvider( - currentNetwork.chainId || NETWORKS.mainnet.chainId, - currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.rinkeby.name - ); - switch (vaultType) { - case "ETH": - currentVault = !isHardMode() ? vaults.wethVault : hardVaults.wethVault; - currentVaultRead = !isHardMode() ? vaults.wethVaultRead : hardVaults.wethVaultRead; - currentToken = tokens.wethToken; - currentOracleRead = oracles.wethOracleRead; - currentTokenRead = tokens.wethTokenRead; - balance = await provider.getBalance(address); - break; - case "WETH": - currentVault = !isHardMode() ? vaults.wethVault : hardVaults.wethVault; - currentVaultRead = !isHardMode() ? vaults.wethVaultRead : hardVaults.wethVaultRead; - currentToken = tokens.wethToken; - currentOracleRead = oracles.wethOracleRead; - currentTokenRead = tokens.wethTokenRead; - break; - case "DAI": - currentVault = !isHardMode() ? vaults.daiVault : hardVaults.daiVault; - currentVaultRead = !isHardMode() ? vaults.daiVaultRead : hardVaults.daiVaultRead; - currentToken = tokens.daiToken; - currentOracleRead = oracles.daiOracleRead; - currentTokenRead = tokens.daiTokenRead; - break; - case "AAVE": - currentVault = vaults.aaveVault; - currentVaultRead = vaults.aaveVaultRead; - currentToken = tokens.aaveToken; - currentOracleRead = oracles.aaveOracleRead; - currentTokenRead = tokens.aaveTokenRead; - break; - case "LINK": - currentVault = vaults.linkVault; - currentVaultRead = vaults.linkVaultRead; - currentToken = tokens.linkToken; - currentOracleRead = oracles.linkOracleRead; - currentTokenRead = tokens.linkTokenRead; - break; - case "SNX": - currentVault = vaults.snxVault; - currentVaultRead = vaults.snxVaultRead; - currentToken = tokens.snxToken; - currentOracleRead = oracles.snxOracleRead; - currentTokenRead = tokens.snxTokenRead; - break; - case "UNI": - currentVault = vaults.uniVault; - currentVaultRead = vaults.uniVaultRead; - currentToken = tokens.uniToken; - currentOracleRead = oracles.uniOracleRead; - currentTokenRead = tokens.uniTokenRead; - break; - case "MATIC": - currentVault = vaults.maticVault; - currentVaultRead = vaults.maticVaultRead; - currentToken = tokens.maticToken; - currentOracleRead = oracles.maticOracleRead; - currentTokenRead = tokens.maticTokenRead; - // balance = await provider.getBalance(address); - break; - case "WBTC": - currentVault = vaults.wbtcVault; - currentVaultRead = vaults.wbtcVaultRead; - currentToken = tokens.wbtcToken; - currentOracleRead = oracles.wbtcOracleRead; - currentTokenRead = tokens.wbtcTokenRead; - // balance = await provider.getBalance(address); - break; - case "USDC": - currentVault = hardVaults.usdcVault; - currentVaultRead = hardVaults.usdcVaultRead; - currentToken = tokens.usdcToken; - currentOracleRead = oracles.usdcOracleRead; - currentTokenRead = tokens.usdcTokenRead; - // balance = await provider.getBalance(address); - break; - default: - currentVault = vaults.wethVault; - currentVaultRead = vaults.wethVaultRead; - currentToken = tokens.wethToken; - currentOracleRead = oracles.wethOracleRead; - currentTokenRead = tokens.wethTokenRead; - break; - } - setSelectedVaultContract(currentVault); - setSelectedCollateralContract(currentToken); - setSelectedVaultRead(currentVaultRead); - setSelectedOracleRead(currentOracleRead); - - let currentVaultData: any; - // Removed GRAPH - // if data is empty load vault data from contract - /* const graphBlock = vaultData._meta.block.number; - let currentBlock = await provider.getBlockNumber(); - currentBlock -= 10; - if ( - isInLayer1(currentNetwork.chainId) && - vaultData.vaults.length > 0 && - !vaultData._meta.hasIndexingErrors && - graphBlock >= currentBlock - ) { - await vaultData.vaults.forEach((v: any) => { - if (v.address.toLowerCase() === currentVault.address.toLowerCase()) { - currentVaultData = v; - } - }); - } else { - const vaultID = await currentVault.userToVault(address); - if (!vaultID.eq(0)) { - const vault = await currentVault.vaults(vaultID); - currentVaultData = { - vaultId: vaultID, - collateral: vault.Collateral, - debt: vault.Debt, - }; - } - } */ - const vaultID = await currentVault.userToVault(address); - if (!vaultID.eq(0)) { - const vault = await currentVault.vaults(vaultID); - currentVaultData = { - vaultId: vaultID, - collateral: vault.Collateral, - debt: vault.Debt, - }; - } - - if (vaultType !== "ETH") { - // @ts-ignore - balance = await currentToken.balanceOf(address); - } - - let decimals = 18; - let currentPrice; - - if (currentVaultData) { - const { vaultId, collateral, debt } = currentVaultData; - // @ts-ignore - const allowanceCall = await currentTokenRead.allowance(address, currentVault.address); - const currentRatioCall = await currentVaultRead.getVaultRatio(vaultId); - - // @ts-ignore - const currentTCAPPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - // @ts-ignore - const decimalsCall = await currentTokenRead.decimals(); - // @ts-ignore - const currentPriceCall = await currentOracleRead.getLatestAnswer(); - const currentMinRatioCall = await currentVaultRead.ratio(); - - // @ts-ignore - const [ - allowance, - currentRatio, - currentTCAPPrice, - decimalsVal, - currentPriceVal, - currentMinRatio, - ] = await signer.ethcallProvider?.all([ - allowanceCall, - currentRatioCall, - currentTCAPPriceCall, - decimalsCall, - currentPriceCall, - currentMinRatioCall, - ]); - - decimals = decimalsVal; - currentPrice = ethers.utils.formatEther(currentPriceVal.mul(10000000000)); - setSelectedVaultId(vaultId); - - if (!allowance.isZero() || vaultType === "ETH") { - const safeValue = isHardMode() ? 20 : 50; - const warnValue = isHardMode() ? 10 : 30; - - setMinRatio(currentMinRatio.toString()); - setIsApproved(true); - setVaultRatio(currentRatio.toString()); - if (currentRatio.toString() === "0") { - setVaultStatus("N/A"); - } else if ( - currentRatio.toString() >= - parseFloat(currentMinRatio.toString()) + safeValue - ) { - setVaultStatus("safe"); - } else if ( - currentRatio.toString() >= - parseFloat(currentMinRatio.toString()) + warnValue - ) { - setVaultStatus("warning"); - } else { - setVaultStatus("danger"); - } - - const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); - - // const parsedCollateral = ethers.utils.formatEther(collateral); - setVaultCollateral(parsedCollateral); - const usdCollateral = toUSD(currentPrice, parsedCollateral); - setVaultCollateralUSD(usdCollateral.toString()); - - const currentTCAPPriceFormat = ethers.utils.formatEther(currentTCAPPrice); - const parsedDebt = ethers.utils.formatEther(debt); - setVaultDebt(parsedDebt); - const usdTCAP = toUSD(currentTCAPPriceFormat, parsedDebt); - setVaultDebtUSD(usdTCAP.toString()); - } else { - setText(t("vault.approve-text")); - setTitle(t("vault.approve")); - setIsApproved(false); - } - } else { - // @ts-ignore - const decimalsCall = await currentTokenRead.decimals(); - // @ts-ignore - const currentPriceCall = await currentOracleRead.getLatestAnswer(); - // @ts-ignore - const [decimalsVal, currentPriceVal] = await signer.ethcallProvider?.all([ - decimalsCall, - currentPriceCall, - ]); - decimals = decimalsVal; - currentPrice = ethers.utils.formatEther(currentPriceVal.mul(10000000000)); - - setSelectedVaultId("0"); - setText(t("vault.create-text")); - setTitle(t("vault.create")); - setIsApproved(false); - } - - setSelectedVaultDecimals(decimals); - const currentBalance = ethers.utils.formatUnits(balance, decimals); - if (parseFloat(currentBalance) < 0.09) { - setTokenBalanceDecimals(4); - } else { - setTokenBalanceDecimals(2); - } - setTokenBalance(currentBalance); - - const usdBalance = toUSD(currentPrice, currentBalance); - setTokenBalanceUSD(usdBalance.toString()); - setLoadingMode(false); - } - } - - const { data, error, refetch, networkStatus } = useQuery(USER_VAULT, { - variables: { owner: address }, - pollInterval: 200000, - fetchPolicy: "no-cache", - notifyOnNetworkStatusChange: true, - onError: () => { - console.log(error); - }, - onCompleted: () => { - let vaultType = selectedVault; - if (isPolygon(currentNetwork.chainId) && vaultType === "ETH") { - vaultType = "MATIC"; - setSelectedVault("MATIC"); - } - loadVault(vaultType, data); - }, - }); - - const refresh = async () => { - try { - if (!isOptimism(currentNetwork.chainId)) { - await refetch(); - } else { - loadVault(selectedVault, data); - } - } catch (error) { - console.log(error); - // catch error in case the vault screen is changed - } - }; - - const resetFields = () => { - setBurnFee("0"); - setAddCollateralUSD("0"); - setAddCollateralTxt(""); - setRemoveCollateralTxt(""); - setRemoveCollateralUSD("0"); - setMintTxt(""); - setMintUSD("0"); - setBurnUSD("0"); - setBurnTxt(""); - }; - - const handleRadioBtnChange = async (value: string) => { - setLoadingMode(true); - setVaultMode(value); - setIsApproved(false); - setTokenBalance("0"); - setTokenBalanceUSD("0"); - setSelectedVault("ETH"); - - history?.push(`/vault/ETH`); - resetFields(); - await refetch(); - }; - - const changeVault = async (newRatio: number, reset = false) => { - const safeValue = isHardMode() ? 20 : 50; - const warnValue = isHardMode() ? 10 : 30; - let r = newRatio; - - if (reset) { - r = parseFloat(tempRatio); - setVaultRatio(tempRatio); - setTempRatio(""); - resetFields(); - } else { - if (tempRatio === "") { - setTempRatio(vaultRatio); - } - r = newRatio; - setVaultRatio(r.toString()); - } - - if (r === 0) { - setVaultStatus(t("vault.status.na")); - } else if (r >= parseFloat(minRatio) + safeValue) { - setVaultStatus(t("vault.status.safe")); - } else if (r >= parseFloat(minRatio) + warnValue) { - setVaultStatus(t("vault.status.warning")); - } else if (r >= parseFloat(minRatio)) { - setVaultStatus(t("vault.status.danger")); - } else { - setVaultRatio("0"); - setVaultStatus(t("vault.status.error")); - } - }; - - // forms - const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { - if (isHardMode()) { - const d = parseFloat(vaultDebt); - let newDebt = 0; - if (isMint) { - newDebt = amount + d; - } else { - newDebt = d - amount; - } - return newDebt >= 20 || newDebt === 0; - } - return true; - }; - - const onChangeAddCollateral = async (event: React.ChangeEvent) => { - setAddCollateralTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - let usd = toUSD(currentPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); - changeVault(r); - setAddCollateralUSD(usd.toString()); - } else { - changeVault(0, true); - setAddCollateralUSD("0"); - } - }; - - const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { - setRemoveCollateralTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - let usd = toUSD(currentPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); - changeVault(r); - setRemoveCollateralUSD(usd.toString()); - } else { - changeVault(0, true); - setRemoveCollateralUSD("0"); - } - }; - - const onChangeMint = async (event: React.ChangeEvent) => { - setMintTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - let usd = toUSD(currentTcapPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); - const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentTcapPrice); - changeVault(r); - setMintUSD(usd.toString()); - } else { - changeVault(0, true); - setMintUSD("0"); - } - }; - - const onChangeBurn = async (event: React.ChangeEvent) => { - try { - setBurnTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - let usd = toUSD(currentTcapPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); - const r = await getRatio( - vaultCollateral, - currentPrice, - newDebt.toString(), - currentTcapPrice - ); - changeVault(r); - setBurnUSD(usd.toString()); - const currentBurnFee = await selectedVaultContract?.getFee( - ethers.utils.parseEther(event.target.value) - ); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - } else { - changeVault(0, true); - setBurnUSD("0"); - setBurnFee("0"); - } - } catch (error) { - console.error(error); - changeVault(0, true); - setBurnUSD("0"); - setBurnFee("0"); - } - }; - - const addCollateral = async () => { - if (addCollateralTxt) { - setBtnDisabled(true); - // fix decimals - const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); - try { - if (isGasAsset()) { - let tx; - if (selectedVault === "ETH") { - tx = await selectedVaultContract?.addCollateralETH({ - value: amount, - }); - } else { - tx = await selectedVaultContract?.addCollateralMATIC({ - value: amount, - }); - } - notifyUser(tx, refresh); - } else { - const tx = await selectedVaultContract?.addCollateral(amount); - notifyUser(tx, refresh); - } - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("errors.no-funds")); - } - } - setBtnDisabled(false); - setAddCollateralTxt(""); - setAddCollateralUSD("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const maxAddCollateral = async (e: React.MouseEvent) => { - e.preventDefault(); - let balance = "0"; - if (selectedVault === "ETH") { - const provider = getDefaultProvider(currentNetwork.chainId, currentNetwork.name); - balance = ethers.utils.formatEther(await provider.getBalance(address)); - } else if (selectedCollateralContract) { - const value = BigNumber.from(await selectedCollateralContract.balanceOf(address)); - balance = ethers.utils.formatUnits(value, selectedVaultDecimals); - } - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - setAddCollateralTxt(balance); - let usd = toUSD(currentPrice, balance); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(balance) + parseFloat(vaultCollateral); - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); - changeVault(r); - setAddCollateralUSD(usd.toString()); - }; - - const removeCollateral = async () => { - if (removeCollateralTxt) { - const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); - setBtnDisabled(true); - try { - if (isGasAsset()) { - let tx; - if (selectedVault === "ETH") { - tx = await selectedVaultContract?.removeCollateralETH(amount); - } else { - tx = await selectedVaultContract?.removeCollateralMATIC(amount); - } - notifyUser(tx, refresh); - } else { - const tx = await selectedVaultContract?.removeCollateral(amount); - notifyUser(tx, refresh); - } - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.tran-rejected")); - } - } - setBtnDisabled(false); - setRemoveCollateralTxt(""); - setRemoveCollateralUSD("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const safeRemoveCollateral = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - let collateralToRemove = await getSafeRemoveCollateral( - minRatio, - vaultCollateral, - currentPrice, - currentTcapPrice, - vaultDebt, - isHardMode() - ); - if (selectedVaultDecimals === 8) { - collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; - collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); - } - setRemoveCollateralTxt(collateralToRemove.toString()); - let usd = toUSD(currentPrice, collateralToRemove.toString()); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(vaultCollateral) - collateralToRemove; - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); - changeVault(r); - setRemoveCollateralUSD(usd.toString()); - }; - - const mintTCAP = async () => { - if (mintTxt) { - if (isMinRequiredTcap(parseFloat(mintTxt), true)) { - setBtnDisabled(true); - try { - const amount = ethers.utils.parseEther(mintTxt); - const tx = await selectedVaultContract?.mint(amount); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.no-collateral")); - } - } - setBtnDisabled(false); - setMintTxt(""); - setMintUSD("0"); - } else { - errorNotification(t("vault.errors.min-tcap")); - } - } else { - errorNotification(t("errors.empty")); - } - }; - - const safeMintTCAP = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - const safeMint = await getSafeMint( - minRatio, - vaultCollateral, - currentPrice, - currentTcapPrice, - vaultDebt, - isHardMode() - ); - setMintTxt(safeMint.toString()); - let usd = toUSD(currentTcapPrice, safeMint.toString()); - if (!usd) { - usd = 0; - } - const newDebt = safeMint + parseFloat(vaultDebt); - const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentTcapPrice); - changeVault(r); - setMintUSD(usd.toString()); - }; - - const burnTCAP = async () => { - if (burnTxt) { - if (isMinRequiredTcap(parseFloat(burnTxt), false)) { - const amount = ethers.utils.parseEther(burnTxt); - setBtnDisabled(true); - try { - const currentBurnFee = await selectedVaultContract?.getFee(amount); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - const tx = await selectedVaultContract?.burn(amount, { value: increasedFee }); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.burn-too-high")); - } - } - setBtnDisabled(false); - setBurnTxt(""); - setBurnUSD("0"); - setBurnFee("0"); - } else { - errorNotification(t("vault.errors.min-tcap2")); - } - } else { - errorNotification(t("errors.empty")); - } - }; - - const maxBurnTCAP = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - const currentBalanceCall = await tokens.tcapTokenRead?.balanceOf(address); - const currentVaultDebtCall = await selectedVaultRead?.vaults(selectedVaultId); - - // @ts-ignore - const [currentBalance, currentVault] = await signer.ethcallProvider?.all([ - currentBalanceCall, - currentVaultDebtCall, - ]); - - let balanceFormat = "0"; - let balance; - if (currentBalance.lt(currentVault.Debt)) { - balanceFormat = ethers.utils.formatEther(currentBalance); - balance = currentBalance; - } else { - balanceFormat = vaultDebt; - balance = currentVault.Debt; - } - setBurnTxt(balanceFormat); - let usd = toUSD(currentTcapPrice, balanceFormat); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(balanceFormat) - parseFloat(balanceFormat); - const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentTcapPrice); - changeVault(r); - setBurnUSD(usd.toString()); - - if (balanceFormat !== "0") { - const currentBurnFee = await selectedVaultContract?.getFee(balance); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - } else { - setBurnFee("0"); - } - }; - - const action = async () => { - if (selectedVaultId === "0") { - setBtnDisabled(true); - try { - const tx = await selectedVaultContract?.createVault(); - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification(t("errors.tran-rejected")); - } - } - setBtnDisabled(false); - } else { - setBtnDisabled(true); - try { - const amount = approveValue; - const tx = await selectedCollateralContract?.approve( - selectedVaultContract?.address, - amount - ); - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification(t("errors.tran-rejected")); - } - } - setBtnDisabled(false); - } - }; - - const handleTokenChange = async (value: string) => { - setIsApproved(false); - setTokenBalance("0"); - setTokenBalanceUSD("0"); - setSelectedVault(value); - // Clean form - setAddCollateralTxt(""); - setAddCollateralUSD("0"); - setRemoveCollateralTxt(""); - setRemoveCollateralUSD("0"); - setMintTxt(""); - setMintUSD("0"); - setBurnTxt(""); - setBurnUSD("0"); - setBurnFee("0"); - // Load values - history?.push(`/vault/${value}`); - await refetch(); - }; - - useEffect(() => { - async function load() { - let vOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK", "WBTC"]; - if (isHardMode()) { - vOptions = ["ETH", "WETH", "DAI", "USDC"]; - } - if (isOptimism(currentNetwork.chainId) && !isHardMode()) { - vOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; - } - if (isPolygon(currentNetwork.chainId) && !isHardMode()) { - vOptions = ["MATIC", "DAI", "WBTC"]; - } - setVaultOptions(vOptions); - // TODO : if stuck at pending do something - if (networkStatus === NetworkStatus.ready || networkStatus === NetworkStatus.error) { - setIsLoading(false); - } - } - load(); - // eslint-disable-next-line - }, [address, data]); - - if (isLoading) { - return ( -

- -
- ); - } - - const CollateralDropdown = () => ( -
-
Collateral:
- handleTokenChange(eventKey || "ETH")}> - -
- {selectedVault.toUpperCase()} -
-
- - {vaultOptions.map((item) => ( - - {item} - - ))} - -
-
- ); - - const CollateralBalance = () => ( -
-
- {(() => { - switch (selectedVault) { - case "DAI": - return ; - case "AAVE": - return ; - case "LINK": - return ; - case "UNI": - return ; - case "SNX": - return ; - case "MATIC": - return ; - case "WBTC": - return ; - case "USDC": - return ; - default: - return ; - } - })()} -

- -

-
-

- 1000 ? 0 : 2} - /> -

-
- ); - - const CollateralBalance2 = () => ( -
-
- {(() => { - switch (selectedVault) { - case "DAI": - return ; - case "AAVE": - return ; - case "LINK": - return ; - case "UNI": - return ; - case "SNX": - return ; - case "MATIC": - return ; - case "WBTC": - return ; - case "USDC": - return ; - default: - return ; - } - })()} -

- -

- / -
- 1000 ? 0 : 2} - /> -
- ); - - /* if (loadingMode) { - return ; - } */ - - return ( - <> -
- - {radios.map((radio, idx) => ( - handleRadioBtnChange(e.currentTarget.value)} - > - {radio.name} - - ))} - - {isHardMode() && ( - - {t("vault.hard-mode-info")}
- {t("vault.hard-mode-info2")} - - } - > - -
- )} -
- {loadingMode ? ( -
- -
- ) : ( - <> - {isApproved ? ( - <> -
-
- - - - - -
-

{t("vault.balance-title", { vault: selectedVault })}

- -
-
-
- - -
-

{t("vault.ratio-title")}

{" "} - - {t("vault.ratio-warning", { minRatio })} - - } - > - - -
-
-

- -

-
-

{vaultStatus.toUpperCase()}

-
-
-
-
-
- -
-

{t("vault.collateral.title")}

-
-
- {(() => { - switch (selectedVault) { - case "DAI": - return ; - case "AAVE": - return ; - case "LINK": - return ; - case "SNX": - return ; - case "UNI": - return ; - case "MATIC": - return ; - case "WBTC": - return ; - case "USDC": - return ; - default: - return ; - } - })()} -

- -

-
-

- 1000 ? 0 : 2} - /> -

-
-
-
- - {t("vault.collateral.add")} - - - {t("max")} - - - - - - - - - - - - - - {t("vault.collateral.remove")} - - - {t("max-safe")} - - - - - - - - - - - - - -
-
-
- -
-

{t("vault.debt.title")}

-
-
- -

- -

-
-

- 1000 ? 0 : 2} - /> -

-
-
-
- - {t("vault.debt.mint")} - - - {t("max-safe")} - - - - - - - - - - - - - - {t("vault.debt.burn")} - - - {t("max")} - - - - - - - - - - - - - {t("vault.debt.fee")}:{" "} - {" "} - {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} - - - -
-
-
- - ) : ( -
- - - - - - -
{title}
-

{text}

- -
-
-
- )} - - )} - - ); -}; - -export default Details; diff --git a/src/components/Vault/Mint.tsx b/src/components/Vault/Mint.tsx index 0bcbe67..81b8717 100644 --- a/src/components/Vault/Mint.tsx +++ b/src/components/Vault/Mint.tsx @@ -167,7 +167,7 @@ const Mint = ({ address, t }: props) => { // Inputs const [addCollateralTxt, setAddCollateralTxt] = useState("0"); const [addCollateralUSD, setAddCollateralUSD] = useState("0"); - const [removeCollateralTxt, setRemoveCollateralTxt] = useState(""); + const [removeCollateralTxt, setRemoveCollateralTxt] = useState("0"); const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); const [mintTxt, setMintTxt] = useState("0"); const [mintUSD, setMintUSD] = useState("0"); @@ -575,13 +575,13 @@ const Mint = ({ address, t }: props) => { const resetFields = () => { setBurnFee("0"); setAddCollateralUSD("0"); - setAddCollateralTxt(""); - setRemoveCollateralTxt(""); + setAddCollateralTxt("0"); + setRemoveCollateralTxt("0"); setRemoveCollateralUSD("0"); - setMintTxt(""); + setMintTxt("0"); setMintUSD("0"); setBurnUSD("0"); - setBurnTxt(""); + setBurnTxt("0"); }; const handleRadioBtnChange = async (value: string) => { @@ -658,11 +658,23 @@ const Mint = ({ address, t }: props) => { changeVault(r); setAddCollateralUSD(usd.toString()); } else { - changeVault(0, true); + changeVault(0, false); setAddCollateralUSD("0"); } }; + const onFocusAddCollateral = () => { + if (addCollateralTxt && parseFloat(addCollateralTxt) === 0) { + setAddCollateralTxt(""); + } + }; + + const onBlurAddCollateral = () => { + if (!addCollateralTxt) { + setAddCollateralTxt("0"); + } + }; + const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { setRemoveCollateralTxt(event.target.value); if (event.target.value !== "") { @@ -677,11 +689,23 @@ const Mint = ({ address, t }: props) => { changeVault(r); setRemoveCollateralUSD(usd.toString()); } else { - changeVault(0, true); + changeVault(0, false); setRemoveCollateralUSD("0"); } }; + const onFocusRemoveCollateral = () => { + if (removeCollateralTxt && parseFloat(removeCollateralTxt) === 0) { + setRemoveCollateralTxt(""); + } + }; + + const onBlurRemoveCollateral = () => { + if (!removeCollateralTxt) { + setRemoveCollateralTxt("0"); + } + }; + const onChangeMint = async (event: React.ChangeEvent) => { setMintTxt(event.target.value); if (event.target.value !== "") { @@ -696,11 +720,23 @@ const Mint = ({ address, t }: props) => { changeVault(r); setMintUSD(usd.toString()); } else { - changeVault(0, true); + changeVault(0, false); setMintUSD("0"); } }; + const onFocusMint = () => { + if (mintTxt && parseFloat(mintTxt) === 0) { + setMintTxt(""); + } + }; + + const onBlurMint = () => { + if (!mintTxt) { + setMintTxt("0"); + } + }; + const onChangeBurn = async (event: React.ChangeEvent) => { try { setBurnTxt(event.target.value); @@ -727,7 +763,7 @@ const Mint = ({ address, t }: props) => { const ethFee = ethers.utils.formatEther(increasedFee); setBurnFee(ethFee.toString()); } else { - changeVault(0, true); + changeVault(0, false); setBurnUSD("0"); setBurnFee("0"); } @@ -739,8 +775,20 @@ const Mint = ({ address, t }: props) => { } }; + const onFocusBurn = () => { + if (burnTxt && parseFloat(burnTxt) === 0) { + setBurnTxt(""); + } + }; + + const onBlurBurn = () => { + if (!burnTxt) { + setBurnTxt("0"); + } + }; + const addCollateral = async () => { - if (addCollateralTxt) { + if (addCollateralTxt && parseFloat(addCollateralTxt) > 0) { setBtnDisabled(true); // fix decimals const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); @@ -770,7 +818,7 @@ const Mint = ({ address, t }: props) => { } } setBtnDisabled(false); - setAddCollateralTxt(""); + setAddCollateralTxt("0"); setAddCollateralUSD("0"); } else { errorNotification(t("errors.empty")); @@ -801,7 +849,7 @@ const Mint = ({ address, t }: props) => { }; const removeCollateral = async () => { - if (removeCollateralTxt) { + if (removeCollateralTxt && parseFloat(removeCollateralTxt) > 0) { const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); setBtnDisabled(true); try { @@ -826,7 +874,7 @@ const Mint = ({ address, t }: props) => { } } setBtnDisabled(false); - setRemoveCollateralTxt(""); + setRemoveCollateralTxt("0"); setRemoveCollateralUSD("0"); } else { errorNotification(t("errors.empty")); @@ -861,7 +909,7 @@ const Mint = ({ address, t }: props) => { }; const mintTCAP = async () => { - if (mintTxt) { + if (mintTxt && parseFloat(mintTxt) > 0) { if (isMinRequiredTcap(parseFloat(mintTxt), true)) { setBtnDisabled(true); try { @@ -877,7 +925,7 @@ const Mint = ({ address, t }: props) => { } } setBtnDisabled(false); - setMintTxt(""); + setMintTxt("0"); setMintUSD("0"); } else { errorNotification(t("vault.errors.min-tcap")); @@ -911,32 +959,28 @@ const Mint = ({ address, t }: props) => { }; const burnTCAP = async () => { - if (burnTxt) { - if (isMinRequiredTcap(parseFloat(burnTxt), false)) { - const amount = ethers.utils.parseEther(burnTxt); - setBtnDisabled(true); - try { - const currentBurnFee = await selectedVaultContract?.getFee(amount); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - const tx = await selectedVaultContract?.burn(amount, { value: increasedFee }); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.burn-too-high")); - } + if (burnTxt && parseFloat(burnTxt) > 0) { + const amount = ethers.utils.parseEther(burnTxt); + setBtnDisabled(true); + try { + const currentBurnFee = await selectedVaultContract?.getFee(amount); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + const tx = await selectedVaultContract?.burn(amount, { value: increasedFee }); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.burn-too-high")); } - setBtnDisabled(false); - setBurnTxt(""); - setBurnUSD("0"); - setBurnFee("0"); - } else { - errorNotification(t("vault.errors.min-tcap2")); } + setBtnDisabled(false); + setBurnTxt("0"); + setBurnUSD("0"); + setBurnFee("0"); } else { errorNotification(t("errors.empty")); } @@ -1232,7 +1276,7 @@ const Mint = ({ address, t }: props) => { -
+

{t("vault.balance-title", { vault: selectedVault })}

@@ -1271,251 +1315,255 @@ const Mint = ({ address, t }: props) => {
-
-
-
-
-

{t("vault.collateral.title")}

-
-
- {(() => { - switch (selectedVault) { - case "DAI": - return ; - case "AAVE": - return ; - case "LINK": - return ; - case "SNX": - return ; - case "UNI": - return ; - case "MATIC": - return ; - case "WBTC": - return ; - case "USDC": - return ; - default: - return ; - } - })()} -

- -

-
-

+

+ +
+

{t("vault.collateral.title")}

+
+
+ {(() => { + switch (selectedVault) { + case "DAI": + return ; + case "AAVE": + return ; + case "LINK": + return ; + case "SNX": + return ; + case "UNI": + return ; + case "MATIC": + return ; + case "WBTC": + return ; + case "USDC": + return ; + default: + return ; + } + })()} +

1000 ? 0 : 2} + decimalScale={2} /> -

+

+

+ 1000 ? 0 : 2} + /> +

- -
- - Add Collateral - - - {t("max")} - - - - - - - - - - - - - - Remove Collateral - - - {t("max-safe")} - - - - - - - - - - - - - -
-
-
-

{t("vault.debt.title")}

-
-
- -

- -

-
-

+
+ + Add {selectedVault} + + + {t("max")} + + + + + + + + + + + + + + Remove {selectedVault} + + + {t("max-safe")} + + + + + + + + + + + + + + +

+
+ +
+

{t("vault.debt.title")}

+
+
+ +

1000 ? 0 : 2} + decimalScale={2} /> -

+

+

+ 1000 ? 0 : 2} + /> +

- -
- - {t("vault.debt.mint")} - - - {t("max-safe")} - - - - - - - - - - - - - - {t("vault.debt.burn")} - - - {t("max")} - - - - - - - - - - - - - {t("vault.debt.fee")}:{" "} - {" "} - {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} - - - -
-
+
+ + {t("vault.debt.mint")} + + + {t("max-safe")} + + + + + + + + + + + + + + {t("vault.debt.burn")} + + + {t("max")} + + + + + + + + + + + + + {t("vault.debt.fee")}:{" "} + {" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} + + + +
diff --git a/src/components/Vault/Mint2.tsx b/src/components/Vault/Mint2.tsx index ba5c779..9ac8705 100644 --- a/src/components/Vault/Mint2.tsx +++ b/src/components/Vault/Mint2.tsx @@ -19,7 +19,7 @@ import TokensContext from "../../state/TokensContext"; import VaultsContext from "../../state/VaultsContext"; import HardVaultsContext from "../../state/HardVaultsContext"; import SignerContext from "../../state/SignerContext"; -import "../../styles/mint2.scss"; +import "../../styles/mint.scss"; import { ReactComponent as ETHIconSmall } from "../../assets/images/vault/eth.svg"; import { ReactComponent as DAIIconSmall } from "../../assets/images/vault/dai.svg"; import { ReactComponent as AAVEIconSmall } from "../../assets/images/vault/aave.svg"; @@ -167,7 +167,7 @@ const Mint2 = ({ address, t }: props) => { // Inputs const [addCollateralTxt, setAddCollateralTxt] = useState("0"); const [addCollateralUSD, setAddCollateralUSD] = useState("0"); - const [removeCollateralTxt, setRemoveCollateralTxt] = useState("0"); + const [removeCollateralTxt, setRemoveCollateralTxt] = useState(""); const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); const [mintTxt, setMintTxt] = useState("0"); const [mintUSD, setMintUSD] = useState("0"); @@ -575,13 +575,13 @@ const Mint2 = ({ address, t }: props) => { const resetFields = () => { setBurnFee("0"); setAddCollateralUSD("0"); - setAddCollateralTxt("0"); - setRemoveCollateralTxt("0"); + setAddCollateralTxt(""); + setRemoveCollateralTxt(""); setRemoveCollateralUSD("0"); - setMintTxt("0"); + setMintTxt(""); setMintUSD("0"); setBurnUSD("0"); - setBurnTxt("0"); + setBurnTxt(""); }; const handleRadioBtnChange = async (value: string) => { @@ -658,23 +658,11 @@ const Mint2 = ({ address, t }: props) => { changeVault(r); setAddCollateralUSD(usd.toString()); } else { - changeVault(0, false); + changeVault(0, true); setAddCollateralUSD("0"); } }; - const onFocusAddCollateral = () => { - if (addCollateralTxt && parseFloat(addCollateralTxt) === 0) { - setAddCollateralTxt(""); - } - }; - - const onBlurAddCollateral = () => { - if (!addCollateralTxt) { - setAddCollateralTxt("0"); - } - }; - const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { setRemoveCollateralTxt(event.target.value); if (event.target.value !== "") { @@ -689,23 +677,11 @@ const Mint2 = ({ address, t }: props) => { changeVault(r); setRemoveCollateralUSD(usd.toString()); } else { - changeVault(0, false); + changeVault(0, true); setRemoveCollateralUSD("0"); } }; - const onFocusRemoveCollateral = () => { - if (removeCollateralTxt && parseFloat(removeCollateralTxt) === 0) { - setRemoveCollateralTxt(""); - } - }; - - const onBlurRemoveCollateral = () => { - if (!removeCollateralTxt) { - setRemoveCollateralTxt("0"); - } - }; - const onChangeMint = async (event: React.ChangeEvent) => { setMintTxt(event.target.value); if (event.target.value !== "") { @@ -720,23 +696,11 @@ const Mint2 = ({ address, t }: props) => { changeVault(r); setMintUSD(usd.toString()); } else { - changeVault(0, false); + changeVault(0, true); setMintUSD("0"); } }; - const onFocusMint = () => { - if (mintTxt && parseFloat(mintTxt) === 0) { - setMintTxt(""); - } - }; - - const onBlurMint = () => { - if (!mintTxt) { - setMintTxt("0"); - } - }; - const onChangeBurn = async (event: React.ChangeEvent) => { try { setBurnTxt(event.target.value); @@ -763,7 +727,7 @@ const Mint2 = ({ address, t }: props) => { const ethFee = ethers.utils.formatEther(increasedFee); setBurnFee(ethFee.toString()); } else { - changeVault(0, false); + changeVault(0, true); setBurnUSD("0"); setBurnFee("0"); } @@ -775,20 +739,8 @@ const Mint2 = ({ address, t }: props) => { } }; - const onFocusBurn = () => { - if (burnTxt && parseFloat(burnTxt) === 0) { - setBurnTxt(""); - } - }; - - const onBlurBurn = () => { - if (!burnTxt) { - setBurnTxt("0"); - } - }; - const addCollateral = async () => { - if (addCollateralTxt && parseFloat(addCollateralTxt) > 0) { + if (addCollateralTxt) { setBtnDisabled(true); // fix decimals const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); @@ -818,7 +770,7 @@ const Mint2 = ({ address, t }: props) => { } } setBtnDisabled(false); - setAddCollateralTxt("0"); + setAddCollateralTxt(""); setAddCollateralUSD("0"); } else { errorNotification(t("errors.empty")); @@ -849,7 +801,7 @@ const Mint2 = ({ address, t }: props) => { }; const removeCollateral = async () => { - if (removeCollateralTxt && parseFloat(removeCollateralTxt) > 0) { + if (removeCollateralTxt) { const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); setBtnDisabled(true); try { @@ -874,7 +826,7 @@ const Mint2 = ({ address, t }: props) => { } } setBtnDisabled(false); - setRemoveCollateralTxt("0"); + setRemoveCollateralTxt(""); setRemoveCollateralUSD("0"); } else { errorNotification(t("errors.empty")); @@ -909,7 +861,7 @@ const Mint2 = ({ address, t }: props) => { }; const mintTCAP = async () => { - if (mintTxt && parseFloat(mintTxt) > 0) { + if (mintTxt) { if (isMinRequiredTcap(parseFloat(mintTxt), true)) { setBtnDisabled(true); try { @@ -925,7 +877,7 @@ const Mint2 = ({ address, t }: props) => { } } setBtnDisabled(false); - setMintTxt("0"); + setMintTxt(""); setMintUSD("0"); } else { errorNotification(t("vault.errors.min-tcap")); @@ -959,28 +911,32 @@ const Mint2 = ({ address, t }: props) => { }; const burnTCAP = async () => { - if (burnTxt && parseFloat(burnTxt) > 0) { - const amount = ethers.utils.parseEther(burnTxt); - setBtnDisabled(true); - try { - const currentBurnFee = await selectedVaultContract?.getFee(amount); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - const tx = await selectedVaultContract?.burn(amount, { value: increasedFee }); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.burn-too-high")); + if (burnTxt) { + if (isMinRequiredTcap(parseFloat(burnTxt), false)) { + const amount = ethers.utils.parseEther(burnTxt); + setBtnDisabled(true); + try { + const currentBurnFee = await selectedVaultContract?.getFee(amount); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + const tx = await selectedVaultContract?.burn(amount, { value: increasedFee }); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.burn-too-high")); + } } + setBtnDisabled(false); + setBurnTxt(""); + setBurnUSD("0"); + setBurnFee("0"); + } else { + errorNotification(t("vault.errors.min-tcap2")); } - setBtnDisabled(false); - setBurnTxt("0"); - setBurnUSD("0"); - setBurnFee("0"); } else { errorNotification(t("errors.empty")); } @@ -1276,7 +1232,7 @@ const Mint2 = ({ address, t }: props) => { -
+

{t("vault.balance-title", { vault: selectedVault })}

@@ -1315,255 +1271,251 @@ const Mint2 = ({ address, t }: props) => {
-
- -
-

{t("vault.collateral.title")}

-
-
- {(() => { - switch (selectedVault) { - case "DAI": - return ; - case "AAVE": - return ; - case "LINK": - return ; - case "SNX": - return ; - case "UNI": - return ; - case "MATIC": - return ; - case "WBTC": - return ; - case "USDC": - return ; - default: - return ; - } - })()} -

+
+
+
+
+

{t("vault.collateral.title")}

+
+
+ {(() => { + switch (selectedVault) { + case "DAI": + return ; + case "AAVE": + return ; + case "LINK": + return ; + case "SNX": + return ; + case "UNI": + return ; + case "MATIC": + return ; + case "WBTC": + return ; + case "USDC": + return ; + default: + return ; + } + })()} +

+ +

+
+

1000 ? 0 : 2} /> -

+

-

- 1000 ? 0 : 2} - /> -

+ +
+ + Add Collateral + + + {t("max")} + + + + + + + + + + + + + + Remove Collateral + + + {t("max-safe")} + + + + + + + + + + + + + +
-
- - Add {selectedVault} - - - {t("max")} - - - - - - - - - - - - - - Remove {selectedVault} - - - {t("max-safe")} - - - - - - - - - - - - - -
-
-
- -
-

{t("vault.debt.title")}

-
-
- -

+
+
+

{t("vault.debt.title")}

+
+
+ +

+ +

+
+

1000 ? 0 : 2} /> -

+

-

- 1000 ? 0 : 2} - /> -

+ +
+ + {t("vault.debt.mint")} + + + {t("max-safe")} + + + + + + + + + + + + + + {t("vault.debt.burn")} + + + {t("max")} + + + + + + + + + + + + + {t("vault.debt.fee")}:{" "} + {" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} + + + +
-
- - {t("vault.debt.mint")} - - - {t("max-safe")} - - - - - - - - - - - - - - {t("vault.debt.burn")} - - - {t("max")} - - - - - - - - - - - - - {t("vault.debt.fee")}:{" "} - {" "} - {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} - - - -
+
diff --git a/src/components/Vault/Vault.tsx b/src/components/Vault/Vault.tsx index 685830e..978fb78 100644 --- a/src/components/Vault/Vault.tsx +++ b/src/components/Vault/Vault.tsx @@ -3,10 +3,10 @@ import Button from "react-bootstrap/esm/Button"; import { useTranslation } from "react-i18next"; import { Web3ModalContext } from "../../state/Web3ModalContext"; import SignerContext from "../../state/SignerContext"; -import "../../styles/mint2.scss"; +import "../../styles/mint.scss"; import Loading from "../Loading"; -import Mint2 from "./Mint2"; +import Mint from "./Mint"; export const Vault = () => { const { t } = useTranslation(); @@ -53,7 +53,7 @@ export const Vault = () => {
) : ( - + )}
diff --git a/src/styles/mint.scss b/src/styles/mint.scss index 30a2ef3..4baf3b1 100644 --- a/src/styles/mint.scss +++ b/src/styles/mint.scss @@ -189,17 +189,10 @@ .collateral-balance { display: flex; - flex: 1; - flex-direction: column; - justify-content: center; - align-items: flex-end; + align-items: center; h4 { margin-bottom: 0rem; } - p { - margin-bottom: 0rem; - text-align: right; - } .number { color: $light; font-size: 1.1rem; @@ -320,7 +313,6 @@ } .actions-container { - display: flex; margin-top: 1rem; column-gap: 2rem; p { @@ -331,7 +323,7 @@ } .card-header { padding: 0rem; - padding-bottom: 2rem; + padding-bottom: 1.5rem; } .card-body { padding: 0rem; @@ -340,23 +332,45 @@ .info { display: flex; align-items: top; - height: 8rem; div { width: 100%; } p { text-align: right; - } + } + .collateral-balance { + flex-direction: column; + } .amount { display: flex; flex-direction: row; justify-content: flex-end; } - } + } .form-card { .card { - padding: 0; + min-height: 26.3rem; + padding: 0; + + .info { + border-bottom: 1px solid $dark; + padding: 1.5rem; + + p, + h4 { + padding-bottom: 0; + margin-bottom: 0; + } + h4 { + font-size: 1.4rem; + } + + .amount { + display: flex; + justify-content: flex-end; + } + } svg { //margin-top: -5px; @@ -368,10 +382,9 @@ } &.tcap-neon { - height: 1.8rem; - width: 2rem; margin-top: 0px; filter: none; + width: 1.9rem; } &.btc { margin-top: 0px; @@ -411,64 +424,16 @@ } } } - .info { - display: flex; - flex-direction: column; - background-color: $darker; - border-radius: 5px; - // border-bottom: 1px solid $dark; - padding: 1.5rem; - margin-bottom: 1rem; - - &-values { - display: flex; - flex-direction: row; - padding: 0.5rem; - margin-top: 0.7rem; - border: 0.7px solid $dark; - border-radius: 5px; - background-color: #281e31; - } - p { - font-size: 1.1rem; - margin-bottom: 0rem; - } - h4 { - font-size: 1.2rem; - padding-bottom: 0; - margin-bottom: 0; - } - .amount { - display: flex; - justify-content: flex-start; - align-items: center; - } - svg { - //margin-top: -5px; - vertical-align: top; - width: 0.8rem; - filter: brightness(1118%) drop-shadow(0px 0px 5px rgba(6, 52, 255, 0.53)); - @supports (-webkit-touch-callout: none) { - height: intrinsic; - } - &.tcap-neon { - margin-top: 0px; - filter: none; - width: 2rem; - } - } - } form { - padding: 1rem 1.5rem 1rem 1.5rem; - height: 21rem; + padding: 2rem 1.5rem 0rem 1.5rem; + label { font-family: "Nineteen Ninety Seven"; color: $white; &.max { float: right; - font-size: 0.85rem; @media (min-width: 992px) and (max-width: 1300px) { font-size: 0.9rem; } @@ -481,29 +446,26 @@ } } } - .input-group { - padding: 0.7rem 0.5rem; + background-color: #281e31; border: 1px solid $dark; border-radius: 5px; - background-color: #281e31; - } - .form-group.remove { - margin-top: 3rem; } + .text-muted { position: absolute; - text-align: right; + text-align: left; font-size: 0.85rem; - margin-top: -1.8rem; - margin-left: 1rem; + margin-top: -1.7rem; + padding-left: 1rem; } .burn-fee.text-muted { position: relative; text-align: right; + font-size: 1rem; margin-top: 0.5rem; - margin-right: 0.5rem; + margin-right: 0.2rem; margin-bottom: 0; padding-bottom: 0; font-size: 0.8rem; @@ -511,27 +473,27 @@ } input[type="number"] { - font-size: 1.1rem; - background: no-repeat; - border: 1px; + font-size: 1.2rem; + padding-bottom: 1.8rem; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + border-color: transparent; color: $white; - height: 2rem; - margin-right: 5px; - background-color: $darker; - border-radius: 5px; - } - input[type="number"]:focus { - box-shadow: inset -1px -5px 15px -19px $green; + height: 3.7rem; } .btn { + font-size: 0.8rem; background-color: $darker; width: 6rem; - height: 3.5rem; - border-radius: 4px; - font-size: 0.85rem; + height: 3.7rem; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + } + + .remove { + margin-top: 3rem; } - } } @@ -541,18 +503,15 @@ justify-content: space-between; .card { - min-height: 12rem; + min-height: 11rem; } - &-info { - display: flex; - flex-direction: row; - } .eth { filter: drop-shadow(0px 0px 15px rgba(111, 19, 202, 1)); } .ratio { + display: none; width: 1.9375rem; filter: drop-shadow(0px 0px 15px rgba(15, 217, 255, 0.53)); } @@ -563,7 +522,7 @@ } .info { - margin-top: 1rem; + margin-top: 1.7rem; .btn { margin-top: 0.7rem; @@ -635,22 +594,13 @@ min-height: 0rem; min-width: 0rem; } - - .test { - display: flex; - flex-direction: column; - .test2 { - display: flex; - flex-direction: row; - } - } } // Small devices (landscape phones, 576px and up) @media (min-width: 576px) { .actions-container { - // display: grid; - // grid-template-columns: auto; + display: grid; + grid-template-columns: auto; margin-bottom: 2rem; } @@ -667,8 +617,8 @@ // Large devices (desktops, 992px and up) @media (min-width: 992px) { .actions-container { - // display: grid; - // grid-template-columns: auto 33% 33%; + display: grid; + grid-template-columns: auto 33% 33%; margin-bottom: 0rem; } .balance { @@ -796,4 +746,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/styles/mint2.scss b/src/styles/mint2.scss index 4baf3b1..30a2ef3 100644 --- a/src/styles/mint2.scss +++ b/src/styles/mint2.scss @@ -189,10 +189,17 @@ .collateral-balance { display: flex; - align-items: center; + flex: 1; + flex-direction: column; + justify-content: center; + align-items: flex-end; h4 { margin-bottom: 0rem; } + p { + margin-bottom: 0rem; + text-align: right; + } .number { color: $light; font-size: 1.1rem; @@ -313,6 +320,7 @@ } .actions-container { + display: flex; margin-top: 1rem; column-gap: 2rem; p { @@ -323,7 +331,7 @@ } .card-header { padding: 0rem; - padding-bottom: 1.5rem; + padding-bottom: 2rem; } .card-body { padding: 0rem; @@ -332,45 +340,23 @@ .info { display: flex; align-items: top; + height: 8rem; div { width: 100%; } p { text-align: right; - } - .collateral-balance { - flex-direction: column; - } + } .amount { display: flex; flex-direction: row; justify-content: flex-end; } - } + } .form-card { .card { - min-height: 26.3rem; - padding: 0; - - .info { - border-bottom: 1px solid $dark; - padding: 1.5rem; - - p, - h4 { - padding-bottom: 0; - margin-bottom: 0; - } - h4 { - font-size: 1.4rem; - } - - .amount { - display: flex; - justify-content: flex-end; - } - } + padding: 0; svg { //margin-top: -5px; @@ -382,9 +368,10 @@ } &.tcap-neon { + height: 1.8rem; + width: 2rem; margin-top: 0px; filter: none; - width: 1.9rem; } &.btc { margin-top: 0px; @@ -424,16 +411,64 @@ } } } + .info { + display: flex; + flex-direction: column; + background-color: $darker; + border-radius: 5px; + // border-bottom: 1px solid $dark; + padding: 1.5rem; + margin-bottom: 1rem; - form { - padding: 2rem 1.5rem 0rem 1.5rem; + &-values { + display: flex; + flex-direction: row; + padding: 0.5rem; + margin-top: 0.7rem; + border: 0.7px solid $dark; + border-radius: 5px; + background-color: #281e31; + } + p { + font-size: 1.1rem; + margin-bottom: 0rem; + } + h4 { + font-size: 1.2rem; + padding-bottom: 0; + margin-bottom: 0; + } + .amount { + display: flex; + justify-content: flex-start; + align-items: center; + } + svg { + //margin-top: -5px; + vertical-align: top; + width: 0.8rem; + filter: brightness(1118%) drop-shadow(0px 0px 5px rgba(6, 52, 255, 0.53)); + @supports (-webkit-touch-callout: none) { + height: intrinsic; + } + &.tcap-neon { + margin-top: 0px; + filter: none; + width: 2rem; + } + } + } + form { + padding: 1rem 1.5rem 1rem 1.5rem; + height: 21rem; label { font-family: "Nineteen Ninety Seven"; color: $white; &.max { float: right; + font-size: 0.85rem; @media (min-width: 992px) and (max-width: 1300px) { font-size: 0.9rem; } @@ -446,26 +481,29 @@ } } } + .input-group { - background-color: #281e31; + padding: 0.7rem 0.5rem; border: 1px solid $dark; border-radius: 5px; + background-color: #281e31; + } + .form-group.remove { + margin-top: 3rem; } - .text-muted { position: absolute; - text-align: left; + text-align: right; font-size: 0.85rem; - margin-top: -1.7rem; - padding-left: 1rem; + margin-top: -1.8rem; + margin-left: 1rem; } .burn-fee.text-muted { position: relative; text-align: right; - font-size: 1rem; margin-top: 0.5rem; - margin-right: 0.2rem; + margin-right: 0.5rem; margin-bottom: 0; padding-bottom: 0; font-size: 0.8rem; @@ -473,27 +511,27 @@ } input[type="number"] { - font-size: 1.2rem; - padding-bottom: 1.8rem; - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; - border-color: transparent; + font-size: 1.1rem; + background: no-repeat; + border: 1px; color: $white; - height: 3.7rem; + height: 2rem; + margin-right: 5px; + background-color: $darker; + border-radius: 5px; + } + input[type="number"]:focus { + box-shadow: inset -1px -5px 15px -19px $green; } .btn { - font-size: 0.8rem; background-color: $darker; width: 6rem; - height: 3.7rem; - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; - } - - .remove { - margin-top: 3rem; + height: 3.5rem; + border-radius: 4px; + font-size: 0.85rem; } + } } @@ -503,15 +541,18 @@ justify-content: space-between; .card { - min-height: 11rem; + min-height: 12rem; } + &-info { + display: flex; + flex-direction: row; + } .eth { filter: drop-shadow(0px 0px 15px rgba(111, 19, 202, 1)); } .ratio { - display: none; width: 1.9375rem; filter: drop-shadow(0px 0px 15px rgba(15, 217, 255, 0.53)); } @@ -522,7 +563,7 @@ } .info { - margin-top: 1.7rem; + margin-top: 1rem; .btn { margin-top: 0.7rem; @@ -594,13 +635,22 @@ min-height: 0rem; min-width: 0rem; } + + .test { + display: flex; + flex-direction: column; + .test2 { + display: flex; + flex-direction: row; + } + } } // Small devices (landscape phones, 576px and up) @media (min-width: 576px) { .actions-container { - display: grid; - grid-template-columns: auto; + // display: grid; + // grid-template-columns: auto; margin-bottom: 2rem; } @@ -617,8 +667,8 @@ // Large devices (desktops, 992px and up) @media (min-width: 992px) { .actions-container { - display: grid; - grid-template-columns: auto 33% 33%; + // display: grid; + // grid-template-columns: auto 33% 33%; margin-bottom: 0rem; } .balance { @@ -746,4 +796,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/styles/vault.scss b/src/styles/vault.scss deleted file mode 100644 index 07d8b41..0000000 --- a/src/styles/vault.scss +++ /dev/null @@ -1,733 +0,0 @@ -@import "./colors"; -@import "./fonts"; - -.vault { - padding-bottom: 0px; - margin-bottom: 3rem; - - .lightning{ - position: fixed; - height: 100%; - width: 100%; - z-index: 1; - - -webkit-animation: flash ease-out 7s infinite; - -moz-animation: flash ease-out 7s infinite; - animation: flash ease-out 7s infinite; - animation-delay: 2s; - @-webkit-keyframes flash { - from { opacity: 0; } - 92% { opacity: 0; } - 93% { opacity: 0.6; } - 94% { opacity: 0.2; } - 96% { opacity: 0.9; } - to { opacity: 0; } - } - - @keyframes flash { - from { opacity: 0; } - 92% { opacity: 0; } - 93% { opacity: 0.6; } - 94% { opacity: 0.2; } - 96% { opacity: 1; } - to { opacity: 0; } - } - /*End! is that simple! */ - } - // Small devices (landscape phones, 576px and up) - @media (min-width: 576px) { - padding: 1rem 3rem; - } - - // Large devices (desktops, 992px and up) - @media (min-width: 992px) { - padding: 3rem 1.5rem; - } - - // Large devices (small laptos) - @media (min-width: 1300px) { - padding: 3rem 3rem; - } - - .loading-container { - padding-top: 12.5%; - } - - .icon-container { - display: flex; - flex-direction: row; - margin-top: 3rem; - margin-bottom: 2rem; - svg { - margin-top: 7px; - vertical-align: top; - width: 0.9rem; - - &.btc { - margin-top: 10px; - width: 1.5rem; - } - &.dai { - margin-top: 12px; - width: 1.3rem; - } - &.aave { - margin-top: 10px; - width: 1.5rem; - } - &.link { - margin-top: 3px; - width: 1.5rem; - } - &.uni { - margin-top: 3px; - width: 1.7rem; - } - } - - .btn-group { - width: fit-content; - border: 1px solid #dfd1ea; - border-radius: 5px; - margin-bottom: 0rem !important; - margin-right: 0.5rem; - input[type="radio"] { - display: none; - } - .btn-secondary { - margin-bottom: 0rem; - font-size: 0.8rem; - background-color: #281e31; - } - .btn-secondary.active { - background-color: $neon-highlight; - } - } - } - - .alert-warning { - margin-top: 0rem; - margin-bottom: 0rem; - padding: 0.2rem 1rem; - height: 2rem; - width: 70%; - } - - .dd-collateral { - display: flex; - align-items: center; - h6 { - color: $white; - margin: 0px; - } - .balance-container { - display: flex; - align-items: center; - margin: 0rem 1rem; - color: $light; - .number { - margin-bottom: 0rem; - color: $light; - } - } - .dropdown { - padding-left: 0.5rem; - .btn { - margin-top: 0rem; - } - .dropdown-toggle { - display: flex; - height: 2.1rem; - width: 150px; - background-color: #281e31; - border: 1px solid #dfd1ea; - border-radius: 5px; - - div { - display: flex; - align-items: center; - flex: 1; - } - span { - font-size: 0.8rem; - } - svg { - height: 20px; - margin-right: 5px; - } - } - .dropdown-toggle::after { - position: absolute; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.4em solid; - border-right: 0.4em solid transparent; - border-bottom: 0; - border-left: 0.4em solid transparent; - margin-top: 7px; - margin-left: 65%; - } - .dropdown-menu { - width: 85%; - margin-top: 3px !important; - margin-right: 1rem; - background-color: #211828; - - .dropdown-item { - color: $white; - } - .dropdown-item.active { - background-color: rgba(121, 64, 242, 0.4); - } - .dropdown-item:hover { - background-color: rgba(121, 64, 242, 0.3); - } - } - } - } - - .collateral-balance { - display: flex; - align-items: center; - h4 { - margin-bottom: 0rem; - } - .number { - color: $light; - font-size: 1.1rem; - } - .amount { - display: flex; - align-items: center; - .number { - color: $white; - } - } - svg.small { - vertical-align: top; - width: 0.7rem; - filter: brightness(1118%) drop-shadow(0px 0px 5px $highlight); - @supports (-webkit-touch-callout: none) { - height: intrinsic; - } - - &.btc.small { - margin-top: 0px; - width: 1.5rem; - } - &.dai.small { - margin-top: 0px; - width: 1.2rem; - filter: drop-shadow(0px 0px 5px $highlight); - } - &.aave.small { - margin-top: 2px; - width: 1.5rem; - filter: drop-shadow(0px 0px 5px $highlight); - } - &.link.small { - margin-top: 7px; - width: 1.4rem; - filter: drop-shadow(0px 0px 5px $highlight); - } - &.uni.small { - margin-top: -5px; - width: 1.5rem; - filter: drop-shadow(0px 0px 5px $highlight); - } - &.snx.small { - margin-top: -3px; - width: 1.3rem; - filter: drop-shadow(0px 0px 5px $highlight); - } - &.usdc.small { - margin-top: -5px; - width: 1.3rem; - } - } - } - - select { - font-size: 1.2rem; - font-family: "Nineteen Ninety Seven"; - background: none; - border: none; - color: $white; - -webkit-appearance: none; - appearance: none; - width: 7.8rem; - background: url("../assets/images/select-arrow.svg") 96% / 15% no-repeat; - outline: none; - - &::-ms-expand { - display: none; - } - - &:focus { - outline: none; - } - - &.form-control:focus { - color: $white; - background: url("../assets/images/select-arrow.svg") 96% / 15% no-repeat; - outline: 0; - box-shadow: 0 0 0 0 rgba(164, 64, 242, 0); - } - - &.form-control { - padding: 0; - } - - option { - background-color: $primary; - border: none; - color: $white; - } - } - - .action-title { - margin-top: 1rem; - margin-bottom: 2.25rem; - } - - .pre-actions { - p { - width: 30rem; - } - .btn { - width: 13.4375rem; - height: 3.875rem; - border-radius: 1px; - margin-top: 2rem; - } - .card { - width: 35rem; - padding: 1rem 0.5rem; - } - .card-header { - display: flex; - justify-content: space-between; - padding-bottom: 1.5rem; - } - } - - .actions-container { - margin-top: 1rem; - column-gap: 2rem; - p { - width: 100%; - } - .card { - padding: 2rem; - } - .card-header { - padding: 0rem; - padding-bottom: 1.5rem; - } - .card-body { - padding: 0rem; - } - - .info { - display: flex; - align-items: top; - div { - width: 100%; - } - p { - text-align: right; - } - .collateral-balance { - flex-direction: column; - } - .amount { - display: flex; - flex-direction: row; - justify-content: flex-end; - } - } - - .form-card { - .card { - min-height: 26rem; - padding: 0; - - .info { - border-bottom: 1px solid $dark; - padding: 2rem; - - p, - h4 { - padding-bottom: 0; - margin-bottom: 0; - } - - .amount { - display: flex; - justify-content: flex-end; - } - } - - svg { - //margin-top: -5px; - vertical-align: top; - width: 0.8rem; - filter: brightness(1118%) drop-shadow(0px 0px 5px rgba(6, 52, 255, 0.53)); - @supports (-webkit-touch-callout: none) { - height: intrinsic; - } - - &.tcap-neon { - margin-top: 0px; - filter: none; - width: 2rem; - } - &.btc { - margin-top: 0px; - width: 1.8rem; - } - &.dai { - margin-top: 0px; - width: 1.5rem; - filter: none; - margin-right: 2px; - filter: drop-shadow(0px 0px 5px $dark-blue); - } - - &.polygon { - margin-top: 0px; - width: 1.5rem; - } - &.aave { - width: 1.5rem; - margin-top: 2px; - } - &.link { - width: 1.6rem; - margin-top: -3px; - } - &.uni { - width: 1.6rem; - margin-top: -4px; - } - &.snx { - width: 1.5rem; - margin-top: -3px; - } - &.usdc { - margin-top: 5px; - width: 1.7rem; - } - } - } - - form { - padding: 2rem 2rem 0rem 2rem; - - label { - font-family: "Nineteen Ninety Seven"; - color: $white; - - &.max { - float: right; - @media (min-width: 992px) and (max-width: 1300px) { - font-size: 0.9rem; - } - a { - color: $green; - - &.orange { - color: $orange; - } - } - } - } - - .text-muted { - text-align: right; - font-size: 1rem; - margin-top: -2.375rem; - margin-right: 4.375rem; - } - - .burn-fee.text-muted { - text-align: right; - font-size: 1rem; - margin-top: 1rem; - margin-right: 0; - margin-bottom: 0; - padding-bottom: 0; - font-size: 0.8rem; - color: $off-white !important; - } - - input[type="text"] { - border-radius: 1px; - background: no-repeat; - border-color: $dark; - color: $white; - height: 3.375rem; - } - - .btn { - background-color: $darker; - width: 3.375rem; - border-radius: 1px; - } - - .remove { - margin-top: 3.5rem; - } - } - } - - .balance { - display: flex; - flex-direction: column; - justify-content: space-between; - - .card { - min-height: 12rem; - } - - .eth { - filter: drop-shadow(0px 0px 15px rgba(111, 19, 202, 1)); - } - - .ratio { - width: 1.9375rem; - filter: drop-shadow(0px 0px 15px rgba(15, 217, 255, 0.53)); - } - - .info-data { - display: flex; - flex-direction: column; - } - - .info { - margin-top: 1rem; - - .btn { - margin-top: 0.7rem; - height: 40px; - } - - p, - h4 { - padding-bottom: 0; - margin-bottom: 0; - } - .amount h4 { - margin-bottom: 0.5rem; - } - } - - svg.small { - vertical-align: top; - margin-top: -5px; - width: 0.8rem; - &.btc.small { - margin-top: -5px; - width: 1.8rem; - } - - &.dai.small { - margin-top: 0px; - width: 1.2rem; - filter: drop-shadow(0px 0px 5px $highlight); - } - &.aave.small { - margin-top: -5px; - width: 1.7rem; - filter: drop-shadow(0px 0px 5px $highlight); - } - &.link.small { - margin-top: 0px; - width: 1.7rem; - filter: drop-shadow(0px 0px 5px $highlight); - } - &.uni.small { - margin-top: -5px; - width: 1.7rem; - filter: drop-shadow(0px 0px 5px $highlight); - } - &.snx.small { - margin-top: -3px; - width: 1.5rem; - filter: drop-shadow(0px 0px 5px $highlight); - } - &.usdc.small { - margin-top: -5px; - width: 1.7rem; - } - } - } - - .tcap { - .card { - min-height: 26rem; - } - } - - .token-icon-container { - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: flex-end; - min-height: 0rem; - min-width: 0rem; - } - } - - // Small devices (landscape phones, 576px and up) - @media (min-width: 576px) { - .actions-container { - display: grid; - grid-template-columns: auto; - margin-bottom: 2rem; - } - - .balance { - grid-row-gap: 0rem; - row-gap: 0rem; - } - - .card { - margin-bottom: 2rem; - } - } - - // Large devices (desktops, 992px and up) - @media (min-width: 992px) { - .actions-container { - display: grid; - grid-template-columns: auto 33% 33%; - margin-bottom: 0rem; - } - .balance { - row-gap: 1.5rem; - } - - .card { - margin-bottom: 0rem; - } - } - - @media (min-width: 992px) and (max-width: 1200px) { - .actions-container { - column-gap: 1rem; - .balance { - .card { - padding: 2rem 1.2rem; - } - h4 { - font-size: 1.35rem; - } - p { - font-size: 0.9rem; - } - } - .form-card { - form { - padding: 2rem 1.2rem 0rem 1.2rem; - label { - font-size: 0.87rem; - } - } - .card { - .info { - padding: 2rem 1rem; - } - } - } - @media (max-width: 1140px) { - .form-group { - span { - font-size: 0.9rem; - } - } - .form-card { - h4 { - font-size: 1.32rem; - } - } - .balance { - h4 { - font-size: 1.25rem; - } - } - } - } - } - - @media (max-height: 820px) and (min-width: 992px) { - .icon-container { - margin-top: 1rem; - } - .actions-container { - margin-top: 0rem; - - .card { - padding: 1rem 1rem; - } - .form-card { - .card { - min-height: 23rem; - - .info { - padding-top: 1.3rem; - padding-bottom: 1.3rem; - } - } - form { - padding-top: 1.5rem; - .remove { - margin-top: 2.7rem; - } - } - } - .balance { - row-gap: 1rem; - .card { - min-height: 11.17rem; - } - } - } - } - - @media (max-width: 730px) { - padding-top: 4rem; - padding-left: 1rem; - - .pre-actions { - p { - width: 20rem; - } - } - - @media (max-width: 575px) { - .actions-container { - .card { - padding: 2rem 1.5rem; - } - .form-card { - .card { - .info { - padding: 2rem 1rem; - } - } - } - @media (max-width: 380px) { - .card { - padding: 2rem 0.9rem; - } - } - } - - .card { - margin-bottom: 2rem; - } - } - } -} From 05410ecfdea5f5fa2e45434fe2b3f26f3b8bd5f9 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 16 May 2022 19:43:52 -0600 Subject: [PATCH 106/278] adding mainnet vaults --- src/App.tsx | 11 + src/components/Vault/Mint.tsx | 6 +- src/contracts/cryptex.json | 21076 +++++++++++++++++------------- src/hooks/useHardVaults.tsx | 12 + src/state/HardVaultsContext.tsx | 6 + src/utils/univ3.tsx | 6 +- 6 files changed, 11855 insertions(+), 9262 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 7714dcf..ab17fa2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -173,6 +173,12 @@ const App = () => { currentSigner ); hardVaults.setCurrentUSDCVault(currentHardUSDCVault); + const currentHardWBTCVault = new ethers.Contract( + contracts.HardWBTCVaultHandler.address, + contracts.HardWBTCVaultHandler.abi, + currentSigner + ); + hardVaults.setCurrentWBTCVault(currentHardWBTCVault); const currentAVEEVaultRead = new Contract( contracts.AaveVaultHandler.address, @@ -199,6 +205,11 @@ const App = () => { toFragment(contracts.HardUSDCVaultHandler.abi) ); hardVaults.setCurrentUSDCVaultRead(currentHardUSDCVaultRead); + const currentHardWBTCVaultRead = new Contract( + contracts.HardWBTCVaultHandler.address, + toFragment(contracts.HardWBTCVaultHandler.abi) + ); + hardVaults.setCurrentWBTCVaultRead(currentHardWBTCVaultRead); // Tokens const currentAAVEToken = new ethers.Contract( diff --git a/src/components/Vault/Mint.tsx b/src/components/Vault/Mint.tsx index 81b8717..8e1f2a0 100644 --- a/src/components/Vault/Mint.tsx +++ b/src/components/Vault/Mint.tsx @@ -358,8 +358,8 @@ const Mint = ({ address, t }: props) => { // balance = await provider.getBalance(address); break; case "WBTC": - currentVault = vaults.wbtcVault; - currentVaultRead = vaults.wbtcVaultRead; + currentVault = !isHardMode() ? vaults.wbtcVault : hardVaults.wbtcVault; + currentVaultRead = !isHardMode() ? vaults.wbtcVaultRead : hardVaults.wbtcVaultRead; currentToken = tokens.wbtcToken; currentOracleRead = oracles.wbtcOracleRead; currentTokenRead = tokens.wbtcTokenRead; @@ -1082,7 +1082,7 @@ const Mint = ({ address, t }: props) => { async function load() { let vOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK", "WBTC"]; if (isHardMode()) { - vOptions = ["ETH", "WETH", "DAI", "USDC"]; + vOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; } if (isOptimism(currentNetwork.chainId) && !isHardMode()) { vOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index f910a73..4d4bcf4 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -15881,7 +15881,7 @@ ] }, "HardWETHVaultHandler": { - "address": "0x6E3B4E276f22C30085882dD1342995773AE76414", + "address": "0xc2Ba6B8E0EE3cf48B045D966F1dCda767df74833", "abi": [ { "inputs": [ @@ -17187,7 +17187,7 @@ ] }, "HardDaiVaultHandler": { - "address": "0x95ac341B6492954DF1341A33cAC9AB3273179232", + "address": "0xA5b3Bb6e1f206624B3B8CE0c6A0f7614fd35Fa03", "abi": [ { "inputs": [ @@ -19026,7 +19026,7 @@ ] }, "HardUSDCVaultHandler": { - "address": "0xB34756f8D9682ab6C26F77f9461207a65c52c8bC", + "address": "0xa8CcA36A624215a39D5af6854ac24868559424d3", "abi": [ { "inputs": [ @@ -20306,20 +20306,73 @@ "type": "function" } ] - } - } - } - }, - "4": { - "rinkeby": { - "name": "rinkeby", - "chainId": "4", - "contracts": { - "AAVE": { - "address": "0x8B4A041A619aC26B33e5BAEe9585e569387ec837", + }, + "HardWBTCVaultHandler": { + "address": "0x2364536F4891Ed560A6728f4B36871de8176eE5c", "abi": [ { - "inputs": [], + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "constructor" }, @@ -20329,23 +20382,23 @@ { "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" } ], - "name": "Approval", + "name": "CollateralAdded", "type": "event" }, { @@ -20354,329 +20407,367 @@ { "indexed": true, "internalType": "address", - "name": "from", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" } ], - "name": "Transfer", + "name": "CollateralRemoved", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewBurnFee", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewLiquidationPenalty", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_minimumTCAP", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewMinimumTCAP", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "_owner", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_ratio", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" + "name": "NewRatio", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewTreasury", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "increaseAllowance", - "outputs": [ + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "_account", + "name": "_token", "type": "address" }, { + "indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Recovered", + "type": "event" }, { - "inputs": [], - "name": "name", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" }, { - "inputs": [], - "name": "symbol", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "recipient", + "name": "_owner", "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "amount", + "name": "_id", "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "TokensBurned", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "sender", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "recipient", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "transferFrom", - "outputs": [ + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "AaveOracle": { - "address": "0x73Ebb8b08f056F451c2aA53dCAd7A35ce6aD52D0", - "abi": [ + "name": "Unpaused", + "type": "event" + }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_aggregator", + "name": "_owner", "type": "address" }, { - "internalType": "address", - "name": "_timelock", - "type": "address" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "VaultCreated", + "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "_liquidator", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" } ], - "name": "OwnershipTransferred", + "name": "VaultLiquidated", "type": "event" }, { "inputs": [], - "name": "getLatestAnswer", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "int256", + "internalType": "bytes32", "name": "", - "type": "int256" + "type": "bytes32" } ], "stateMutability": "view", @@ -20684,32 +20775,25 @@ }, { "inputs": [], - "name": "getLatestRound", + "name": "ETHPriceOracle", "outputs": [ { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" - }, + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ { - "internalType": "uint80", + "internalType": "uint8", "name": "", - "type": "uint80" + "type": "uint8" } ], "stateMutability": "view", @@ -20717,7 +20801,7 @@ }, { "inputs": [], - "name": "getLatestTimestamp", + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -20729,38 +20813,39 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousAnswer", + "inputs": [], + "name": "MIN_RATIO", "outputs": [ { - "internalType": "int256", + "internalType": "uint256", "name": "", - "type": "int256" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "uint256", + "name": "price", + "type": "uint256" } ], - "name": "getPreviousTimestamp", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", "outputs": [ { - "internalType": "uint256", + "internalType": "contract TCAP", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -20769,37 +20854,37 @@ { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "getRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], "stateMutability": "view", @@ -20807,10 +20892,10 @@ }, { "inputs": [], - "name": "owner", + "name": "collateralContract", "outputs": [ { - "internalType": "address", + "internalType": "contract IERC20", "name": "", "type": "address" } @@ -20820,500 +20905,355 @@ }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "collateralDecimalsAdjustmentFactor", + "outputs": [ { - "internalType": "address", - "name": "_aggregator", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "setReferenceContract", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", + "inputs": [], + "name": "collateralPriceOracle", "outputs": [ { - "internalType": "bool", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "counter", + "outputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "_value", + "type": "uint256" } ], - "name": "transferOwnership", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "AaveVaultHandler": { - "address": "0x119D37aFc784C81626b08813D83598b8673EEE66", - "abi": [ + }, { - "inputs": [ - { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_divisor", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - }, + "inputs": [], + "name": "divisor", + "outputs": [ { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" - }, - { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardHandler", - "type": "address" - }, - { - "internalType": "address", - "name": "_treasury", - "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "getFee", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "fee", "type": "uint256" } ], - "name": "CollateralAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", + "internalType": "contract ChainlinkOracle", + "name": "_oracle", "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, + } + ], + "name": "getOraclePrice", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "price", "type": "uint256" } ], - "name": "CollateralRemoved", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "NewBurnFee", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "index", "type": "uint256" } ], - "name": "NewLiquidationPenalty", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "getRoleMember", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" } ], - "name": "NewRatio", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_tresury", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "NewTreasury", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "name": "getRoleMemberCount", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" } ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, { - "indexed": false, "internalType": "address", - "name": "_token", + "name": "", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" } ], - "name": "RoleAdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, "internalType": "address", "name": "account", "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" } ], - "name": "RoleGranted", - "type": "event" + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, "internalType": "address", "name": "account", "type": "address" - }, + } + ], + "name": "hasRole", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "RoleRevoked", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_maxTCAP", "type": "uint256" - }, + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "TokensBurned", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_vaultId", "type": "uint256" - }, + } + ], + "name": "liquidationReward", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "rewardCollateral", "type": "uint256" } ], - "name": "TokensMinted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "minimumTCAP", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_amount", "type": "uint256" } ], - "name": "VaultCreated", - "type": "event" + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "oracleDigits", + "outputs": [ { - "indexed": true, "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "_liquidator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_reward", + "name": "", "type": "uint256" } ], - "name": "VaultLiquidated", - "type": "event" + "stateMutability": "view", + "type": "function" }, { "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "owner", "outputs": [ { - "internalType": "bytes32", + "internalType": "address", "name": "", - "type": "bytes32" + "type": "address" } ], "stateMutability": "view", @@ -21321,12 +21261,19 @@ }, { "inputs": [], - "name": "ETHPriceOracle", + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -21334,7 +21281,7 @@ }, { "inputs": [], - "name": "MAX_FEE", + "name": "ratio", "outputs": [ { "internalType": "uint256", @@ -21346,53 +21293,57 @@ "type": "function" }, { - "inputs": [], - "name": "MIN_RATIO", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "_tokenAmount", "type": "uint256" } ], - "stateMutability": "view", + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "TCAPPrice", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "price", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "TCAPToken", - "outputs": [ - { - "internalType": "contract TCAP", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "addCollateral", + "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -21405,18 +21356,11 @@ "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "burnFee", + "name": "requiredCollateral", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "collateral", "type": "uint256" } ], @@ -21424,116 +21368,134 @@ "type": "function" }, { - "inputs": [], - "name": "collateralContract", + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", "outputs": [ { - "internalType": "contract IERC20", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "collateralPriceOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", "type": "address" } ], - "stateMutability": "view", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "counter", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "_value", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "createVault", + "name": "setBurnFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "divisor", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_liquidationPenalty", "type": "uint256" } ], - "stateMutability": "view", + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "_minimumTCAP", "type": "uint256" } ], - "name": "getFee", - "outputs": [ + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "fee", + "name": "_ratio", "type": "uint256" } ], - "stateMutability": "view", + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "internalType": "address", + "name": "_treasury", "type": "address" } ], - "name": "getOraclePrice", - "outputs": [ - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" } ], - "name": "getRoleAdmin", + "name": "supportsInterface", "outputs": [ { - "internalType": "bytes32", + "internalType": "bool", "name": "", - "type": "bytes32" + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" } ], "stateMutability": "view", @@ -21542,17 +21504,19 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "getRoleMember", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", "outputs": [ { "internalType": "address", @@ -21563,15 +21527,22 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "getRoleMemberCount", + "name": "userToVault", "outputs": [ { "internalType": "uint256", @@ -21586,92 +21557,123 @@ "inputs": [ { "internalType": "uint256", - "name": "_id", + "name": "", "type": "uint256" } ], - "name": "getVault", + "name": "vaults", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "Id", "type": "uint256" }, { "internalType": "uint256", - "name": "", + "name": "Collateral", "type": "uint256" }, - { - "internalType": "address", - "name": "", - "type": "address" - }, { "internalType": "uint256", - "name": "", + "name": "Debt", "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], "stateMutability": "view", "type": "function" + } + ] + } + } + } + }, + "4": { + "rinkeby": { + "name": "rinkeby", + "chainId": "4", + "contracts": { + "AAVE": { + "address": "0x8B4A041A619aC26B33e5BAEe9585e569387ec837", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "getVaultRatio", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "currentRatio", + "name": "value", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Approval", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "account", + "name": "to", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Transfer", + "type": "event" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "owner", + "type": "address" }, { "internalType": "address", - "name": "account", + "name": "spender", "type": "address" } ], - "name": "hasRole", + "name": "allowance", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", @@ -21680,47 +21682,40 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "spender", + "type": "address" }, { "internalType": "uint256", - "name": "_maxTCAP", + "name": "amount", "type": "uint256" } ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "liquidationPenalty", + "name": "approve", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "liquidationReward", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", - "name": "rewardCollateral", + "name": "", "type": "uint256" } ], @@ -21729,53 +21724,49 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "mint", + "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "oracleDigits", + "name": "decimals", "outputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "", - "type": "uint256" + "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "decreaseAllowance", "outputs": [ { "internalType": "bool", @@ -21783,91 +21774,84 @@ "type": "bool" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ratio", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "spender", "type": "address" }, { "internalType": "uint256", - "name": "_tokenAmount", + "name": "addedValue", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "removeCollateral", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "name": "name", + "outputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "symbol", + "outputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "requiredCollateral", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", "outputs": [ { "internalType": "uint256", - "name": "collateral", + "name": "", "type": "uint256" } ], @@ -21876,115 +21860,47 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, { "internalType": "uint256", - "name": "_vaultId", + "name": "amount", "type": "uint256" } ], - "name": "requiredLiquidationTCAP", + "name": "transfer", "outputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "sender", "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardHandler", - "outputs": [ + }, { - "internalType": "contract IRewardHandler", - "name": "", + "internalType": "address", + "name": "recipient", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - } - ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" - } - ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + }, { "internalType": "uint256", - "name": "_ratio", + "name": "amount", "type": "uint256" } ], - "name": "setRatio", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_treasury", - "type": "address" - } - ], - "name": "setTreasury", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", + "name": "transferFrom", "outputs": [ { "internalType": "bool", @@ -21992,112 +21908,13 @@ "type": "bool" } ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "tcapOracle", - "outputs": [ - { - "internalType": "contract ChainlinkOracle", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "treasury", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userToVault", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "vaults", - "outputs": [ - { - "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Debt", - "type": "uint256" - }, - { - "internalType": "address", - "name": "Owner", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" } ] }, - "WBTCOracle": { - "address": "0x6941264Cb2cB98F62d6014C6edcB24740e4592dE", + "AaveOracle": { + "address": "0x73Ebb8b08f056F451c2aA53dCAd7A35ce6aD52D0", "abi": [ { "inputs": [ @@ -22105,6 +21922,11 @@ "internalType": "address", "name": "_aggregator", "type": "address" + }, + { + "internalType": "address", + "name": "_timelock", + "type": "address" } ], "stateMutability": "nonpayable", @@ -22332,24 +22154,69 @@ } ] }, - "WBTCRewardHandler": { - "address": "0x386e8b1eDe61BDaAB9EFE5d999145fDDbd10A64C", + "AaveVaultHandler": { + "address": "0x119D37aFc784C81626b08813D83598b8673EEE66", "abi": [ { "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, { "internalType": "address", - "name": "_owner", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", "type": "address" }, { "internalType": "address", - "name": "_rewardsToken", + "name": "_collateralAddress", "type": "address" }, { "internalType": "address", - "name": "_vault", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", "type": "address" } ], @@ -22362,62 +22229,86 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "OwnershipTransferred", + "name": "CollateralAdded", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "Paused", + "name": "CollateralRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "token", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_burnFee", "type": "uint256" } ], - "name": "Recovered", + "name": "NewBurnFee", "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "RewardAdded", + "name": "NewLiquidationPenalty", "type": "event" }, { @@ -22426,30 +22317,87 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_ratio", "type": "uint256" } ], - "name": "RewardPaid", + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, { "indexed": false, "internalType": "uint256", - "name": "newDuration", + "name": "_amount", "type": "uint256" } ], - "name": "RewardsDurationUpdated", + "name": "Recovered", "type": "event" }, { @@ -22533,17 +22481,48 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", "type": "address" }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "Staked", + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", "type": "event" }, { @@ -22565,17 +22544,48 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", "type": "uint256" } ], - "name": "Withdrawn", + "name": "VaultLiquidated", "type": "event" }, { @@ -22592,14 +22602,21 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ { - "internalType": "address", - "name": "_account", + "internalType": "contract ChainlinkOracle", + "name": "", "type": "address" } ], - "name": "balanceOf", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -22611,14 +22628,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "earned", + "inputs": [], + "name": "MIN_RATIO", "outputs": [ { "internalType": "uint256", @@ -22630,33 +22641,26 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "internalType": "uint256", + "name": "price", + "type": "uint256" } ], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "getRewardForDuration", + "name": "TCAPToken", "outputs": [ { - "internalType": "uint256", + "internalType": "contract TCAP", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -22665,12 +22669,12 @@ { "inputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "getRewardFromVault", + "name": "addCollateral", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -22678,12 +22682,135 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "getRoleAdmin", + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", "outputs": [ { "internalType": "bytes32", @@ -22737,6 +22864,59 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -22780,21 +22960,26 @@ "type": "function" }, { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", "type": "uint256" } ], - "stateMutability": "view", + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "lastUpdateTime", + "name": "liquidationPenalty", "outputs": [ { "internalType": "uint256", @@ -22809,39 +22994,47 @@ "inputs": [ { "internalType": "uint256", - "name": "_a", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_b", + "name": "_vaultId", "type": "uint256" } ], - "name": "min", + "name": "liquidationReward", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "rewardCollateral", "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_reward", + "name": "_amount", "type": "uint256" } ], - "name": "notifyRewardAmount", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "owner", @@ -22855,6 +23048,13 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "paused", @@ -22870,7 +23070,7 @@ }, { "inputs": [], - "name": "periodFinish", + "name": "ratio", "outputs": [ { "internalType": "uint256", @@ -22899,6 +23099,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "renounceOwnership", @@ -22926,42 +23139,17 @@ }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerToken", - "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerTokenStored", + "name": "requiredCollateral", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "collateral", "type": "uint256" } ], @@ -22969,31 +23157,18 @@ "type": "function" }, { - "inputs": [], - "name": "rewardRate", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_vaultId", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "rewards", + "name": "requiredLiquidationTCAP", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], @@ -23001,24 +23176,29 @@ "type": "function" }, { - "inputs": [], - "name": "rewardsDuration", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "rewardsToken", + "name": "rewardHandler", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "contract IRewardHandler", "name": "", "type": "address" } @@ -23030,55 +23210,50 @@ "inputs": [ { "internalType": "uint256", - "name": "_rewardsDuration", + "name": "_burnFee", "type": "uint256" } ], - "name": "setRewardsDuration", + "name": "setBurnFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "_staker", - "type": "address" - }, { "internalType": "uint256", - "name": "_amount", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "stake", + "name": "setLiquidationPenalty", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" } ], - "stateMutability": "view", + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "_treasury", "type": "address" } ], - "name": "transferOwnership", + "name": "setTreasury", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -23086,28 +23261,28 @@ { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" } ], - "name": "userRewardPerTokenPaid", + "name": "supportsInterface", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "vault", + "name": "tcapOracle", "outputs": [ { - "internalType": "address", + "internalType": "contract ChainlinkOracle", "name": "", "type": "address" } @@ -23119,115 +23294,103 @@ "inputs": [ { "internalType": "address", - "name": "_staker", + "name": "newOwner", "type": "address" - }, + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "withdraw", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "WBTCVaultHandler": { - "address": "0x1b9cd5A9acC56405806D0E4618616f761001eB62", - "abi": [ + }, { "inputs": [ { - "internalType": "contract Orchestrator", - "name": "_orchestrator", + "internalType": "address", + "name": "", "type": "address" - }, + } + ], + "name": "userToVault", + "outputs": [ { "internalType": "uint256", - "name": "_divisor", + "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "_ratio", + "name": "", "type": "uint256" - }, + } + ], + "name": "vaults", + "outputs": [ { "internalType": "uint256", - "name": "_burnFee", + "name": "Id", "type": "uint256" }, { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "Collateral", "type": "uint256" }, { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardHandler", - "type": "address" + "internalType": "uint256", + "name": "Debt", + "type": "uint256" }, { "internalType": "address", - "name": "_treasury", + "name": "Owner", "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" - }, + "stateMutability": "view", + "type": "function" + } + ] + }, + "WBTCOracle": { + "address": "0x6941264Cb2cB98F62d6014C6edcB24740e4592dE", + "abi": [ { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "_aggregator", "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" } ], - "name": "CollateralAdded", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, @@ -23235,100 +23398,245 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "previousOwner", "type": "address" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "CollateralRemoved", + "name": "OwnershipTransferred", "type": "event" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" }, { - "indexed": false, "internalType": "uint256", - "name": "_burnFee", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "NewBurnFee", - "type": "event" + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" } ], - "name": "NewLiquidationPenalty", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" }, { - "indexed": false, "internalType": "uint256", - "name": "_ratio", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "NewRatio", - "type": "event" + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "WBTCRewardHandler": { + "address": "0x386e8b1eDe61BDaAB9EFE5d999145fDDbd10A64C", + "abi": [ + { + "inputs": [ + { "internalType": "address", "name": "_owner", "type": "address" }, { - "indexed": false, "internalType": "address", - "name": "_tresury", + "name": "_rewardsToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_vault", "type": "address" } ], - "name": "NewTreasury", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, @@ -23368,13 +23676,13 @@ { "indexed": false, "internalType": "address", - "name": "_token", + "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], @@ -23385,50 +23693,70 @@ "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" } ], - "name": "RoleAdminChanged", + "name": "RewardAdded", "type": "event" }, { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "indexed": true, "internalType": "address", - "name": "account", + "name": "user", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" } ], - "name": "RoleGranted", + "name": "RewardPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" + } + ], + "name": "RewardsDurationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", "type": "event" }, { @@ -23453,7 +23781,7 @@ "type": "address" } ], - "name": "RoleRevoked", + "name": "RoleGranted", "type": "event" }, { @@ -23461,24 +23789,24 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "TokensBurned", + "name": "RoleRevoked", "type": "event" }, { @@ -23487,23 +23815,17 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "user", "type": "address" }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], - "name": "TokensMinted", + "name": "Staked", "type": "event" }, { @@ -23525,48 +23847,17 @@ { "indexed": true, "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - } - ], - "name": "VaultCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "_liquidator", + "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_reward", + "name": "amount", "type": "uint256" } ], - "name": "VaultLiquidated", + "name": "Withdrawn", "type": "event" }, { @@ -23583,21 +23874,14 @@ "type": "function" }, { - "inputs": [], - "name": "ETHPriceOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", + "internalType": "address", + "name": "_account", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_FEE", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -23609,39 +23893,19 @@ "type": "function" }, { - "inputs": [], - "name": "MIN_RATIO", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TCAPPrice", + "name": "earned", "outputs": [ { "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TCAPToken", - "outputs": [ - { - "internalType": "contract TCAP", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -23650,32 +23914,26 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "_staker", + "type": "address" } ], - "name": "addCollateral", + "name": "exit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "burn", + "inputs": [], + "name": "getReward", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "burnFee", + "name": "getRewardForDuration", "outputs": [ { "internalType": "uint256", @@ -23687,59 +23945,56 @@ "type": "function" }, { - "inputs": [], - "name": "collateralContract", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20", - "name": "", + "internalType": "address", + "name": "_staker", "type": "address" } ], - "stateMutability": "view", + "name": "getRewardFromVault", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "collateralPriceOracle", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "counter", - "outputs": [ + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "uint256", - "name": "_value", + "name": "index", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "createVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "divisor", + "name": "getRoleMember", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -23748,16 +24003,16 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "getFee", + "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", - "name": "fee", + "name": "", "type": "uint256" } ], @@ -23767,20 +24022,19 @@ { "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", - "type": "address" - } - ], - "name": "getOraclePrice", - "outputs": [ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { - "internalType": "uint256", - "name": "price", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -23789,38 +24043,45 @@ "internalType": "bytes32", "name": "role", "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "getRoleAdmin", + "name": "hasRole", "outputs": [ { - "internalType": "bytes32", + "internalType": "bool", "name": "", - "type": "bytes32" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ { "internalType": "uint256", - "name": "index", + "name": "", "type": "uint256" } ], - "name": "getRoleMember", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdateTime", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -23829,12 +24090,17 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint256", + "name": "_a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_b", + "type": "uint256" } ], - "name": "getRoleMemberCount", + "name": "min", "outputs": [ { "internalType": "uint256", @@ -23842,60 +24108,84 @@ "type": "uint256" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_id", + "name": "_reward", "type": "uint256" } ], - "name": "getVault", + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, { "internalType": "address", "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "periodFinish", + "outputs": [ { "internalType": "uint256", - "name": "_vaultId", + "name": "", "type": "uint256" } ], - "name": "getVaultRatio", - "outputs": [ + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, { "internalType": "uint256", - "name": "currentRatio", + "name": "_tokenAmount", "type": "uint256" } ], - "stateMutability": "view", + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -23911,7 +24201,7 @@ "type": "address" } ], - "name": "grantRole", + "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -23929,38 +24219,27 @@ "type": "address" } ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, + "inputs": [], + "name": "rewardPerToken", + "outputs": [ { "internalType": "uint256", - "name": "_maxTCAP", + "name": "", "type": "uint256" } ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "liquidationPenalty", + "name": "rewardPerTokenStored", "outputs": [ { "internalType": "uint256", @@ -23972,18 +24251,12 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "liquidationReward", + "inputs": [], + "name": "rewardRate", "outputs": [ { "internalType": "uint256", - "name": "rewardCollateral", + "name": "", "type": "uint256" } ], @@ -23993,19 +24266,12 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "oracleDigits", + "name": "rewards", "outputs": [ { "internalType": "uint256", @@ -24018,12 +24284,12 @@ }, { "inputs": [], - "name": "owner", + "name": "rewardsDuration", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -24031,89 +24297,70 @@ }, { "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "rewardsToken", "outputs": [ { - "internalType": "bool", + "internalType": "contract IERC20", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "ratio", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_rewardsDuration", "type": "uint256" } ], - "stateMutability": "view", + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "_staker", "type": "address" }, { "internalType": "uint256", - "name": "_tokenAmount", + "name": "_amount", "type": "uint256" } ], - "name": "recoverERC20", + "name": "stake", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "totalSupply", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "removeCollateral", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "renounceRole", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -24121,149 +24368,28 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "requiredCollateral", - "outputs": [ - { - "internalType": "uint256", - "name": "collateral", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "requiredLiquidationTCAP", + "name": "userRewardPerTokenPaid", "outputs": [ { "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], - "name": "rewardHandler", + "name": "vault", "outputs": [ - { - "internalType": "contract IRewardHandler", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - } - ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" - } - ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - } - ], - "name": "setRatio", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ { "internalType": "address", - "name": "_treasury", - "type": "address" - } - ], - "name": "setTreasury", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "tcapOracle", - "outputs": [ - { - "internalType": "contract ChainlinkOracle", "name": "", "type": "address" } @@ -24275,109 +24401,86 @@ "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "_staker", "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "treasury", - "outputs": [ + }, { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", + "name": "withdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "WBTCVaultHandler": { + "address": "0x1b9cd5A9acC56405806D0E4618616f761001eB62", + "abi": [ { "inputs": [ { - "internalType": "address", - "name": "", + "internalType": "contract Orchestrator", + "name": "_orchestrator", "type": "address" - } - ], - "name": "userToVault", - "outputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "_divisor", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" - } - ], - "name": "vaults", - "outputs": [ + }, { "internalType": "uint256", - "name": "Id", + "name": "_burnFee", "type": "uint256" }, { "internalType": "uint256", - "name": "Collateral", + "name": "_liquidationPenalty", "type": "uint256" }, { - "internalType": "uint256", - "name": "Debt", - "type": "uint256" + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" }, { "internalType": "address", - "name": "Owner", + "name": "_collateralAddress", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ] - }, - "Ctx": { - "address": "0xAa715DbD2ED909B7B7727dC864F3B78276D14A19", - "abi": [ - { - "inputs": [ + }, { "internalType": "address", - "name": "account", + "name": "_collateralOracle", "type": "address" }, { "internalType": "address", - "name": "minter_", + "name": "_ethOracle", "type": "address" }, { - "internalType": "uint256", - "name": "mintingAllowedAfter_", - "type": "uint256" + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" } ], "stateMutability": "nonpayable", @@ -24389,23 +24492,23 @@ { "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "Approval", + "name": "CollateralAdded", "type": "event" }, { @@ -24414,23 +24517,23 @@ { "indexed": true, "internalType": "address", - "name": "delegator", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "fromDelegate", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { - "indexed": true, - "internalType": "address", - "name": "toDelegate", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "DelegateChanged", + "name": "CollateralRemoved", "type": "event" }, { @@ -24439,42 +24542,74 @@ { "indexed": true, "internalType": "address", - "name": "delegate", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "previousBalance", + "name": "_burnFee", "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "newBalance", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "DelegateVotesChanged", + "name": "NewLiquidationPenalty", "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, "internalType": "address", - "name": "minter", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "address", - "name": "newMinter", + "name": "_tresury", "type": "address" } ], - "name": "MinterChanged", + "name": "NewTreasury", "type": "event" }, { @@ -24483,305 +24618,312 @@ { "indexed": true, "internalType": "address", - "name": "from", + "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "to", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "Transfer", + "name": "Recovered", "type": "event" }, { - "inputs": [], - "name": "DELEGATION_TYPEHASH", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "bytes32", - "name": "", + "name": "role", "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DOMAIN_TYPEHASH", - "outputs": [ + }, { + "indexed": true, "internalType": "bytes32", - "name": "", + "name": "previousAdminRole", "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PERMIT_TYPEHASH", - "outputs": [ + }, { + "indexed": true, "internalType": "bytes32", - "name": "", + "name": "newAdminRole", "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "sender", "type": "address" } ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "account", "type": "address" }, { - "internalType": "uint256", - "name": "rawAmount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { + "indexed": true, "internalType": "uint256", - "name": "", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "TokensBurned", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "_owner", "type": "address" }, { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "name": "checkpoints", - "outputs": [ - { - "internalType": "uint32", - "name": "fromBlock", - "type": "uint32" + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { - "internalType": "uint96", - "name": "votes", - "type": "uint96" + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "TokensMinted", + "type": "event" }, { - "inputs": [], - "name": "decimals", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint8", - "name": "", - "type": "uint8" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Unpaused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "subtractedValue", + "name": "_id", "type": "uint256" } ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "VaultCreated", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "delegatee", - "type": "address" - } - ], - "name": "delegate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, { + "indexed": true, "internalType": "address", - "name": "delegatee", + "name": "_liquidator", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "nonce", + "name": "_liquidationCollateral", "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "expiry", + "name": "_reward", "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ { "internalType": "bytes32", - "name": "s", + "name": "", "type": "bytes32" } ], - "name": "delegateBySig", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ { - "internalType": "address", + "internalType": "contract ChainlinkOracle", "name": "", "type": "address" } ], - "name": "delegates", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "getCurrentVotes", + "inputs": [], + "name": "MIN_RATIO", "outputs": [ { - "internalType": "uint96", + "internalType": "uint256", "name": "", - "type": "uint96" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { "internalType": "uint256", - "name": "blockNumber", + "name": "price", "type": "uint256" } ], - "name": "getPriorVotes", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", "outputs": [ { - "internalType": "uint96", + "internalType": "contract TCAP", "name": "", - "type": "uint96" + "type": "address" } ], "stateMutability": "view", @@ -24789,67 +24931,51 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, { "internalType": "uint256", - "name": "addedValue", + "name": "_amount", "type": "uint256" } ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "name": "addCollateral", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "minimumTimeBetweenMints", - "outputs": [ + "inputs": [ { - "internalType": "uint32", - "name": "", - "type": "uint32" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", + "name": "burn", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "dst", - "type": "address" - }, + "inputs": [], + "name": "burnFee", + "outputs": [ { "internalType": "uint256", - "name": "rawAmount", + "name": "", "type": "uint256" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "mintCap", + "name": "collateralContract", "outputs": [ { - "internalType": "uint8", + "internalType": "contract IERC20", "name": "", - "type": "uint8" + "type": "address" } ], "stateMutability": "view", @@ -24857,10 +24983,10 @@ }, { "inputs": [], - "name": "minter", + "name": "collateralPriceOracle", "outputs": [ { - "internalType": "address", + "internalType": "contract ChainlinkOracle", "name": "", "type": "address" } @@ -24870,11 +24996,11 @@ }, { "inputs": [], - "name": "mintingAllowedAfter", + "name": "counter", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_value", "type": "uint256" } ], @@ -24883,12 +25009,19 @@ }, { "inputs": [], - "name": "name", + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", "outputs": [ { - "internalType": "string", + "internalType": "uint256", "name": "", - "type": "string" + "type": "uint256" } ], "stateMutability": "view", @@ -24897,16 +25030,16 @@ { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "nonces", + "name": "getFee", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "fee", "type": "uint256" } ], @@ -24916,17 +25049,17 @@ { "inputs": [ { - "internalType": "address", - "name": "", + "internalType": "contract ChainlinkOracle", + "name": "_oracle", "type": "address" } ], - "name": "numCheckpoints", + "name": "getOraclePrice", "outputs": [ { - "internalType": "uint32", - "name": "", - "type": "uint32" + "internalType": "uint256", + "name": "price", + "type": "uint256" } ], "stateMutability": "view", @@ -24934,76 +25067,56 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "rawAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, { "internalType": "bytes32", - "name": "r", + "name": "role", "type": "bytes32" - }, + } + ], + "name": "getRoleAdmin", + "outputs": [ { "internalType": "bytes32", - "name": "s", + "name": "", "type": "bytes32" } ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "minter_", - "type": "address" - } - ], - "name": "setMinter", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", "outputs": [ { - "internalType": "string", + "internalType": "address", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "totalSupply", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", @@ -25016,323 +25129,216 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "dst", - "type": "address" - }, { "internalType": "uint256", - "name": "rawAmount", + "name": "_id", "type": "uint256" } ], - "name": "transfer", + "name": "getVault", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "type": "uint256" + }, { - "internalType": "address", - "name": "src", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" }, { "internalType": "address", - "name": "dst", + "name": "", "type": "address" }, { "internalType": "uint256", - "name": "rawAmount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "CTXLiquidityReward": { - "address": "0x06e4F32A5f3bD64C4c620644d107601368BfCb27", - "abi": [ + }, { "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardsToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_stakingToken", - "type": "address" - }, { "internalType": "uint256", - "name": "_vestingEnd", + "name": "_vaultId", "type": "uint256" - }, + } + ], + "name": "getVaultRatio", + "outputs": [ { "internalType": "uint256", - "name": "_vestingRatio", + "name": "currentRatio", "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { "internalType": "address", "name": "account", "type": "address" } ], - "name": "Paused", - "type": "event" + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_maxTCAP", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "", "type": "uint256" } ], - "name": "RewardAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "rewardCollateral", "type": "uint256" } ], - "name": "RewardPaid", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "uint256", - "name": "newDuration", + "name": "_amount", "type": "uint256" } ], - "name": "RewardsDurationUpdated", - "type": "event" + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, + "inputs": [], + "name": "oracleDigits", + "outputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "RoleAdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, + "inputs": [], + "name": "owner", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "sender", + "name": "", "type": "address" } ], - "name": "RoleGranted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Staked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Unpaused", - "type": "event" + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, + "inputs": [], + "name": "paused", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "Withdrawn", - "type": "event" + "stateMutability": "view", + "type": "function" }, { "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "ratio", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", @@ -25342,112 +25348,72 @@ "inputs": [ { "internalType": "address", - "name": "_account", + "name": "_tokenAddress", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "_tokenAmount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "claimVest", + "name": "recoverERC20", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "earned", - "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "exit", + "name": "removeCollateral", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "getReward", + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "getRewardForDuration", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ + }, { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "uint256", - "name": "index", + "name": "_amount", "type": "uint256" } ], - "name": "getRoleMember", + "name": "requiredCollateral", "outputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "collateral", + "type": "uint256" } ], "stateMutability": "view", @@ -25456,16 +25422,16 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" } ], - "name": "getRoleMemberCount", + "name": "requiredLiquidationTCAP", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], @@ -25485,114 +25451,85 @@ "type": "address" } ], - "name": "grantRole", + "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], - "name": "lastTimeRewardApplicable", + "name": "rewardHandler", "outputs": [ { - "internalType": "uint256", + "internalType": "contract IRewardHandler", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "lastUpdateTime", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_a", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_b", - "type": "uint256" - } - ], - "name": "min", - "outputs": [ - { - "internalType": "uint256", - "name": "", + "name": "_liquidationPenalty", "type": "uint256" } ], - "stateMutability": "pure", + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_reward", + "name": "_ratio", "type": "uint256" } ], - "name": "notifyRewardAmount", + "name": "setRatio", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "_treasury", "type": "address" } ], - "stateMutability": "view", + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "paused", + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { "internalType": "bool", @@ -25600,17 +25537,17 @@ "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "periodFinish", + "name": "tcapOracle", "outputs": [ { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -25620,66 +25557,44 @@ "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "newOwner", "type": "address" - }, - { - "internalType": "uint256", - "name": "_tokenAmount", - "type": "uint256" } ], - "name": "recoverERC20", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "name": "treasury", + "outputs": [ { "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "renounceRole", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerToken", + "name": "userToVault", "outputs": [ { "internalType": "uint256", @@ -25691,110 +25606,192 @@ "type": "function" }, { - "inputs": [], - "name": "rewardPerTokenStored", - "outputs": [ + "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardRate", + "name": "vaults", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], "stateMutability": "view", "type": "function" - }, + } + ] + }, + "Ctx": { + "address": "0xAa715DbD2ED909B7B7727dC864F3B78276D14A19", + "abi": [ { "inputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" - } - ], - "name": "rewards", - "outputs": [ + }, + { + "internalType": "address", + "name": "minter_", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "mintingAllowedAfter_", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { - "inputs": [], - "name": "rewardsDuration", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Approval", + "type": "event" }, { - "inputs": [], - "name": "rewardsToken", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract IERC20", - "name": "", + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fromDelegate", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "toDelegate", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "DelegateChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "delegate", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "_rewardsDuration", + "name": "previousBalance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newBalance", "type": "uint256" } ], - "name": "setRewardsDuration", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "DelegateVotesChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newMinter", + "type": "address" + } + ], + "name": "MinterChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], - "name": "stake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Transfer", + "type": "event" }, { "inputs": [], - "name": "stakingToken", + "name": "DELEGATION_TYPEHASH", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", @@ -25802,39 +25799,44 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "DOMAIN_TYPEHASH", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "PERMIT_TYPEHASH", + "outputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", "type": "address" } ], - "name": "userRewardPerTokenPaid", + "name": "allowance", "outputs": [ { "internalType": "uint256", @@ -25849,24 +25851,35 @@ "inputs": [ { "internalType": "address", - "name": "", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "rawAmount", + "type": "uint256" } ], - "name": "vestingAmounts", + "name": "approve", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "vestingEnd", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -25878,137 +25891,139 @@ "type": "function" }, { - "inputs": [], - "name": "vestingRatio", - "outputs": [ + "inputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" + }, + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "name": "checkpoints", + "outputs": [ + { + "internalType": "uint32", + "name": "fromBlock", + "type": "uint32" + }, + { + "internalType": "uint96", + "name": "votes", + "type": "uint96" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "decimals", + "outputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "DAI": { - "address": "0x118a4238E4086FAE2621D0336C0E6cdC1257BE82", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "subtractedValue", "type": "uint256" } ], - "name": "Approval", - "type": "event" + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, "internalType": "address", - "name": "to", + "name": "delegatee", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" } ], - "name": "Transfer", - "type": "event" + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "owner", + "name": "delegatee", "type": "address" }, { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, { "internalType": "uint256", - "name": "", + "name": "expiry", "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" } ], - "stateMutability": "view", + "name": "delegateBySig", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "spender", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "approve", + "name": "delegates", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -26019,12 +26034,12 @@ "type": "address" } ], - "name": "balanceOf", + "name": "getCurrentVotes", "outputs": [ { - "internalType": "uint256", + "internalType": "uint96", "name": "", - "type": "uint256" + "type": "uint96" } ], "stateMutability": "view", @@ -26034,28 +26049,21 @@ "inputs": [ { "internalType": "address", - "name": "_account", + "name": "account", "type": "address" }, { "internalType": "uint256", - "name": "_amount", + "name": "blockNumber", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", + "name": "getPriorVotes", "outputs": [ { - "internalType": "uint8", + "internalType": "uint96", "name": "", - "type": "uint8" + "type": "uint96" } ], "stateMutability": "view", @@ -26070,11 +26078,11 @@ }, { "internalType": "uint256", - "name": "subtractedValue", + "name": "addedValue", "type": "uint256" } ], - "name": "decreaseAllowance", + "name": "increaseAllowance", "outputs": [ { "internalType": "bool", @@ -26086,39 +26094,28 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", + "inputs": [], + "name": "minimumTimeBetweenMints", "outputs": [ { - "internalType": "bool", + "internalType": "uint32", "name": "", - "type": "bool" + "type": "uint32" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_account", + "name": "dst", "type": "address" }, { "internalType": "uint256", - "name": "_amount", + "name": "rawAmount", "type": "uint256" } ], @@ -26129,12 +26126,12 @@ }, { "inputs": [], - "name": "name", + "name": "mintCap", "outputs": [ { - "internalType": "string", + "internalType": "uint8", "name": "", - "type": "string" + "type": "uint8" } ], "stateMutability": "view", @@ -26142,12 +26139,12 @@ }, { "inputs": [], - "name": "symbol", + "name": "minter", "outputs": [ { - "internalType": "string", + "internalType": "address", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", @@ -26155,7 +26152,7 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "mintingAllowedAfter", "outputs": [ { "internalType": "uint256", @@ -26166,181 +26163,129 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { "internalType": "address", - "name": "recipient", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "transfer", + "name": "nonces", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "transferFrom", + "name": "numCheckpoints", "outputs": [ { - "internalType": "bool", + "internalType": "uint32", "name": "", - "type": "bool" + "type": "uint32" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "DAIOracle": { - "address": "0xb50365a53EB0d8f214FFD0Cc0F2936BD877B3e17", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_aggregator", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "owner", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "spender", "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "getLatestAnswer", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLatestRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" }, { "internalType": "uint256", - "name": "", + "name": "rawAmount", "type": "uint256" }, { "internalType": "uint256", - "name": "", + "name": "deadline", "type": "uint256" }, { - "internalType": "uint80", - "name": "", - "type": "uint80" + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" } ], - "stateMutability": "view", + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "getLatestTimestamp", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "minter_", + "type": "address" } ], - "stateMutability": "view", + "name": "setMinter", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousAnswer", + "inputs": [], + "name": "symbol", "outputs": [ { - "internalType": "int256", + "internalType": "string", "name": "", - "type": "int256" + "type": "string" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousTimestamp", + "inputs": [], + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -26354,59 +26299,24 @@ { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "dst", + "type": "address" }, { "internalType": "uint256", - "name": "", + "name": "rawAmount", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", + "name": "transfer", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -26414,24 +26324,21 @@ "inputs": [ { "internalType": "address", - "name": "_aggregator", + "name": "src", "type": "address" - } - ], - "name": "setReferenceContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + }, { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "rawAmount", + "type": "uint256" } ], - "name": "supportsInterface", + "name": "transferFrom", "outputs": [ { "internalType": "bool", @@ -26439,26 +26346,13 @@ "type": "bool" } ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], "stateMutability": "nonpayable", "type": "function" } ] }, - "DAIRewardHandler": { - "address": "0x423eDDfAA00fE22945739070BB911AcBF1fDf4D4", + "CTXLiquidityReward": { + "address": "0x06e4F32A5f3bD64C4c620644d107601368BfCb27", "abi": [ { "inputs": [ @@ -26474,8 +26368,18 @@ }, { "internalType": "address", - "name": "_vault", + "name": "_stakingToken", "type": "address" + }, + { + "internalType": "uint256", + "name": "_vestingEnd", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_vestingRatio", + "type": "uint256" } ], "stateMutability": "nonpayable", @@ -26735,6 +26639,13 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "claimVest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -26755,13 +26666,7 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_staker", - "type": "address" - } - ], + "inputs": [], "name": "exit", "outputs": [], "stateMutability": "nonpayable", @@ -26787,19 +26692,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "_staker", - "type": "address" - } - ], - "name": "getRewardFromVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -27166,11 +27058,6 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "_staker", - "type": "address" - }, { "internalType": "uint256", "name": "_amount", @@ -27182,6 +27069,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "stakingToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "totalSupply", @@ -27228,25 +27128,52 @@ "type": "function" }, { - "inputs": [], - "name": "vault", - "outputs": [ + "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], + "name": "vestingAmounts", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "vestingEnd", + "outputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" - }, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vestingRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", "name": "_amount", @@ -27260,72 +27187,11 @@ } ] }, - "DAIVaultHandler": { - "address": "0x7fF4580aD66a3C0F62DDa843674A3811ac062211", + "DAI": { + "address": "0x118a4238E4086FAE2621D0336C0E6cdC1257BE82", "abi": [ { - "inputs": [ - { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_divisor", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardHandler", - "type": "address" - }, - { - "internalType": "address", - "name": "_treasury", - "type": "address" - } - ], + "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, @@ -27335,23 +27201,23 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "owner", "type": "address" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "address", + "name": "spender", + "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "value", "type": "uint256" } ], - "name": "CollateralAdded", + "name": "Approval", "type": "event" }, { @@ -27360,348 +27226,324 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "from", "type": "address" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "address", + "name": "to", + "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "value", "type": "uint256" } ], - "name": "CollateralRemoved", + "name": "Transfer", "type": "event" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "owner", "type": "address" }, { - "indexed": false, + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" } ], - "name": "NewBurnFee", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "spender", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "amount", "type": "uint256" } ], - "name": "NewLiquidationPenalty", - "type": "event" + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "account", "type": "address" - }, + } + ], + "name": "balanceOf", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_ratio", + "name": "", "type": "uint256" } ], - "name": "NewRatio", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "_account", "type": "address" }, { - "indexed": false, - "internalType": "address", - "name": "_tresury", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "NewTreasury", - "type": "event" + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "spender", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" } ], - "name": "Paused", - "type": "event" + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "_token", + "name": "_account", "type": "address" }, { - "indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, + "inputs": [], + "name": "name", + "outputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "RoleAdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, + "inputs": [], + "name": "symbol", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "RoleGranted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, + "inputs": [], + "name": "totalSupply", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "RoleRevoked", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "recipient", "type": "address" }, { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "amount", "type": "uint256" - }, + } + ], + "name": "transfer", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "TokensBurned", - "type": "event" + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "sender", "type": "address" }, { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "address", + "name": "recipient", + "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" } ], - "name": "TokensMinted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "transferFrom", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "Unpaused", - "type": "event" - }, + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "DAIOracle": { + "address": "0xb50365a53EB0d8f214FFD0Cc0F2936BD877B3e17", + "abi": [ { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "_aggregator", "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" } ], - "name": "VaultCreated", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "previousOwner", + "type": "address" }, { "indexed": true, "internalType": "address", - "name": "_liquidator", + "name": "newOwner", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_reward", - "type": "uint256" } ], - "name": "VaultLiquidated", + "name": "OwnershipTransferred", "type": "event" }, { "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "getLatestAnswer", "outputs": [ { - "internalType": "bytes32", + "internalType": "int256", "name": "", - "type": "bytes32" + "type": "int256" } ], "stateMutability": "view", @@ -27709,38 +27551,32 @@ }, { "inputs": [], - "name": "ETHPriceOracle", + "name": "getLatestRound", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "uint80", "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_FEE", - "outputs": [ + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", "name": "", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_RATIO", - "outputs": [ + }, { "internalType": "uint256", "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", @@ -27748,11 +27584,11 @@ }, { "inputs": [], - "name": "TCAPPrice", + "name": "getLatestTimestamp", "outputs": [ { "internalType": "uint256", - "name": "price", + "name": "", "type": "uint256" } ], @@ -27760,13 +27596,19 @@ "type": "function" }, { - "inputs": [], - "name": "TCAPToken", + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", "outputs": [ { - "internalType": "contract TCAP", + "internalType": "int256", "name": "", - "type": "address" + "type": "int256" } ], "stateMutability": "view", @@ -27774,64 +27616,57 @@ }, { "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "addCollateral", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "burnFee", + "name": "getRound", "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", "name": "", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "collateralContract", - "outputs": [ + }, { - "internalType": "contract IERC20", + "internalType": "uint256", "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "collateralPriceOracle", - "outputs": [ + "type": "uint256" + }, { - "internalType": "contract ChainlinkOracle", + "internalType": "uint80", "name": "", - "type": "address" + "type": "uint80" } ], "stateMutability": "view", @@ -27839,12 +27674,12 @@ }, { "inputs": [], - "name": "counter", + "name": "owner", "outputs": [ { - "internalType": "uint256", - "name": "_value", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], "stateMutability": "view", @@ -27852,245 +27687,312 @@ }, { "inputs": [], - "name": "createVault", + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "divisor", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_aggregator", + "type": "address" } ], - "stateMutability": "view", + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" } ], - "name": "getFee", + "name": "supportsInterface", "outputs": [ { - "internalType": "uint256", - "name": "fee", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "internalType": "address", + "name": "newOwner", "type": "address" } ], - "name": "getOraclePrice", - "outputs": [ - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "DAIRewardHandler": { + "address": "0x423eDDfAA00fE22945739070BB911AcBF1fDf4D4", + "abi": [ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ + "internalType": "address", + "name": "_owner", + "type": "address" + }, { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_vault", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" }, { - "internalType": "uint256", - "name": "index", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "getRoleMember", - "outputs": [ + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Recovered", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "_id", + "name": "reward", "type": "uint256" } ], - "name": "getVault", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, + "name": "RewardAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "user", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "reward", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardPaid", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "_vaultId", + "name": "newDuration", "type": "uint256" } ], - "name": "getVaultRatio", - "outputs": [ + "name": "RewardsDurationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "currentRatio", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { + "indexed": true, "internalType": "address", "name": "account", "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { + "indexed": true, "internalType": "address", "name": "account", "type": "address" - } - ], - "name": "hasRole", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "_vaultId", + "name": "amount", "type": "uint256" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_maxTCAP", + "name": "amount", "type": "uint256" } ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", - "type": "function" + "name": "Withdrawn", + "type": "event" }, { "inputs": [], - "name": "liquidationPenalty", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", @@ -28099,16 +28001,16 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "_account", + "type": "address" } ], - "name": "liquidationReward", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", - "name": "rewardCollateral", + "name": "", "type": "uint256" } ], @@ -28118,19 +28020,12 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "_account", + "type": "address" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "oracleDigits", + "name": "earned", "outputs": [ { "internalType": "uint256", @@ -28142,41 +28037,28 @@ "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "_staker", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", + "name": "exit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "ratio", + "name": "getRewardForDuration", "outputs": [ { "internalType": "uint256", @@ -28191,16 +28073,11 @@ "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "_staker", "type": "address" - }, - { - "internalType": "uint256", - "name": "_tokenAmount", - "type": "uint256" } ], - "name": "recoverERC20", + "name": "getRewardFromVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -28208,21 +28085,20 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "removeCollateral", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", "type": "function" }, { @@ -28232,30 +28108,36 @@ "name": "role", "type": "bytes32" }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ { "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "requiredCollateral", + "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", - "name": "collateral", + "name": "", "type": "uint256" } ], @@ -28265,20 +28147,19 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "requiredLiquidationTCAP", - "outputs": [ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -28294,85 +28175,96 @@ "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "rewardHandler", + "name": "lastTimeRewardApplicable", "outputs": [ { - "internalType": "contract IRewardHandler", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ { "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "_a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_b", "type": "uint256" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "name": "min", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_ratio", + "name": "_reward", "type": "uint256" } ], - "name": "setRatio", + "name": "notifyRewardAmount", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "_treasury", + "name": "", "type": "address" } ], - "name": "setTreasury", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", + "inputs": [], + "name": "paused", "outputs": [ { "internalType": "bool", @@ -28380,17 +28272,17 @@ "type": "bool" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "tcapOracle", + "name": "periodFinish", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -28400,44 +28292,66 @@ "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "_tokenAddress", "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" } ], - "name": "transferOwnership", + "name": "recoverERC20", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "treasury", - "outputs": [ + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", + "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "name": "userToVault", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", "outputs": [ { "internalType": "uint256", @@ -28449,189 +28363,277 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], - "name": "vaults", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardRate", "outputs": [ { "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Debt", + "name": "", "type": "uint256" - }, - { - "internalType": "address", - "name": "Owner", - "type": "address" } ], "stateMutability": "view", "type": "function" - } - ] - }, - "DelegatorFactory": { - "address": "0x0aafdB19021a3a87A510dD4db7dce62318b49Cd1", - "abi": [ + }, { "inputs": [ { "internalType": "address", - "name": "stakingToken_", - "type": "address" - }, - { - "internalType": "address", - "name": "rewardsToken_", + "name": "", "type": "address" - }, + } + ], + "name": "rewards", + "outputs": [ { "internalType": "uint256", - "name": "waitTime_", + "name": "", "type": "uint256" - }, - { - "internalType": "address", - "name": "timelock_", - "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegator", - "type": "address" - }, + "inputs": [], + "name": "rewardsDuration", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "delegatee", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "DelegatorCreated", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "inputs": [], + "name": "rewardsToken", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", + "internalType": "contract IERC20", + "name": "", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_rewardsDuration", "type": "uint256" } ], - "name": "RewardAdded", - "type": "event" + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "user", + "name": "_staker", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_amount", "type": "uint256" } ], - "name": "RewardPaid", - "type": "event" + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRewardPerTokenPaid", + "outputs": [ + { "internalType": "uint256", - "name": "newDuration", + "name": "", "type": "uint256" } ], - "name": "RewardsDurationUpdated", - "type": "event" + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "delegator", + "name": "_staker", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "delegatee", + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "DAIVaultHandler": { + "address": "0x7fF4580aD66a3C0F62DDa843674A3811ac062211", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" } ], - "name": "Staked", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", - "name": "waitTime", + "name": "_amount", "type": "uint256" } ], - "name": "WaitTimeUpdated", + "name": "CollateralAdded", "type": "event" }, { @@ -28640,224 +28642,348 @@ { "indexed": true, "internalType": "address", - "name": "delegator", + "name": "_owner", "type": "address" }, { "indexed": true, - "internalType": "address", - "name": "delegatee", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "Withdrawn", + "name": "CollateralRemoved", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "account_", + "name": "_owner", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewBurnFee", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "delegatee_", + "name": "_owner", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "name": "createDelegator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewLiquidationPenalty", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "_owner", "type": "address" - } - ], - "name": "delegateeToDelegator", - "outputs": [ + }, { - "internalType": "address", - "name": "", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewRatio", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "_owner", "type": "address" - } - ], - "name": "delegatorToDelegatee", - "outputs": [ + }, { + "indexed": false, "internalType": "address", - "name": "", + "name": "_tresury", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "NewTreasury", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "previousOwner", "type": "address" - } - ], - "name": "delegators", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "account_", + "name": "account", "type": "address" } ], - "name": "earned", - "outputs": [ + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Recovered", + "type": "event" }, { - "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" }, { - "inputs": [], - "name": "getRewardForDuration", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { - "inputs": [], - "name": "lastUpdateTime", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": true, "internalType": "uint256", - "name": "", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "TokensBurned", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, "internalType": "uint256", - "name": "a_", + "name": "_id", "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "b_", + "name": "_amount", "type": "uint256" } ], - "name": "min", - "outputs": [ + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": true, "internalType": "uint256", - "name": "", + "name": "_id", "type": "uint256" } ], - "stateMutability": "pure", - "type": "function" + "name": "VaultCreated", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "uint256", - "name": "reward_", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", "type": "uint256" } ], - "name": "notifyRewardAmount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "VaultLiquidated", + "type": "event" }, { "inputs": [], - "name": "owner", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "address", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", @@ -28865,12 +28991,12 @@ }, { "inputs": [], - "name": "periodFinish", + "name": "ETHPriceOracle", "outputs": [ { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -28878,14 +29004,7 @@ }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerToken", + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -28898,7 +29017,7 @@ }, { "inputs": [], - "name": "rewardPerTokenStored", + "name": "MIN_RATIO", "outputs": [ { "internalType": "uint256", @@ -28911,11 +29030,11 @@ }, { "inputs": [], - "name": "rewardRate", + "name": "TCAPPrice", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "price", "type": "uint256" } ], @@ -28923,100 +29042,65 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "TCAPToken", + "outputs": [ { - "internalType": "address", + "internalType": "contract TCAP", "name": "", "type": "address" } ], - "name": "rewards", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "rewardsDuration", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardsToken", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "rewardsDuration_", + "name": "_amount", "type": "uint256" } ], - "name": "setRewardsDuration", + "name": "burn", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "delegator_", - "type": "address" - }, + "inputs": [], + "name": "burnFee", + "outputs": [ { "internalType": "uint256", - "name": "amount_", + "name": "", "type": "uint256" } ], - "name": "stake", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "stakerWaitTime", + "inputs": [], + "name": "collateralContract", "outputs": [ { - "internalType": "uint256", + "internalType": "contract IERC20", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -29024,10 +29108,10 @@ }, { "inputs": [], - "name": "stakingToken", + "name": "collateralPriceOracle", "outputs": [ { - "internalType": "address", + "internalType": "contract ChainlinkOracle", "name": "", "type": "address" } @@ -29037,11 +29121,11 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "counter", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_value", "type": "uint256" } ], @@ -29049,44 +29133,38 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", + "inputs": [], + "name": "createVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "divisor", + "outputs": [ { "internalType": "uint256", - "name": "waitTime_", + "name": "", "type": "uint256" } ], - "name": "updateWaitTime", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "userRewardPerTokenPaid", + "name": "getFee", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "fee", "type": "uint256" } ], @@ -29094,12 +29172,18 @@ "type": "function" }, { - "inputs": [], - "name": "waitTime", + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "price", "type": "uint256" } ], @@ -29109,287 +29193,186 @@ { "inputs": [ { - "internalType": "address", - "name": "delegator_", - "type": "address" - }, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ { - "internalType": "uint256", - "name": "amount_", - "type": "uint256" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "ETHLiquidityReward": { - "address": "0xDCDF84255652205debfc9c2603BF28F13597BD82", - "abi": [ + }, { "inputs": [ { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardsToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_stakingToken", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_vestingEnd", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "uint256", - "name": "_vestingRatio", + "name": "index", "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "name": "getRoleMember", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - }, + "name": "getRoleMemberCount", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "_id", "type": "uint256" } ], - "name": "RewardAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, { - "indexed": true, "internalType": "address", - "name": "user", + "name": "", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "reward", + "name": "", "type": "uint256" } ], - "name": "RewardPaid", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "uint256", - "name": "newDuration", + "name": "_vaultId", "type": "uint256" } ], - "name": "RewardsDurationUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, + "name": "getVaultRatio", + "outputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" } ], - "name": "RoleAdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, "internalType": "address", "name": "account", "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" } ], - "name": "RoleGranted", - "type": "event" + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, "internalType": "address", "name": "account", "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "Staked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "hasRole", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_maxTCAP", "type": "uint256" } ], - "name": "Withdrawn", - "type": "event" + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" }, { "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "liquidationPenalty", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", @@ -29398,16 +29381,16 @@ { "inputs": [ { - "internalType": "address", - "name": "_account", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" } ], - "name": "balanceOf", + "name": "liquidationReward", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "rewardCollateral", "type": "uint256" } ], @@ -29415,21 +29398,21 @@ "type": "function" }, { - "inputs": [], - "name": "claimVest", + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "earned", + "inputs": [], + "name": "oracleDigits", "outputs": [ { "internalType": "uint256", @@ -29442,45 +29425,45 @@ }, { "inputs": [], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "getReward", + "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "getRewardForDuration", + "name": "paused", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", + "inputs": [], + "name": "ratio", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", @@ -29489,44 +29472,39 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "_tokenAddress", + "type": "address" }, { "internalType": "uint256", - "name": "index", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -29542,7 +29520,7 @@ "type": "address" } ], - "name": "grantRole", + "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -29550,47 +29528,35 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "hasRole", + "name": "requiredCollateral", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "collateral", + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_vaultId", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastUpdateTime", + "name": "requiredLiquidationTCAP", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], @@ -29600,46 +29566,27 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_a", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "_b", - "type": "uint256" - } - ], - "name": "min", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_reward", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "notifyRewardAmount", + "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "rewardHandler", "outputs": [ { - "internalType": "address", + "internalType": "contract IRewardHandler", "name": "", "type": "address" } @@ -29648,70 +29595,53 @@ "type": "function" }, { - "inputs": [], - "name": "paused", - "outputs": [ + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" } ], - "stateMutability": "view", + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "periodFinish", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_liquidationPenalty", "type": "uint256" } ], - "stateMutability": "view", + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "_tokenAddress", - "type": "address" - }, { "internalType": "uint256", - "name": "_tokenAmount", + "name": "_ratio", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", + "name": "setRatio", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "_treasury", "type": "address" } ], - "name": "renounceRole", + "name": "setTreasury", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -29719,60 +29649,68 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "rewardPerToken", + "name": "tcapOracle", "outputs": [ { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "rewardPerTokenStored", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "rewardRate", + "name": "treasury", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -29781,7 +29719,7 @@ "type": "address" } ], - "name": "rewards", + "name": "userToVault", "outputs": [ { "internalType": "uint256", @@ -29793,193 +29731,177 @@ "type": "function" }, { - "inputs": [], - "name": "rewardsDuration", - "outputs": [ + "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardsToken", + "name": "vaults", "outputs": [ { - "internalType": "contract IERC20", - "name": "", + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", "type": "address" } ], "stateMutability": "view", "type": "function" - }, + } + ] + }, + "DelegatorFactory": { + "address": "0x0aafdB19021a3a87A510dD4db7dce62318b49Cd1", + "abi": [ { "inputs": [ + { + "internalType": "address", + "name": "stakingToken_", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardsToken_", + "type": "address" + }, { "internalType": "uint256", - "name": "_rewardsDuration", + "name": "waitTime_", "type": "uint256" + }, + { + "internalType": "address", + "name": "timelock_", + "type": "address" } ], - "name": "setRewardsDuration", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegatee", + "type": "address" } ], - "name": "stake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "DelegatorCreated", + "type": "event" }, { - "inputs": [], - "name": "stakingToken", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract IERC20", - "name": "", + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "reward", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardAdded", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "user", "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userRewardPerTokenPaid", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "reward", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardPaid", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "vestingAmounts", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "vestingEnd", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "vestingRatio", - "outputs": [ - { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "newDuration", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardsDurationUpdated", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "GovernorAlpha": { - "address": "0x6f0663fb471c8329De64fb86a2c1b741bb02cB20", - "abi": [ - { - "inputs": [ - { + "indexed": true, "internalType": "address", - "name": "timelock_", + "name": "delegator", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "ctx_", + "name": "delegatee", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "Staked", + "type": "event" }, { "anonymous": false, @@ -29987,158 +29909,103 @@ { "indexed": false, "internalType": "uint256", - "name": "id", + "name": "waitTime", "type": "uint256" } ], - "name": "ProposalCanceled", + "name": "WaitTimeUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "proposer", + "name": "delegator", "type": "address" }, { - "indexed": false, - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "indexed": false, - "internalType": "string[]", - "name": "signatures", - "type": "string[]" - }, - { - "indexed": false, - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "startBlock", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "delegatee", + "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "endBlock", + "name": "amount", "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "description", - "type": "string" } ], - "name": "ProposalCreated", + "name": "Withdrawn", "type": "event" }, { - "anonymous": false, "inputs": [ { - "indexed": false, + "internalType": "address", + "name": "account_", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { "internalType": "uint256", - "name": "id", + "name": "", "type": "uint256" } ], - "name": "ProposalExecuted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "eta", - "type": "uint256" + "internalType": "address", + "name": "delegatee_", + "type": "address" } ], - "name": "ProposalQueued", - "type": "event" + "name": "createDelegator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "voter", + "name": "", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bool", - "name": "support", - "type": "bool" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "votes", - "type": "uint256" } ], - "name": "VoteCast", - "type": "event" - }, - { - "inputs": [], - "name": "BALLOT_TYPEHASH", + "name": "delegateeToDelegator", "outputs": [ { - "internalType": "bytes32", + "internalType": "address", "name": "", - "type": "bytes32" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "DOMAIN_TYPEHASH", + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "delegatorToDelegatee", "outputs": [ { - "internalType": "bytes32", + "internalType": "address", "name": "", - "type": "bytes32" + "type": "address" } ], "stateMutability": "view", @@ -30147,124 +30014,84 @@ { "inputs": [ { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "cancel", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, + "name": "delegators", + "outputs": [ { "internalType": "bool", - "name": "support", + "name": "", "type": "bool" } ], - "name": "castVote", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "account_", + "type": "address" + } + ], + "name": "earned", + "outputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "", "type": "uint256" - }, - { - "internalType": "bool", - "name": "support", - "type": "bool" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" } ], - "name": "castVoteBySig", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "ctx", + "name": "getRewardForDuration", "outputs": [ { - "internalType": "contract CtxInterface", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "", "type": "uint256" } ], - "name": "execute", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "", "type": "uint256" } ], - "name": "getActions", - "outputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "string[]", - "name": "signatures", - "type": "string[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - } - ], "stateMutability": "view", "type": "function" }, @@ -30272,70 +30099,47 @@ "inputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "a_", "type": "uint256" }, { - "internalType": "address", - "name": "voter", - "type": "address" + "internalType": "uint256", + "name": "b_", + "type": "uint256" } ], - "name": "getReceipt", + "name": "min", "outputs": [ { - "components": [ - { - "internalType": "bool", - "name": "hasVoted", - "type": "bool" - }, - { - "internalType": "bool", - "name": "support", - "type": "bool" - }, - { - "internalType": "uint96", - "name": "votes", - "type": "uint96" - } - ], - "internalType": "struct GovernorAlpha.Receipt", + "internalType": "uint256", "name": "", - "type": "tuple" + "type": "uint256" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "latestProposalIds", - "outputs": [ { "internalType": "uint256", - "name": "", + "name": "reward_", "type": "uint256" } ], - "stateMutability": "view", + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "name", + "name": "owner", "outputs": [ { - "internalType": "string", + "internalType": "address", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", @@ -30343,7 +30147,7 @@ }, { "inputs": [], - "name": "proposalCount", + "name": "periodFinish", "outputs": [ { "internalType": "uint256", @@ -30356,7 +30160,14 @@ }, { "inputs": [], - "name": "proposalMaxOperations", + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", "outputs": [ { "internalType": "uint256", @@ -30364,12 +30175,12 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "proposalThreshold", + "name": "rewardPerTokenStored", "outputs": [ { "internalType": "uint256", @@ -30377,63 +30188,17 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "proposals", + "inputs": [], + "name": "rewardRate", "outputs": [ { "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "address", - "name": "proposer", - "type": "address" - }, - { - "internalType": "uint256", - "name": "eta", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "startBlock", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "endBlock", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "forVotes", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "againstVotes", + "name": "", "type": "uint256" - }, - { - "internalType": "bool", - "name": "canceled", - "type": "bool" - }, - { - "internalType": "bool", - "name": "executed", - "type": "bool" } ], "stateMutability": "view", @@ -30442,32 +30207,12 @@ { "inputs": [ { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "string[]", - "name": "signatures", - "type": "string[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "internalType": "string", - "name": "description", - "type": "string" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "propose", + "name": "rewards", "outputs": [ { "internalType": "uint256", @@ -30475,83 +30220,85 @@ "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "rewardsDuration", + "outputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "", "type": "uint256" } ], - "name": "queue", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "quorumVotes", + "name": "rewardsToken", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "", + "name": "rewardsDuration_", "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" } ], - "name": "receipts", - "outputs": [ - { - "internalType": "bool", - "name": "hasVoted", - "type": "bool" - }, + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "bool", - "name": "support", - "type": "bool" + "internalType": "address", + "name": "delegator_", + "type": "address" }, { - "internalType": "uint96", - "name": "votes", - "type": "uint96" + "internalType": "uint256", + "name": "amount_", + "type": "uint256" } ], - "stateMutability": "view", + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "state", + "name": "stakerWaitTime", "outputs": [ { - "internalType": "enum GovernorAlpha.ProposalState", + "internalType": "uint256", "name": "", - "type": "uint8" + "type": "uint256" } ], "stateMutability": "view", @@ -30559,10 +30306,10 @@ }, { "inputs": [], - "name": "timelock", + "name": "stakingToken", "outputs": [ { - "internalType": "contract TimelockInterface", + "internalType": "address", "name": "", "type": "address" } @@ -30572,7 +30319,7 @@ }, { "inputs": [], - "name": "votingDelay", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -30580,96 +30327,57 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "votingPeriod", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "pure", - "type": "function" - } - ] - }, - "LINK": { - "address": "0x5717DC7Cc0489dCc00316bcDB7e752aec664673e", - "abi": [ - { - "inputs": [], + "name": "transferOwnership", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "waitTime_", "type": "uint256" } ], - "name": "Approval", - "type": "event" + "name": "updateWaitTime", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, "internalType": "address", - "name": "to", + "name": "", "type": "address" - }, + } + ], + "name": "userRewardPerTokenPaid", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "", "type": "uint256" } ], - "name": "Transfer", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", + "inputs": [], + "name": "waitTime", "outputs": [ { "internalType": "uint256", @@ -30684,254 +30392,226 @@ "inputs": [ { "internalType": "address", - "name": "spender", + "name": "delegator_", "type": "address" }, { "internalType": "uint256", - "name": "amount", + "name": "amount_", "type": "uint256" } ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "name": "withdraw", + "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "ETHLiquidityReward": { + "address": "0xDCDF84255652205debfc9c2603BF28F13597BD82", + "abi": [ { "inputs": [ { "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, { "internalType": "address", - "name": "_account", + "name": "_stakingToken", "type": "address" }, { "internalType": "uint256", - "name": "_amount", + "name": "_vestingEnd", "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ + }, { - "internalType": "uint8", - "name": "", - "type": "uint8" + "internalType": "uint256", + "name": "_vestingRatio", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "previousOwner", "type": "address" }, { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "decreaseAllowance", - "outputs": [ + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "spender", + "name": "token", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "addedValue", + "name": "amount", "type": "uint256" } ], - "name": "increaseAllowance", - "outputs": [ + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "RewardAdded", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "user", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "reward", "type": "uint256" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" + "name": "RewardPaid", + "type": "event" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "newDuration", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardsDurationUpdated", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "recipient", - "type": "address" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "sender", - "type": "address" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { + "indexed": true, "internalType": "address", - "name": "recipient", + "name": "account", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "LinkOracle": { - "address": "0xEecF07643384C689C7AB804887ef2187cE75D5Ec", - "abi": [ + "name": "RoleGranted", + "type": "event" + }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", - "name": "_aggregator", + "name": "account", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "_timelock", + "name": "sender", "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "RoleRevoked", + "type": "event" }, { "anonymous": false, @@ -30939,73 +30619,59 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "user", "type": "address" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "OwnershipTransferred", + "name": "Staked", "type": "event" }, { - "inputs": [], - "name": "getLatestAnswer", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "int256", - "name": "", - "type": "int256" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Unpaused", + "type": "event" }, { - "inputs": [], - "name": "getLatestRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], - "stateMutability": "view", - "type": "function" + "name": "Withdrawn", + "type": "event" }, { "inputs": [], - "name": "getLatestTimestamp", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes32", "name": "", - "type": "uint256" + "type": "bytes32" } ], "stateMutability": "view", @@ -31014,31 +30680,38 @@ { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "address", + "name": "_account", + "type": "address" } ], - "name": "getPreviousAnswer", + "name": "balanceOf", "outputs": [ { - "internalType": "int256", + "internalType": "uint256", "name": "", - "type": "int256" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "claimVest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "address", + "name": "_account", + "type": "address" } ], - "name": "getPreviousTimestamp", + "name": "earned", "outputs": [ { "internalType": "uint256", @@ -31050,564 +30723,415 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", + "inputs": [], + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getRewardForDuration", "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, { "internalType": "uint256", "name": "", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "owner", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", "outputs": [ { - "internalType": "address", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ { "internalType": "address", - "name": "_aggregator", + "name": "", "type": "address" } ], - "name": "setReferenceContract", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "supportsInterface", + "name": "getRoleMemberCount", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "transferOwnership", + "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "LinkVaultHandler": { - "address": "0xBd4a21cC2D12157765a8861A83FC4cfd216630b1", - "abi": [ + }, { "inputs": [ { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_divisor", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "address", - "name": "_rewardHandler", + "name": "account", "type": "address" - }, + } + ], + "name": "hasRole", + "outputs": [ { - "internalType": "address", - "name": "_treasury", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "CollateralAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "uint256", + "name": "_a", + "type": "uint256" }, { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_b", "type": "uint256" - }, + } + ], + "name": "min", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "CollateralRemoved", - "type": "event" + "stateMutability": "pure", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "_burnFee", + "name": "_reward", "type": "uint256" } ], - "name": "NewBurnFee", - "type": "event" + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" - } - ], - "name": "NewLiquidationPenalty", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - } - ], - "name": "NewRatio", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_tresury", + "name": "", "type": "address" } ], - "name": "NewTreasury", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "inputs": [], + "name": "paused", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "periodFinish", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "Paused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "_token", + "name": "_tokenAddress", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, "internalType": "address", "name": "account", "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" } ], - "name": "RoleGranted", - "type": "event" + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "indexed": true, "internalType": "address", "name": "account", "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" } ], - "name": "RoleRevoked", - "type": "event" + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "rewardPerToken", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardRate", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "TokensBurned", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "", "type": "address" - }, + } + ], + "name": "rewards", + "outputs": [ { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardsDuration", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "TokensMinted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "rewardsToken", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", + "internalType": "contract IERC20", + "name": "", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_rewardsDuration", "type": "uint256" } ], - "name": "VaultCreated", - "type": "event" + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "_liquidator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" - }, - { - "indexed": false, "internalType": "uint256", - "name": "_reward", + "name": "_amount", "type": "uint256" } ], - "name": "VaultLiquidated", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "ETHPriceOracle", + "name": "stakingToken", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "contract IERC20", "name": "", "type": "address" } @@ -31617,20 +31141,7 @@ }, { "inputs": [], - "name": "MAX_FEE", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_RATIO", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -31641,41 +31152,15 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "TCAPPrice", - "outputs": [ - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TCAPToken", - "outputs": [ - { - "internalType": "contract TCAP", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "addCollateral", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -31683,19 +31168,12 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "burnFee", + "name": "userRewardPerTokenPaid", "outputs": [ { "internalType": "uint256", @@ -31707,26 +31185,19 @@ "type": "function" }, { - "inputs": [], - "name": "collateralContract", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20", + "internalType": "address", "name": "", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "collateralPriceOracle", + "name": "vestingAmounts", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -31734,11 +31205,11 @@ }, { "inputs": [], - "name": "counter", + "name": "vestingEnd", "outputs": [ { "internalType": "uint256", - "name": "_value", + "name": "", "type": "uint256" } ], @@ -31747,14 +31218,7 @@ }, { "inputs": [], - "name": "createVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "divisor", + "name": "vestingRatio", "outputs": [ { "internalType": "uint256", @@ -31773,277 +31237,177 @@ "type": "uint256" } ], - "name": "getFee", - "outputs": [ - { - "internalType": "uint256", - "name": "fee", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "GovernorAlpha": { + "address": "0x6f0663fb471c8329De64fb86a2c1b741bb02cB20", + "abi": [ { "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "internalType": "address", + "name": "timelock_", "type": "address" - } - ], - "name": "getOraclePrice", - "outputs": [ - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ { "internalType": "address", - "name": "", + "name": "ctx_", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "id", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "ProposalCanceled", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "_id", - "type": "uint256" - } - ], - "name": "getVault", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", + "name": "id", "type": "uint256" }, { + "indexed": false, "internalType": "address", - "name": "", + "name": "proposer", "type": "address" }, { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "getVaultRatio", - "outputs": [ - { - "internalType": "uint256", - "name": "currentRatio", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": false, + "internalType": "address[]", + "name": "targets", + "type": "address[]" }, { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" }, { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ + "indexed": false, + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "indexed": false, + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, { + "indexed": false, "internalType": "uint256", - "name": "_vaultId", + "name": "startBlock", "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "_maxTCAP", + "name": "endBlock", "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" } ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", - "type": "function" + "name": "ProposalCreated", + "type": "event" }, { - "inputs": [], - "name": "liquidationPenalty", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "id", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "ProposalExecuted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "_vaultId", + "name": "id", "type": "uint256" - } - ], - "name": "liquidationReward", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "rewardCollateral", + "name": "eta", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "ProposalQueued", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "proposalId", "type": "uint256" - } - ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "oracleDigits", - "outputs": [ + }, { + "indexed": false, + "internalType": "bool", + "name": "support", + "type": "bool" + }, + { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "votes", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "VoteCast", + "type": "event" }, { "inputs": [], - "name": "owner", + "name": "BALLOT_TYPEHASH", "outputs": [ { - "internalType": "address", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], "stateMutability": "view", @@ -32051,51 +31415,44 @@ }, { "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "DOMAIN_TYPEHASH", "outputs": [ { - "internalType": "bool", + "internalType": "bytes32", "name": "", - "type": "bool" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "ratio", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "proposalId", "type": "uint256" } ], - "stateMutability": "view", + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "_tokenAddress", - "type": "address" - }, { "internalType": "uint256", - "name": "_tokenAmount", + "name": "proposalId", "type": "uint256" + }, + { + "internalType": "bool", + "name": "support", + "type": "bool" } ], - "name": "recoverERC20", + "name": "castVote", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -32104,54 +31461,90 @@ "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "proposalId", "type": "uint256" + }, + { + "internalType": "bool", + "name": "support", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" } ], - "name": "removeCollateral", + "name": "castVoteBySig", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "name": "ctx", + "outputs": [ + { + "internalType": "contract CtxInterface", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" } ], - "name": "renounceRole", + "name": "execute", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "proposalId", "type": "uint256" } ], - "name": "requiredCollateral", + "name": "getActions", "outputs": [ { - "internalType": "uint256", - "name": "collateral", - "type": "uint256" + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" } ], "stateMutability": "view", @@ -32161,16 +31554,38 @@ "inputs": [ { "internalType": "uint256", - "name": "_vaultId", + "name": "proposalId", "type": "uint256" + }, + { + "internalType": "address", + "name": "voter", + "type": "address" } ], - "name": "requiredLiquidationTCAP", + "name": "getReceipt", "outputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "components": [ + { + "internalType": "bool", + "name": "hasVoted", + "type": "bool" + }, + { + "internalType": "bool", + "name": "support", + "type": "bool" + }, + { + "internalType": "uint96", + "name": "votes", + "type": "uint96" + } + ], + "internalType": "struct GovernorAlpha.Receipt", + "name": "", + "type": "tuple" } ], "stateMutability": "view", @@ -32178,166 +31593,228 @@ }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", + "name": "latestProposalIds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "rewardHandler", + "name": "name", "outputs": [ { - "internalType": "contract IRewardHandler", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "proposalCount", + "outputs": [ { "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "proposalMaxOperations", + "outputs": [ { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "proposalThreshold", + "outputs": [ { "internalType": "uint256", - "name": "_ratio", + "name": "", "type": "uint256" } ], - "name": "setRatio", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" }, { "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proposals", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, { "internalType": "address", - "name": "_treasury", + "name": "proposer", "type": "address" + }, + { + "internalType": "uint256", + "name": "eta", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "startBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "forVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "againstVotes", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "canceled", + "type": "bool" + }, + { + "internalType": "bool", + "name": "executed", + "type": "bool" } ], - "name": "setTreasury", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "string", + "name": "description", + "type": "string" } ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "tcapOracle", + "name": "propose", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" } ], - "name": "transferOwnership", + "name": "queue", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "treasury", + "name": "quorumVotes", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" }, { "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, { "internalType": "address", "name": "", "type": "address" } ], - "name": "userToVault", + "name": "receipts", "outputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "bool", + "name": "hasVoted", + "type": "bool" + }, + { + "internalType": "bool", + "name": "support", + "type": "bool" + }, + { + "internalType": "uint96", + "name": "votes", + "type": "uint96" } ], "stateMutability": "view", @@ -32347,49 +31824,67 @@ "inputs": [ { "internalType": "uint256", - "name": "", + "name": "proposalId", "type": "uint256" } ], - "name": "vaults", + "name": "state", "outputs": [ { - "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, + "internalType": "enum GovernorAlpha.ProposalState", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "timelock", + "outputs": [ + { + "internalType": "contract TimelockInterface", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "votingDelay", + "outputs": [ { "internalType": "uint256", - "name": "Collateral", + "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "votingPeriod", + "outputs": [ { "internalType": "uint256", - "name": "Debt", + "name": "", "type": "uint256" - }, - { - "internalType": "address", - "name": "Owner", - "type": "address" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" } ] }, - "Orchestrator": { - "address": "0x32ac6dBaf90A4C45f160D13B32fDD10D75D09976", + "LINK": { + "address": "0x5717DC7Cc0489dCc00316bcDB7e752aec664673e", "abi": [ { - "inputs": [ - { - "internalType": "address", - "name": "_guardian", - "type": "address" - } - ], + "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, @@ -32399,17 +31894,23 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "owner", "type": "address" }, { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "guardian", + "name": "spender", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "GuardianSet", + "name": "Approval", "type": "event" }, { @@ -32418,26 +31919,13 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "target", + "name": "to", "type": "address" }, { @@ -32445,56 +31933,56 @@ "internalType": "uint256", "name": "value", "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" } ], - "name": "TransactionExecuted", + "name": "Transfer", "type": "event" }, { "inputs": [ { - "internalType": "contract TCAP", - "name": "_tcap", + "internalType": "address", + "name": "owner", "type": "address" }, { - "internalType": "contract IVaultHandler", - "name": "_vault", + "internalType": "address", + "name": "spender", "type": "address" } ], - "name": "addTCAPVault", - "outputs": [], - "stateMutability": "nonpayable", + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "contract TCAP", - "name": "_tcap", + "internalType": "address", + "name": "spender", "type": "address" }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ { "internalType": "bool", - "name": "_enable", + "name": "", "type": "bool" } ], - "name": "enableTCAPCap", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -32502,57 +31990,47 @@ "inputs": [ { "internalType": "address", - "name": "target", + "name": "account", "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" } ], - "name": "executeTransaction", + "name": "balanceOf", "outputs": [ { - "internalType": "bytes", + "internalType": "uint256", "name": "", - "type": "bytes" + "type": "uint256" } ], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "guardian", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "_account", "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "decimals", "outputs": [ { - "internalType": "address", + "internalType": "uint8", "name": "", - "type": "address" + "type": "uint8" } ], "stateMutability": "view", @@ -32561,220 +32039,176 @@ { "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", + "internalType": "address", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "pauseVault", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "contract TCAP", - "name": "_tcap", + "internalType": "address", + "name": "spender", "type": "address" }, { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" } ], - "name": "removeTCAPVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "increaseAllowance", + "outputs": [ { - "internalType": "address", - "name": "_to", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "retrieveETH", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", + "internalType": "address", + "name": "_account", "type": "address" }, { "internalType": "uint256", - "name": "_burnFee", + "name": "_amount", "type": "uint256" } ], - "name": "setBurnFee", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "name", + "outputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "setEmergencyBurnFee", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "symbol", + "outputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "setEmergencyLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "totalSupply", + "outputs": [ { - "internalType": "address", - "name": "_guardian", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "setGuardian", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", + "internalType": "address", + "name": "recipient", "type": "address" }, { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "amount", "type": "uint256" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" - }, + "name": "transfer", + "outputs": [ { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "setRatio", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "contract TCAP", - "name": "_tcap", + "internalType": "address", + "name": "sender", "type": "address" }, - { - "internalType": "uint256", - "name": "_cap", - "type": "uint256" - } - ], - "name": "setTCAPCap", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "recipient", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "transferFrom", + "outputs": [ { - "internalType": "contract IVaultHandler", - "name": "_vault", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "unpauseVault", - "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" } ] }, - "TCAP": { - "address": "0x565224C2b5Bdf33f3970d35f82945075F90128F4", + "LinkOracle": { + "address": "0xEecF07643384C689C7AB804887ef2187cE75D5Ec", "abi": [ { "inputs": [ { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "string", - "name": "_symbol", - "type": "string" - }, - { - "internalType": "uint256", - "name": "_cap", - "type": "uint256" + "internalType": "address", + "name": "_aggregator", + "type": "address" }, { - "internalType": "contract Orchestrator", - "name": "_orchestrator", + "internalType": "address", + "name": "_timelock", "type": "address" } ], @@ -32787,172 +32221,106 @@ { "indexed": true, "internalType": "address", - "name": "owner", + "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "spender", + "name": "newOwner", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" } ], - "name": "Approval", + "name": "OwnershipTransferred", "type": "event" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "int256", + "name": "", + "type": "int256" } ], - "name": "NewCap", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "getLatestRound", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "uint80", + "name": "", + "type": "uint80" }, { - "indexed": false, - "internalType": "bool", - "name": "_enable", - "type": "bool" - } - ], - "name": "NewCapEnabled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "internalType": "int256", + "name": "", + "type": "int256" + }, { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "", "type": "uint256" } ], - "name": "Transfer", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_tokenHandler", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "VaultHandlerAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_tokenHandler", - "type": "address" - } - ], - "name": "VaultHandlerRemoved", - "type": "event" - }, - { - "inputs": [ + "name": "getPreviousAnswer", + "outputs": [ { - "internalType": "address", - "name": "_vaultHandler", - "type": "address" + "internalType": "int256", + "name": "", + "type": "int256" } ], - "name": "addVaultHandler", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "allowance", + "name": "getPreviousTimestamp", "outputs": [ { "internalType": "uint256", @@ -32966,72 +32334,37 @@ { "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "approve", + "name": "getRound", "outputs": [ { - "internalType": "bool", + "internalType": "uint80", "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "type": "uint80" + }, { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", "name": "", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" }, { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "cap", - "outputs": [ + }, { - "internalType": "uint256", + "internalType": "uint80", "name": "", - "type": "uint256" + "type": "uint80" } ], "stateMutability": "view", @@ -33039,12 +32372,12 @@ }, { "inputs": [], - "name": "capEnabled", + "name": "owner", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", @@ -33052,31 +32385,33 @@ }, { "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "spender", + "name": "_aggregator", "type": "address" - }, + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" } ], - "name": "decreaseAllowance", + "name": "supportsInterface", "outputs": [ { "internalType": "bool", @@ -33084,375 +32419,487 @@ "type": "bool" } ], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" }, { "inputs": [ { - "internalType": "bool", - "name": "_enable", - "type": "bool" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "enableCap", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "LinkVaultHandler": { + "address": "0xBd4a21cC2D12157765a8861A83FC4cfd216630b1", + "abi": [ { "inputs": [ { - "internalType": "address", - "name": "spender", + "internalType": "contract Orchestrator", + "name": "_orchestrator", "type": "address" }, { "internalType": "uint256", - "name": "addedValue", + "name": "_divisor", "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" } ], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "_owner", "type": "address" }, { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "CollateralAdded", + "type": "event" }, { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "_owner", "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "CollateralRemoved", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "_vaultHandler", + "name": "_owner", "type": "address" - } - ], - "name": "removeVaultHandler", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "_cap", + "name": "_burnFee", "type": "uint256" } ], - "name": "setCap", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewBurnFee", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "stateMutability": "pure", - "type": "function" + "name": "NewLiquidationPenalty", + "type": "event" }, { - "inputs": [], - "name": "symbol", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewRatio", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "recipient", + "name": "_owner", "type": "address" }, { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewTreasury", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "sender", + "name": "previousOwner", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "recipient", + "name": "newOwner", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "_token", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "vaultHandlers", - "outputs": [ + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" - } - ] - }, - "TCAPOracle": { - "address": "0x87388c142a3848F966FBA7Db22663D9CCa7d8a86", - "abi": [ + "name": "RoleAdminChanged", + "type": "event" + }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", - "name": "_aggregator", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "RoleGranted", + "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "sender", "type": "address" } ], - "name": "OwnershipTransferred", + "name": "RoleRevoked", "type": "event" }, { - "inputs": [], - "name": "getLatestAnswer", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "int256", - "name": "", - "type": "int256" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "TokensBurned", + "type": "event" }, { - "inputs": [], - "name": "getLatestRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, + "anonymous": false, + "inputs": [ { - "internalType": "int256", - "name": "", - "type": "int256" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "", + "name": "_id", "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "uint80", - "name": "", - "type": "uint80" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Unpaused", + "type": "event" }, { - "inputs": [], - "name": "getLatestTimestamp", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": true, "internalType": "uint256", - "name": "", + "name": "_id", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "VaultCreated", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" } ], - "name": "getPreviousAnswer", + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "int256", + "internalType": "bytes32", "name": "", - "type": "int256" + "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" } ], - "name": "getPreviousTimestamp", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -33464,39 +32911,26 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", + "inputs": [], + "name": "MIN_RATIO", "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, { "internalType": "uint256", "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { "internalType": "uint256", - "name": "", + "name": "price", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], "stateMutability": "view", @@ -33504,10 +32938,10 @@ }, { "inputs": [], - "name": "owner", + "name": "TCAPToken", "outputs": [ { - "internalType": "address", + "internalType": "contract TCAP", "name": "", "type": "address" } @@ -33516,8 +32950,14 @@ "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -33525,253 +32965,178 @@ { "inputs": [ { - "internalType": "address", - "name": "_aggregator", - "type": "address" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "setReferenceContract", + "name": "burn", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "burnFee", + "outputs": [ { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "supportsInterface", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", "outputs": [ { - "internalType": "bool", + "internalType": "contract IERC20", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ { - "internalType": "address", - "name": "newOwner", + "internalType": "contract ChainlinkOracle", + "name": "", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "Timelock": { - "address": "0x65a2B1B48b7997a50947E83aaf58E29a54a0B735", - "abi": [ + }, { - "inputs": [ - { - "internalType": "address", - "name": "admin_", - "type": "address" - }, + "inputs": [], + "name": "counter", + "outputs": [ { "internalType": "uint256", - "name": "delay_", + "name": "_value", "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "eta", + "name": "", "type": "uint256" } ], - "name": "CancelTransaction", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, + } + ], + "name": "getFee", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "eta", + "name": "fee", "type": "uint256" } ], - "name": "ExecuteTransaction", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "newAdmin", + "internalType": "contract ChainlinkOracle", + "name": "_oracle", "type": "address" } ], - "name": "NewAdmin", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "getOraclePrice", + "outputs": [ { - "indexed": true, "internalType": "uint256", - "name": "newDelay", + "name": "price", "type": "uint256" } ], - "name": "NewDelay", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "newPendingAdmin", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "NewPendingAdmin", - "type": "event" + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", - "name": "txHash", + "name": "role", "type": "bytes32" }, { - "indexed": true, - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, "internalType": "uint256", - "name": "eta", + "name": "index", "type": "uint256" } ], - "name": "QueueTransaction", - "type": "event" - }, - { - "inputs": [], - "name": "GRACE_PERIOD", + "name": "getRoleMember", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "MAXIMUM_DELAY", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", @@ -33783,78 +33148,52 @@ "type": "function" }, { - "inputs": [], - "name": "MINIMUM_DELAY", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_id", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "acceptAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "admin", + "name": "getVault", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "target", - "type": "address" + "type": "uint256" }, { "internalType": "uint256", - "name": "value", + "name": "", "type": "uint256" }, { - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "address", + "name": "", + "type": "address" }, { "internalType": "uint256", - "name": "eta", + "name": "", "type": "uint256" } ], - "name": "cancelTransaction", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "delay", + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "currentRatio", "type": "uint256" } ], @@ -33864,108 +33203,90 @@ { "inputs": [ { - "internalType": "address", - "name": "target", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "eta", - "type": "uint256" - } - ], - "name": "executeTransaction", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "payable", + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "pendingAdmin", - "outputs": [ + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, { "internalType": "uint256", - "name": "value", + "name": "_vaultId", "type": "uint256" }, - { - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, { "internalType": "uint256", - "name": "eta", + "name": "_maxTCAP", "type": "uint256" } ], - "name": "queueTransaction", + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" } ], - "name": "queuedTransactions", + "name": "liquidationReward", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" } ], "stateMutability": "view", @@ -33975,37 +33296,51 @@ "inputs": [ { "internalType": "uint256", - "name": "delay_", + "name": "_amount", "type": "uint256" } ], - "name": "setDelay", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "pendingAdmin_", + "name": "", "type": "address" } ], - "name": "setPendingAdmin", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", + "inputs": [], + "name": "paused", "outputs": [ { "internalType": "bool", @@ -34013,134 +33348,110 @@ "type": "bool" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, - { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "WBTC": { - "address": "0x81A345e4627C614DaBA4E862A8c317023E935506", - "abi": [ { "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, "internalType": "address", - "name": "spender", + "name": "_tokenAddress", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "Approval", - "type": "event" + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_amount", "type": "uint256" } ], - "name": "Transfer", - "type": "event" + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "owner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "address", - "name": "spender", + "name": "account", "type": "address" } ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, { "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "approve", + "name": "requiredCollateral", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "collateral", + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" } ], - "name": "balanceOf", + "name": "requiredLiquidationTCAP", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], @@ -34150,29 +33461,29 @@ { "inputs": [ { - "internalType": "address", - "name": "_account", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "burn", + "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "decimals", + "name": "rewardHandler", "outputs": [ { - "internalType": "uint8", + "internalType": "contract IRewardHandler", "name": "", - "type": "uint8" + "type": "address" } ], "stateMutability": "view", @@ -34180,49 +33491,40 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, { "internalType": "uint256", - "name": "subtractedValue", + "name": "_burnFee", "type": "uint256" } ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "name": "setBurnFee", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, { "internalType": "uint256", - "name": "addedValue", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "increaseAllowance", - "outputs": [ + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" } ], + "name": "setRatio", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -34230,141 +33532,148 @@ "inputs": [ { "internalType": "address", - "name": "_account", + "name": "_treasury", "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" } ], - "name": "mint", + "name": "setTreasury", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "name", + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { - "internalType": "string", + "internalType": "bool", "name": "", - "type": "string" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "symbol", + "name": "tcapOracle", "outputs": [ { - "internalType": "string", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], - "name": "totalSupply", + "name": "treasury", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { "internalType": "address", - "name": "recipient", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "transfer", + "name": "userToVault", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" }, { - "internalType": "address", - "name": "recipient", - "type": "address" + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" }, { "internalType": "uint256", - "name": "amount", + "name": "Debt", "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "Owner", + "type": "address" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" } ] }, - "WETH": { - "address": "0x5D3E425A099c2863224d6D63b330Df0F22B299b9", + "Orchestrator": { + "address": "0x32ac6dBaf90A4C45f160D13B32fDD10D75D09976", "abi": [ { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "indexed": true, "internalType": "address", - "name": "guy", + "name": "_guardian", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" } ], - "name": "Approval", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, @@ -34372,17 +33681,17 @@ { "indexed": true, "internalType": "address", - "name": "dst", + "name": "_owner", "type": "address" }, { "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" + "internalType": "address", + "name": "guardian", + "type": "address" } ], - "name": "Deposit", + "name": "GuardianSet", "type": "event" }, { @@ -34391,23 +33700,17 @@ { "indexed": true, "internalType": "address", - "name": "src", + "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "dst", + "name": "newOwner", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" } ], - "name": "Transfer", + "name": "OwnershipTransferred", "type": "event" }, { @@ -34416,64 +33719,64 @@ { "indexed": true, "internalType": "address", - "name": "src", + "name": "target", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "wad", + "name": "value", "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "name": "Withdrawal", + "name": "TransactionExecuted", "type": "event" }, { "inputs": [ { - "internalType": "address", - "name": "", + "internalType": "contract TCAP", + "name": "_tcap", "type": "address" }, { - "internalType": "address", - "name": "", + "internalType": "contract IVaultHandler", + "name": "_vault", "type": "address" } ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "addTCAPVault", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "guy", + "internalType": "contract TCAP", + "name": "_tcap", "type": "address" }, - { - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ { "internalType": "bool", - "name": "", + "name": "_enable", "type": "bool" } ], + "name": "enableTCAPCap", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -34481,49 +33784,44 @@ "inputs": [ { "internalType": "address", - "name": "", + "name": "target", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "value", "type": "uint256" + }, + { + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", + "name": "executeTransaction", "outputs": [ { - "internalType": "uint8", + "internalType": "bytes", "name": "", - "type": "uint8" + "type": "bytes" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "deposit", - "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "name", + "name": "guardian", "outputs": [ { - "internalType": "string", + "internalType": "address", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", @@ -34531,51 +33829,52 @@ }, { "inputs": [], - "name": "symbol", + "name": "owner", "outputs": [ { - "internalType": "string", + "internalType": "address", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" } ], - "stateMutability": "view", + "name": "pauseVault", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "dst", + "internalType": "contract TCAP", + "name": "_tcap", "type": "address" }, { - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" } ], + "name": "removeTCAPVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -34583,300 +33882,181 @@ "inputs": [ { "internalType": "address", - "name": "src", + "name": "_to", "type": "address" - }, + } + ], + "name": "retrieveETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "address", - "name": "dst", + "internalType": "contract IVaultHandler", + "name": "_vault", "type": "address" }, { "internalType": "uint256", - "name": "wad", + "name": "_burnFee", "type": "uint256" } ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "name": "setBurnFee", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "wad", - "type": "uint256" + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" } ], - "name": "withdraw", + "name": "setEmergencyBurnFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "WETHOracle": { - "address": "0x731Aa03C683Afb292732C31c1d50C491B8d8043F", - "abi": [ + }, { "inputs": [ { - "internalType": "address", - "name": "_aggregator", + "internalType": "contract IVaultHandler", + "name": "_vault", "type": "address" } ], + "name": "setEmergencyLiquidationPenalty", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "_guardian", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "setGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "inputs": [], - "name": "getLatestAnswer", - "outputs": [ + "inputs": [ { - "internalType": "int256", - "name": "", - "type": "int256" + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "stateMutability": "view", + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "getLatestRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "contract IVaultHandler", + "name": "_vault", + "type": "address" }, { "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], - "stateMutability": "view", + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "getLatestTimestamp", - "outputs": [ + "inputs": [ + { + "internalType": "contract TCAP", + "name": "_tcap", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "_cap", "type": "uint256" } ], - "stateMutability": "view", + "name": "setTCAPCap", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousAnswer", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_aggregator", + "internalType": "contract IVaultHandler", + "name": "_vault", "type": "address" } ], - "name": "setReferenceContract", + "name": "unpauseVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "stateMutability": "payable", + "type": "receive" } ] }, - "WETHRewardHandler": { - "address": "0x39347a6328e1D4601A389d4dB0B26aC305886fb0", + "TCAP": { + "address": "0x565224C2b5Bdf33f3970d35f82945075F90128F4", "abi": [ { "inputs": [ { - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "string", + "name": "_name", + "type": "string" }, { - "internalType": "address", - "name": "_rewardsToken", - "type": "address" + "internalType": "string", + "name": "_symbol", + "type": "string" }, { - "internalType": "address", - "name": "_vault", + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + }, + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", "type": "address" } ], @@ -34889,62 +34069,42 @@ { "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "spender", "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "Paused", + "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "token", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "reward", + "name": "_amount", "type": "uint256" } ], - "name": "RewardAdded", + "name": "NewCap", "type": "event" }, { @@ -34953,30 +34113,36 @@ { "indexed": true, "internalType": "address", - "name": "user", + "name": "_owner", "type": "address" }, { "indexed": false, - "internalType": "uint256", - "name": "reward", - "type": "uint256" + "internalType": "bool", + "name": "_enable", + "type": "bool" } ], - "name": "RewardPaid", + "name": "NewCapEnabled", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "newDuration", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "RewardsDurationUpdated", + "name": "OwnershipTransferred", "type": "event" }, { @@ -34984,145 +34150,130 @@ "inputs": [ { "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "from", + "type": "address" }, { "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" + "internalType": "address", + "name": "to", + "type": "address" }, { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "RoleAdminChanged", + "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "sender", + "name": "_tokenHandler", "type": "address" } ], - "name": "RoleGranted", + "name": "VaultHandlerAdded", "type": "event" }, { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "sender", + "name": "_tokenHandler", "type": "address" } ], - "name": "RoleRevoked", + "name": "VaultHandlerRemoved", "type": "event" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "user", + "name": "_vaultHandler", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "Staked", - "type": "event" + "name": "addVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "user", + "name": "spender", "type": "address" }, { - "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], - "name": "Withdrawn", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "approve", "outputs": [ { - "internalType": "bytes32", + "internalType": "bool", "name": "", - "type": "bytes32" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_account", + "name": "account", "type": "address" } ], @@ -35143,9 +34294,21 @@ "internalType": "address", "name": "_account", "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "earned", + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cap", "outputs": [ { "internalType": "uint256", @@ -35157,33 +34320,26 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "capEnabled", + "outputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "getRewardForDuration", + "name": "decimals", "outputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "", - "type": "uint256" + "type": "uint8" } ], "stateMutability": "view", @@ -35193,11 +34349,35 @@ "inputs": [ { "internalType": "address", - "name": "_staker", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" } ], - "name": "getRewardFromVault", + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "enableCap", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -35205,60 +34385,66 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" } ], - "name": "getRoleAdmin", + "name": "increaseAllowance", "outputs": [ { - "internalType": "bytes32", + "internalType": "bool", "name": "", - "type": "bytes32" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "_account", + "type": "address" }, { "internalType": "uint256", - "name": "index", + "name": "_amount", "type": "uint256" } ], - "name": "getRoleMember", + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", "outputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", + "inputs": [], + "name": "owner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -35266,18 +34452,20 @@ }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "_vaultHandler", "type": "address" } ], - "name": "grantRole", + "name": "removeVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -35285,17 +34473,25 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + } + ], + "name": "setCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" } ], - "name": "hasRole", + "name": "supportsInterface", "outputs": [ { "internalType": "bool", @@ -35303,17 +34499,17 @@ "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "lastTimeRewardApplicable", + "name": "symbol", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], "stateMutability": "view", @@ -35321,7 +34517,7 @@ }, { "inputs": [], - "name": "lastUpdateTime", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -35335,148 +34531,164 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_a", - "type": "uint256" + "internalType": "address", + "name": "recipient", + "type": "address" }, { "internalType": "uint256", - "name": "_b", + "name": "amount", "type": "uint256" } ], - "name": "min", + "name": "transfer", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "pure", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, { "internalType": "uint256", - "name": "_reward", + "name": "amount", "type": "uint256" } ], - "name": "notifyRewardAmount", - "outputs": [], - "stateMutability": "nonpayable", + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "paused", - "outputs": [ + "inputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "periodFinish", + "name": "vaultHandlers", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" - }, + } + ] + }, + "TCAPOracle": { + "address": "0x87388c142a3848F966FBA7Db22663D9CCa7d8a86", + "abi": [ { "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "_aggregator", "type": "address" - }, - { - "internalType": "uint256", - "name": "_tokenAmount", - "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "int256", + "name": "", + "type": "int256" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "rewardPerToken", + "name": "getLatestRound", "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, { "internalType": "uint256", "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", @@ -35484,7 +34696,7 @@ }, { "inputs": [], - "name": "rewardPerTokenStored", + "name": "getLatestTimestamp", "outputs": [ { "internalType": "uint256", @@ -35496,13 +34708,19 @@ "type": "function" }, { - "inputs": [], - "name": "rewardRate", + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", "outputs": [ { - "internalType": "uint256", + "internalType": "int256", "name": "", - "type": "uint256" + "type": "int256" } ], "stateMutability": "view", @@ -35511,12 +34729,12 @@ { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "rewards", + "name": "getPreviousTimestamp", "outputs": [ { "internalType": "uint256", @@ -35528,13 +34746,39 @@ "type": "function" }, { - "inputs": [], - "name": "rewardsDuration", + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, { "internalType": "uint256", "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", @@ -35542,10 +34786,10 @@ }, { "inputs": [], - "name": "rewardsToken", + "name": "owner", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "address", "name": "", "type": "address" } @@ -35554,14 +34798,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_rewardsDuration", - "type": "uint256" - } - ], - "name": "setRewardsDuration", + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -35570,31 +34808,32 @@ "inputs": [ { "internalType": "address", - "name": "_staker", + "name": "_aggregator", "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" } ], - "name": "stake", + "name": "setReferenceContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "totalSupply", + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { @@ -35609,151 +34848,112 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "Timelock": { + "address": "0x65a2B1B48b7997a50947E83aaf58E29a54a0B735", + "abi": [ { "inputs": [ { "internalType": "address", - "name": "", + "name": "admin_", "type": "address" - } - ], - "name": "userRewardPerTokenPaid", - "outputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "delay_", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "vault", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "WETHVaultHandler": { - "address": "0x093f8F7C7fCC6edf991309A5056feB5cA9579292", - "abi": [ - { - "inputs": [ - { - "internalType": "contract Orchestrator", - "name": "_orchestrator", + "indexed": true, + "internalType": "address", + "name": "target", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_divisor", + "name": "value", "type": "uint256" }, { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" }, { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" }, { + "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "eta", "type": "uint256" - }, - { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardHandler", - "type": "address" - }, - { - "internalType": "address", - "name": "_treasury", - "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "CancelTransaction", + "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "target", "type": "address" }, { - "indexed": true, + "indexed": false, "internalType": "uint256", - "name": "_id", + "name": "value", "type": "uint256" }, + { + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "eta", "type": "uint256" } ], - "name": "CollateralAdded", + "name": "ExecuteTransaction", "type": "event" }, { @@ -35762,23 +34962,11 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "newAdmin", "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" } ], - "name": "CollateralRemoved", + "name": "NewAdmin", "type": "event" }, { @@ -35786,18 +34974,12 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, "internalType": "uint256", - "name": "_burnFee", + "name": "newDelay", "type": "uint256" } ], - "name": "NewBurnFee", + "name": "NewDelay", "type": "event" }, { @@ -35806,299 +34988,242 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "newPendingAdmin", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" } ], - "name": "NewLiquidationPenalty", + "name": "NewPendingAdmin", "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "target", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_ratio", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "signature", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "eta", "type": "uint256" } ], - "name": "NewRatio", + "name": "QueueTransaction", "type": "event" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "GRACE_PERIOD", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "_tresury", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "NewTreasury", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "MAXIMUM_DELAY", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINIMUM_DELAY", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "acceptAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "Paused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "_token", + "name": "target", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "value", "type": "uint256" - } - ], - "name": "Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" }, { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "string", + "name": "signature", + "type": "string" }, { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "bytes", + "name": "data", + "type": "bytes" }, { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint256", + "name": "eta", + "type": "uint256" } ], - "name": "RoleGranted", - "type": "event" + "name": "cancelTransaction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, + "inputs": [], + "name": "delay", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "RoleRevoked", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "target", "type": "address" }, { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "value", "type": "uint256" }, { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "TokensBurned", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "string", + "name": "signature", + "type": "string" }, { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "bytes", + "name": "data", + "type": "bytes" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "eta", "type": "uint256" } ], - "name": "TokensMinted", - "type": "event" + "name": "executeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "pendingAdmin", + "outputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "target", "type": "address" }, { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - } - ], - "name": "VaultCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, "internalType": "uint256", - "name": "_vaultId", + "name": "value", "type": "uint256" }, { - "indexed": true, - "internalType": "address", - "name": "_liquidator", - "type": "address" + "internalType": "string", + "name": "signature", + "type": "string" }, { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" + "internalType": "bytes", + "name": "data", + "type": "bytes" }, { - "indexed": false, "internalType": "uint256", - "name": "_reward", + "name": "eta", "type": "uint256" } ], - "name": "VaultLiquidated", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", + "name": "queueTransaction", "outputs": [ { "internalType": "bytes32", @@ -36106,169 +35231,194 @@ "type": "bytes32" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "ETHPriceOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "bytes32", "name": "", - "type": "address" + "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_FEE", + "name": "queuedTransactions", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "MIN_RATIO", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "delay_", "type": "uint256" } ], - "stateMutability": "view", + "name": "setDelay", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "TCAPPrice", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "price", - "type": "uint256" + "internalType": "address", + "name": "pendingAdmin_", + "type": "address" } ], - "stateMutability": "view", + "name": "setPendingAdmin", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "TCAPToken", + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { - "internalType": "contract TCAP", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "addCollateral", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "WBTC": { + "address": "0x81A345e4627C614DaBA4E862A8c317023E935506", + "abi": [ { "inputs": [], - "name": "addCollateralETH", - "outputs": [], - "stateMutability": "payable", - "type": "function" + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "value", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", - "type": "function" + "name": "Approval", + "type": "event" }, { - "inputs": [], - "name": "burnFee", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "value", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Transfer", + "type": "event" }, { - "inputs": [], - "name": "collateralContract", - "outputs": [ + "inputs": [ { - "internalType": "contract IERC20", - "name": "", + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "collateralPriceOracle", + "name": "allowance", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "counter", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "_value", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "createVault", - "outputs": [], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "divisor", + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -36281,18 +35431,30 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "getFee", + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", "outputs": [ { - "internalType": "uint256", - "name": "fee", - "type": "uint256" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], "stateMutability": "view", @@ -36301,74 +35463,98 @@ { "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "internalType": "address", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" } ], - "name": "getOraclePrice", + "name": "decreaseAllowance", "outputs": [ { - "internalType": "uint256", - "name": "price", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" } ], - "name": "getRoleAdmin", + "name": "increaseAllowance", "outputs": [ { - "internalType": "bytes32", + "internalType": "bool", "name": "", - "type": "bytes32" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "_account", + "type": "address" }, { "internalType": "uint256", - "name": "index", + "name": "_amount", "type": "uint256" } ], - "name": "getRoleMember", + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", "outputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "symbol", + "outputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "getRoleMemberCount", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -36381,120 +35567,164 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, { "internalType": "uint256", - "name": "_id", + "name": "amount", "type": "uint256" } ], - "name": "getVault", + "name": "transfer", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" - }, + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "sender", + "type": "address" }, { "internalType": "address", - "name": "", + "name": "recipient", "type": "address" }, { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "WETH": { + "address": "0x5D3E425A099c2863224d6D63b330Df0F22B299b9", + "abi": [ { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "getVaultRatio", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "guy", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "currentRatio", + "name": "wad", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Approval", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { + "indexed": true, "internalType": "address", - "name": "account", + "name": "dst", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Deposit", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "account", + "name": "dst", "type": "address" - } - ], - "name": "hasRole", - "outputs": [ + }, { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Transfer", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_maxTCAP", + "name": "wad", "type": "uint256" } ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", - "type": "function" + "name": "Withdrawal", + "type": "event" }, { - "inputs": [], - "name": "liquidationPenalty", + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", "outputs": [ { "internalType": "uint256", @@ -36507,39 +35737,37 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "guy", + "type": "address" + }, { "internalType": "uint256", - "name": "_vaultId", + "name": "wad", "type": "uint256" } ], - "name": "liquidationReward", + "name": "approve", "outputs": [ { - "internalType": "uint256", - "name": "rewardCollateral", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "oracleDigits", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", @@ -36552,12 +35780,12 @@ }, { "inputs": [], - "name": "owner", + "name": "decimals", "outputs": [ { - "internalType": "address", + "internalType": "uint8", "name": "", - "type": "address" + "type": "uint8" } ], "stateMutability": "view", @@ -36565,19 +35793,19 @@ }, { "inputs": [], - "name": "pause", + "name": "deposit", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "paused", + "name": "name", "outputs": [ { - "internalType": "bool", + "internalType": "string", "name": "", - "type": "bool" + "type": "string" } ], "stateMutability": "view", @@ -36585,7 +35813,20 @@ }, { "inputs": [], - "name": "ratio", + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -36600,30 +35841,52 @@ "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "dst", "type": "address" }, { "internalType": "uint256", - "name": "_tokenAmount", + "name": "wad", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "internalType": "address", + "name": "dst", + "type": "address" + }, { "internalType": "uint256", - "name": "_amount", + "name": "wad", "type": "uint256" } ], - "name": "removeCollateral", - "outputs": [], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -36631,72 +35894,103 @@ "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "wad", "type": "uint256" } ], - "name": "removeCollateralETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", + "name": "withdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "WETHOracle": { + "address": "0x731Aa03C683Afb292732C31c1d50C491B8d8043F", + "abi": [ { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "_aggregator", "type": "address" } ], - "name": "renounceRole", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } ], - "name": "requiredCollateral", + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", "outputs": [ { - "internalType": "uint256", - "name": "collateral", - "type": "uint256" + "internalType": "int256", + "name": "", + "type": "int256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", - "name": "_vaultId", + "name": "", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "requiredLiquidationTCAP", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", "outputs": [ { "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" } ], @@ -36706,29 +36000,17 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardHandler", + "name": "getPreviousAnswer", "outputs": [ { - "internalType": "contract IRewardHandler", + "internalType": "int256", "name": "", - "type": "address" + "type": "int256" } ], "stateMutability": "view", @@ -36736,39 +36018,78 @@ }, { "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ { "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "setRatio", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -36777,11 +36098,11 @@ "inputs": [ { "internalType": "address", - "name": "_treasury", + "name": "_aggregator", "type": "address" } ], - "name": "setTreasury", + "name": "setReferenceContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -36790,7 +36111,7 @@ "inputs": [ { "internalType": "bytes4", - "name": "_interfaceId", + "name": "interfaceId", "type": "bytes4" } ], @@ -36806,202 +36127,163 @@ "type": "function" }, { - "inputs": [], - "name": "tcapOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", + "internalType": "address", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "WETHRewardHandler": { + "address": "0x39347a6328e1D4601A389d4dB0B26aC305886fb0", + "abi": [ { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_vault", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { - "inputs": [], - "name": "treasury", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "name": "userToVault", - "outputs": [ + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Recovered", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "reward", "type": "uint256" } ], - "name": "vaults", - "outputs": [ - { - "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, + "name": "RewardAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "Debt", + "name": "reward", "type": "uint256" - }, - { - "internalType": "address", - "name": "Owner", - "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RewardPaid", + "type": "event" }, { - "stateMutability": "payable", - "type": "receive" - } - ] - }, - "HardWETHVaultHandler": { - "address": "0x6E3B4E276f22C30085882dD1342995773AE76414", - "abi": [ - { + "anonymous": false, "inputs": [ { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_divisor", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_treasury", - "type": "address" - }, - { + "indexed": false, "internalType": "uint256", - "name": "_minimumTCAP", + "name": "newDuration", "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "RewardsDurationUpdated", + "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" }, { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "name": "CollateralAdded", + "name": "RoleAdminChanged", "type": "event" }, { @@ -37009,43 +36291,49 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "CollateralRemoved", + "name": "RoleGranted", "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "account", "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "NewBurnFee", + "name": "RoleRevoked", "type": "event" }, { @@ -37054,36 +36342,30 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "amount", "type": "uint256" } ], - "name": "NewLiquidationPenalty", + "name": "Staked", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "_owner", + "name": "account", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_minimumTCAP", - "type": "uint256" } ], - "name": "NewMinimumTCAP", + "name": "Unpaused", "type": "event" }, { @@ -37092,298 +36374,215 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_ratio", + "name": "amount", "type": "uint256" } ], - "name": "NewRatio", + "name": "Withdrawn", "type": "event" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ { - "indexed": false, - "internalType": "address", - "name": "_tresury", - "type": "address" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "NewTreasury", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "_account", "type": "address" - }, + } + ], + "name": "balanceOf", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "_account", "type": "address" } ], - "name": "Paused", - "type": "event" + "name": "earned", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "_token", + "name": "_staker", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getRewardForDuration", + "outputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "RoleAdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, "internalType": "address", - "name": "sender", + "name": "_staker", "type": "address" } ], - "name": "RoleGranted", - "type": "event" + "name": "getRewardFromVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" } ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, + "name": "getRoleAdmin", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "TokensBurned", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "index", "type": "uint256" } ], - "name": "TokensMinted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "getRoleMember", + "outputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "", "type": "uint256" } ], - "name": "VaultCreated", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, "internalType": "address", - "name": "_liquidator", + "name": "account", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_reward", - "type": "uint256" } ], - "name": "VaultLiquidated", - "type": "event" + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ + "inputs": [ { "internalType": "bytes32", - "name": "", + "name": "role", "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ETHPriceOracle", + "name": "hasRole", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -37391,12 +36590,12 @@ }, { "inputs": [], - "name": "MAX_DECIMAL_PLACES", + "name": "lastTimeRewardApplicable", "outputs": [ { - "internalType": "uint8", + "internalType": "uint256", "name": "", - "type": "uint8" + "type": "uint256" } ], "stateMutability": "view", @@ -37404,7 +36603,7 @@ }, { "inputs": [], - "name": "MAX_FEE", + "name": "lastUpdateTime", "outputs": [ { "internalType": "uint256", @@ -37416,8 +36615,19 @@ "type": "function" }, { - "inputs": [], - "name": "MIN_RATIO", + "inputs": [ + { + "internalType": "uint256", + "name": "_a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_b", + "type": "uint256" + } + ], + "name": "min", "outputs": [ { "internalType": "uint256", @@ -37425,28 +36635,28 @@ "type": "uint256" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { - "inputs": [], - "name": "TCAPPrice", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "price", + "name": "_reward", "type": "uint256" } ], - "stateMutability": "view", + "name": "notifyRewardAmount", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "TCAPToken", + "name": "owner", "outputs": [ { - "internalType": "contract TCAP", + "internalType": "address", "name": "", "type": "address" } @@ -37455,97 +36665,99 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "paused", + "outputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "addCollateral", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "addCollateralETH", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ + "name": "periodFinish", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "burnFee", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "_tokenAmount", "type": "uint256" } ], - "stateMutability": "view", + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "collateralContract", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "collateralDecimalsAdjustmentFactor", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "collateralPriceOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", "type": "address" } ], - "stateMutability": "view", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "counter", + "name": "rewardPerToken", "outputs": [ { "internalType": "uint256", - "name": "_value", + "name": "", "type": "uint256" } ], @@ -37554,14 +36766,7 @@ }, { "inputs": [], - "name": "createVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "divisor", + "name": "rewardPerTokenStored", "outputs": [ { "internalType": "uint256", @@ -37573,18 +36778,12 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "getFee", + "inputs": [], + "name": "rewardRate", "outputs": [ { "internalType": "uint256", - "name": "fee", + "name": "", "type": "uint256" } ], @@ -37594,16 +36793,16 @@ { "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "internalType": "address", + "name": "", "type": "address" } ], - "name": "getOraclePrice", + "name": "rewards", "outputs": [ { "internalType": "uint256", - "name": "price", + "name": "", "type": "uint256" } ], @@ -37611,41 +36810,24 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", + "inputs": [], + "name": "rewardsDuration", "outputs": [ { - "internalType": "bytes32", + "internalType": "uint256", "name": "", - "type": "bytes32" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", + "inputs": [], + "name": "rewardsToken", "outputs": [ { - "internalType": "address", + "internalType": "contract IERC20", "name": "", "type": "address" } @@ -37655,70 +36837,42 @@ }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ { "internalType": "uint256", - "name": "", + "name": "_rewardsDuration", "type": "uint256" } ], - "stateMutability": "view", + "name": "setRewardsDuration", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "uint256", - "name": "_id", - "type": "uint256" - } - ], - "name": "getVault", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, { "internalType": "address", - "name": "", + "name": "_staker", "type": "address" }, { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "getVaultRatio", + "inputs": [], + "name": "totalSupply", "outputs": [ { "internalType": "uint256", - "name": "currentRatio", + "name": "", "type": "uint256" } ], @@ -37727,72 +36881,44 @@ }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "grantRole", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "hasRole", + "name": "userRewardPerTokenPaid", "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, { "internalType": "uint256", - "name": "_maxTCAP", + "name": "", "type": "uint256" } ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "liquidationPenalty", + "name": "vault", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -37801,84 +36927,3748 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "liquidationReward", - "outputs": [ + "internalType": "address", + "name": "_staker", + "type": "address" + }, { "internalType": "uint256", - "name": "rewardCollateral", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" - }, - { + } + ] + }, + "WETHVaultHandler": { + "address": "0x093f8F7C7fCC6edf991309A5056feB5cA9579292", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "addCollateralETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateralETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardHandler", + "outputs": [ + { + "internalType": "contract IRewardHandler", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "HardWETHVaultHandler": { + "address": "0x6E3B4E276f22C30085882dD1342995773AE76414", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "NewMinimumTCAP", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "addCollateralETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateralETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, + "HardDaiVaultHandler": { + "address": "0x95ac341B6492954DF1341A33cAC9AB3273179232", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "NewMinimumTCAP", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { "inputs": [], "name": "minimumTCAP", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", "type": "uint256" } ], - "stateMutability": "view", + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "_minimumTCAP", "type": "uint256" } ], - "name": "mint", + "name": "setMinimumTCAP", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "oracleDigits", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" } ], - "stateMutability": "view", + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "_treasury", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", + "name": "setTreasury", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "paused", + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { "internalType": "bool", @@ -37886,17 +40676,17 @@ "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "ratio", + "name": "tcapOracle", "outputs": [ { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -37906,201 +40696,260 @@ "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "newOwner", "type": "address" - }, - { - "internalType": "uint256", - "name": "_tokenAmount", - "type": "uint256" - } - ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" } ], - "name": "removeCollateral", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "treasury", + "outputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "removeCollateralETH", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "renounceOwnership", + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "", "type": "address" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "requiredCollateral", + "name": "vaults", "outputs": [ { "internalType": "uint256", - "name": "collateral", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], "stateMutability": "view", "type": "function" + } + ] + }, + "USDC": { + "address": "0x360294ded58EA73A10e04b97A069052Bb2d88a1E", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "_vaultId", + "name": "value", "type": "uint256" } ], - "name": "requiredLiquidationTCAP", - "outputs": [ + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Transfer", + "type": "event" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "owner", + "type": "address" }, { "internalType": "address", - "name": "account", + "name": "spender", "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "_burnFee", + "name": "amount", "type": "uint256" } ], - "name": "setBurnFee", - "outputs": [], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, { "internalType": "uint256", - "name": "_minimumTCAP", + "name": "_amount", "type": "uint256" } ], - "name": "setMinimumTCAP", + "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "decimals", + "outputs": [ { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], - "name": "setRatio", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_treasury", + "name": "spender", "type": "address" - } - ], - "name": "setTreasury", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + }, { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" } ], - "name": "supportsInterface", + "name": "decreaseAllowance", "outputs": [ { "internalType": "bool", @@ -38108,43 +40957,59 @@ "type": "bool" } ], - "stateMutability": "pure", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "tcapOracle", + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "_account", "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "transferOwnership", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "treasury", + "name": "name", "outputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", @@ -38152,20 +41017,20 @@ }, { "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "symbol", + "outputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], - "name": "userToVault", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -38178,108 +41043,73 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "name": "vaults", + "name": "transfer", "outputs": [ { - "internalType": "uint256", - "name": "Id", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" }, { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" + "internalType": "address", + "name": "recipient", + "type": "address" }, { "internalType": "uint256", - "name": "Debt", + "name": "amount", "type": "uint256" - }, + } + ], + "name": "transferFrom", + "outputs": [ { - "internalType": "address", - "name": "Owner", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" } ] }, - "HardDaiVaultHandler": { - "address": "0x95ac341B6492954DF1341A33cAC9AB3273179232", + "USDCOracle": { + "address": "0x1b793DBc38B94E5C81ee383934404f84a7acE01E", "abi": [ { "inputs": [ - { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_divisor", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, { "internalType": "address", - "name": "_ethOracle", + "name": "_aggregator", "type": "address" }, { "internalType": "address", - "name": "_treasury", + "name": "_owner", "type": "address" - }, - { - "internalType": "uint256", - "name": "_minimumTCAP", - "type": "uint256" } ], "stateMutability": "nonpayable", @@ -38291,270 +41121,290 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "previousOwner", "type": "address" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "CollateralAdded", + "name": "OwnershipTransferred", "type": "event" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" }, { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", "type": "uint256" }, { - "indexed": false, + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "CollateralRemoved", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" + "internalType": "int256", + "name": "", + "type": "int256" } ], - "name": "NewBurnFee", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" } ], - "name": "NewLiquidationPenalty", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" }, { - "indexed": false, "internalType": "uint256", - "name": "_minimumTCAP", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "NewMinimumTCAP", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" } ], - "name": "NewRatio", - "type": "event" + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": false, "internalType": "address", - "name": "_tresury", + "name": "_aggregator", "type": "address" } ], - "name": "NewTreasury", - "type": "event" + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "pure", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "Paused", - "type": "event" - }, + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "HardUSDCVaultHandler": { + "address": "0xB34756f8D9682ab6C26F77f9461207a65c52c8bC", + "abi": [ { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "_token", + "internalType": "contract Orchestrator", + "name": "_orchestrator", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_divisor", "type": "uint256" - } - ], - "name": "Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" }, { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" }, { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" }, { - "indexed": true, "internalType": "address", - "name": "account", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "sender", + "name": "_collateralAddress", "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "_collateralOracle", + "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "account", + "name": "_ethOracle", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "sender", + "name": "_treasury", "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" } ], - "name": "RoleRevoked", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, @@ -38578,7 +41428,7 @@ "type": "uint256" } ], - "name": "TokensBurned", + "name": "CollateralAdded", "type": "event" }, { @@ -38603,20 +41453,26 @@ "type": "uint256" } ], - "name": "TokensMinted", + "name": "CollateralRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" } ], - "name": "Unpaused", + "name": "NewBurnFee", "type": "event" }, { @@ -38629,464 +41485,353 @@ "type": "address" }, { - "indexed": true, + "indexed": false, "internalType": "uint256", - "name": "_id", + "name": "_liquidationPenalty", "type": "uint256" } ], - "name": "VaultCreated", + "name": "NewLiquidationPenalty", "type": "event" }, { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, { "indexed": true, "internalType": "address", - "name": "_liquidator", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_reward", + "name": "_minimumTCAP", "type": "uint256" } ], - "name": "VaultLiquidated", + "name": "NewMinimumTCAP", "type": "event" }, { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ETHPriceOracle", - "outputs": [ - { - "internalType": "contract ChainlinkOracle", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_DECIMAL_PLACES", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_FEE", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_RATIO", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TCAPPrice", - "outputs": [ - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TCAPToken", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "contract TCAP", - "name": "", + "indexed": true, + "internalType": "address", + "name": "_owner", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_ratio", "type": "uint256" } ], - "name": "addCollateral", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewRatio", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "burnFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "collateralContract", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", + "indexed": true, + "internalType": "address", + "name": "_owner", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "collateralDecimalsAdjustmentFactor", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "collateralPriceOracle", - "outputs": [ + }, { - "internalType": "contract ChainlinkOracle", - "name": "", + "indexed": false, + "internalType": "address", + "name": "_tresury", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "counter", - "outputs": [ - { - "internalType": "uint256", - "name": "_value", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "createVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "NewTreasury", + "type": "event" }, { - "inputs": [], - "name": "divisor", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "getFee", - "outputs": [ - { - "internalType": "uint256", - "name": "fee", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "indexed": false, + "internalType": "address", + "name": "_token", "type": "address" - } - ], - "name": "getOraclePrice", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "price", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Recovered", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ + }, { + "indexed": true, "internalType": "bytes32", - "name": "", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", "type": "bytes32" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "sender", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_id", - "type": "uint256" - } - ], - "name": "getVault", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": true, "internalType": "uint256", - "name": "", + "name": "_id", "type": "uint256" }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "_owner", "type": "address" }, { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "TokensMinted", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "getVaultRatio", - "outputs": [ + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { + "indexed": true, "internalType": "uint256", - "name": "currentRatio", + "name": "_id", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "VaultCreated", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { + "indexed": true, "internalType": "address", - "name": "account", + "name": "_liquidator", "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "VaultLiquidated", + "type": "event" }, { - "inputs": [ + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ { "internalType": "bytes32", - "name": "role", + "name": "", "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" } ], - "name": "hasRole", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", "outputs": [ { - "internalType": "bool", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ { - "internalType": "uint256", - "name": "_maxTCAP", - "type": "uint256" + "internalType": "uint8", + "name": "", + "type": "uint8" } ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "liquidationPenalty", + "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", @@ -39098,18 +41843,25 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ { "internalType": "uint256", - "name": "_vaultId", + "name": "", "type": "uint256" } ], - "name": "liquidationReward", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", "outputs": [ { "internalType": "uint256", - "name": "rewardCollateral", + "name": "price", "type": "uint256" } ], @@ -39118,12 +41870,12 @@ }, { "inputs": [], - "name": "minimumTCAP", + "name": "TCAPToken", "outputs": [ { - "internalType": "uint256", + "internalType": "contract TCAP", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -39137,32 +41889,32 @@ "type": "uint256" } ], - "name": "mint", + "name": "addCollateral", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "oracleDigits", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "burn", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "burnFee", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -39170,19 +41922,12 @@ }, { "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "collateralContract", "outputs": [ { - "internalType": "bool", + "internalType": "contract IERC20", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", @@ -39190,7 +41935,7 @@ }, { "inputs": [], - "name": "ratio", + "name": "collateralDecimalsAdjustmentFactor", "outputs": [ { "internalType": "uint256", @@ -39202,59 +41947,49 @@ "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ { - "internalType": "address", - "name": "_tokenAddress", + "internalType": "contract ChainlinkOracle", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "_tokenAmount", - "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "counter", + "outputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "_value", "type": "uint256" } ], - "name": "removeCollateral", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "renounceOwnership", + "name": "createVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "inputs": [], + "name": "divisor", + "outputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -39265,11 +42000,11 @@ "type": "uint256" } ], - "name": "requiredCollateral", + "name": "getFee", "outputs": [ { "internalType": "uint256", - "name": "collateral", + "name": "fee", "type": "uint256" } ], @@ -39279,16 +42014,16 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" } ], - "name": "requiredLiquidationTCAP", + "name": "getOraclePrice", "outputs": [ { "internalType": "uint256", - "name": "amount", + "name": "price", "type": "uint256" } ], @@ -39301,110 +42036,57 @@ "internalType": "bytes32", "name": "role", "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "getRoleAdmin", + "outputs": [ { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_minimumTCAP", - "type": "uint256" - } - ], - "name": "setMinimumTCAP", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "uint256", - "name": "_ratio", + "name": "index", "type": "uint256" } ], - "name": "setRatio", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "getRoleMember", + "outputs": [ { "internalType": "address", - "name": "_treasury", + "name": "", "type": "address" } ], - "name": "setTreasury", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "tcapOracle", + "name": "getRoleMemberCount", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -39413,46 +42095,28 @@ { "inputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "treasury", + "name": "getVault", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, { "internalType": "address", "name": "", - "type": "address" - } - ], - "name": "userToVault", - "outputs": [ + "type": "address" + }, { "internalType": "uint256", "name": "", @@ -39466,110 +42130,84 @@ "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_vaultId", "type": "uint256" } ], - "name": "vaults", + "name": "getVaultRatio", "outputs": [ { "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Debt", + "name": "currentRatio", "type": "uint256" - }, - { - "internalType": "address", - "name": "Owner", - "type": "address" } ], "stateMutability": "view", "type": "function" - } - ] - }, - "USDC": { - "address": "0x360294ded58EA73A10e04b97A069052Bb2d88a1E", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, "internalType": "address", - "name": "spender", + "name": "account", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" } ], - "name": "Approval", - "type": "event" + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, "internalType": "address", - "name": "to", + "name": "account", "type": "address" - }, + } + ], + "name": "hasRole", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "Transfer", - "type": "event" + "stateMutability": "view", + "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "owner", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" } ], - "name": "allowance", + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", "outputs": [ { "internalType": "uint256", @@ -39582,37 +42220,26 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, { "internalType": "uint256", - "name": "amount", + "name": "_vaultId", "type": "uint256" } ], - "name": "approve", + "name": "liquidationReward", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", + "inputs": [], + "name": "minimumTCAP", "outputs": [ { "internalType": "uint256", @@ -39625,49 +42252,53 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "burn", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "decimals", + "name": "oracleDigits", "outputs": [ { - "internalType": "uint8", + "internalType": "uint256", "name": "", - "type": "uint8" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "spender", + "name": "", "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" } ], - "name": "decreaseAllowance", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", "outputs": [ { "internalType": "bool", @@ -39675,275 +42306,226 @@ "type": "bool" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", + "inputs": [], + "name": "ratio", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_account", + "name": "_tokenAddress", "type": "address" }, { "internalType": "uint256", - "name": "_amount", + "name": "_tokenAmount", "type": "uint256" } ], - "name": "mint", + "name": "recoverERC20", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "name", - "outputs": [ + "inputs": [ { - "internalType": "string", - "name": "", - "type": "string" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, { "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "transfer", + "name": "requiredCollateral", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "collateral", + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, { "internalType": "uint256", - "name": "amount", + "name": "_vaultId", "type": "uint256" } ], - "name": "transferFrom", + "name": "requiredLiquidationTCAP", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "USDCOracle": { - "address": "0x1b793DBc38B94E5C81ee383934404f84a7acE01E", - "abi": [ + }, { "inputs": [ { - "internalType": "address", - "name": "_aggregator", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "address", - "name": "_owner", + "name": "account", "type": "address" } ], + "name": "revokeRole", + "outputs": [], "stateMutability": "nonpayable", - "type": "constructor" + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "inputs": [], - "name": "getLatestAnswer", - "outputs": [ + "inputs": [ { - "internalType": "int256", - "name": "", - "type": "int256" + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "stateMutability": "view", + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "getLatestRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_minimumTCAP", "type": "uint256" - }, + } + ], + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], - "stateMutability": "view", + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "getLatestTimestamp", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_treasury", + "type": "address" } ], - "stateMutability": "view", + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" } ], - "name": "getPreviousAnswer", + "name": "supportsInterface", "outputs": [ { - "internalType": "int256", + "internalType": "bool", "name": "", - "type": "int256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousTimestamp", + "inputs": [], + "name": "tcapOracle", "outputs": [ { - "internalType": "uint256", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -39952,45 +42534,19 @@ { "inputs": [ { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "owner", + "name": "treasury", "outputs": [ { "internalType": "address", @@ -40003,7 +42559,7 @@ }, { "inputs": [], - "name": "renounceOwnership", + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -40012,51 +42568,59 @@ "inputs": [ { "internalType": "address", - "name": "_aggregator", + "name": "", "type": "address" } ], - "name": "setReferenceContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", + "name": "userToVault", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, { "internalType": "address", - "name": "newOwner", + "name": "Owner", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" } ] - }, - "HardUSDCVaultHandler": { - "address": "0xB34756f8D9682ab6C26F77f9461207a65c52c8bC", + }, + "HardWBTCVaultHandler": { + "address": "0x2364536F4891Ed560A6728f4B36871de8176eE5c", "abi": [ { "inputs": [ diff --git a/src/hooks/useHardVaults.tsx b/src/hooks/useHardVaults.tsx index b955d54..88d2ac4 100644 --- a/src/hooks/useHardVaults.tsx +++ b/src/hooks/useHardVaults.tsx @@ -7,9 +7,11 @@ export const useHardVaults = (): HardVaultsContext => { const [wethVault, setWETHVault] = useState(); const [daiVault, setDAIVault] = useState(); const [usdcVault, setUSDCVault] = useState(); + const [wbtcVault, setWBTCVault] = useState(); const [wethVaultRead, setWETHVaultRead] = useState(); const [daiVaultRead, setDAIVaultRead] = useState(); const [usdcVaultRead, setUSDCVaultRead] = useState(); + const [wbtcVaultRead, setWBTCVaultRead] = useState(); const setCurrentWETHVault = React.useCallback((currentWETHVault: ethers.Contract): void => { setWETHVault(currentWETHVault); @@ -20,6 +22,9 @@ export const useHardVaults = (): HardVaultsContext => { const setCurrentUSDCVault = React.useCallback((currentUSDCVault: ethers.Contract): void => { setUSDCVault(currentUSDCVault); }, []); + const setCurrentWBTCVault = React.useCallback((currentWBTCVault: ethers.Contract): void => { + setWBTCVault(currentWBTCVault); + }, []); const setCurrentWETHVaultRead = React.useCallback((currentWETHVaultRead: Contract): void => { setWETHVaultRead(currentWETHVaultRead); }, []); @@ -29,6 +34,9 @@ export const useHardVaults = (): HardVaultsContext => { const setCurrentUSDCVaultRead = React.useCallback((currentUSDCVaultRead: Contract): void => { setUSDCVaultRead(currentUSDCVaultRead); }, []); + const setCurrentWBTCVaultRead = React.useCallback((currentWBTCVaultRead: Contract): void => { + setWBTCVaultRead(currentWBTCVaultRead); + }, []); return { wethVault, @@ -37,11 +45,15 @@ export const useHardVaults = (): HardVaultsContext => { setCurrentDAIVault, usdcVault, setCurrentUSDCVault, + wbtcVault, + setCurrentWBTCVault, wethVaultRead, setCurrentWETHVaultRead, daiVaultRead, setCurrentDAIVaultRead, usdcVaultRead, setCurrentUSDCVaultRead, + wbtcVaultRead, + setCurrentWBTCVaultRead, }; }; diff --git a/src/state/HardVaultsContext.tsx b/src/state/HardVaultsContext.tsx index f5c4d4c..790b01e 100644 --- a/src/state/HardVaultsContext.tsx +++ b/src/state/HardVaultsContext.tsx @@ -9,21 +9,27 @@ export interface HardVaultsContext { setCurrentDAIVault: (currentVault: ethers.Contract) => void; usdcVault?: ethers.Contract; setCurrentUSDCVault: (currentVault: ethers.Contract) => void; + wbtcVault?: ethers.Contract; + setCurrentWBTCVault: (currentVault: ethers.Contract) => void; wethVaultRead?: Contract; setCurrentWETHVaultRead: (currentVaultRead: Contract) => void; daiVaultRead?: Contract; setCurrentDAIVaultRead: (currentVaultRead: Contract) => void; usdcVaultRead?: Contract; setCurrentUSDCVaultRead: (currentVaultRead: Contract) => void; + wbtcVaultRead?: Contract; + setCurrentWBTCVaultRead: (currentVaultRead: Contract) => void; } export const HARD_VAULTS_DEFAULT_VALUE = { setCurrentWETHVault: () => {}, setCurrentDAIVault: () => {}, setCurrentUSDCVault: () => {}, + setCurrentWBTCVault: () => {}, setCurrentWETHVaultRead: () => {}, setCurrentDAIVaultRead: () => {}, setCurrentUSDCVaultRead: () => {}, + setCurrentWBTCVaultRead: () => {}, }; const hardVaultsContext = React.createContext(HARD_VAULTS_DEFAULT_VALUE); diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx index 8ac6fa8..b4022f2 100644 --- a/src/utils/univ3.tsx +++ b/src/utils/univ3.tsx @@ -5,12 +5,12 @@ export const UNIV3 = { stakerAddress: "0xe34139463bA50bD61336E0c446Bd8C0867c6fE65", mainnet: { tcapPool: { - id: "0xfb7BDD5B703f57BC7807b9D731503050EdC8c722", + id: "0x11456b3750E991383bB8943118ed79C1afdEE192", feeTier: 3000, incentives: [ { - rewardToken: "0xAa715DbD2ED909B7B7727dC864F3B78276D14A19", - pool: "0xfb7BDD5B703f57BC7807b9D731503050EdC8c722", + rewardToken: "0x321C2fE4446C7c963dc41Dd58879AF648838f98D", + pool: "0x11456b3750E991383bB8943118ed79C1afdEE192", startTime: 1647347412, endTime: 1662899412, refundee: "0x570f581D23a2AB09FD1990279D9DB6f5DcE18F4A", From 096c8e2229f9ee129bd52cbedc2b47c016fccb9f Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 17 May 2022 14:31:58 -0600 Subject: [PATCH 107/278] updating univ3 key --- src/utils/univ3.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx index 3074b0f..6794026 100644 --- a/src/utils/univ3.tsx +++ b/src/utils/univ3.tsx @@ -11,8 +11,8 @@ export const UNIV3 = { { rewardToken: "0x321C2fE4446C7c963dc41Dd58879AF648838f98D", pool: "0x11456b3750E991383bB8943118ed79C1afdEE192", - startTime: 1652820659, - endTime: 1660769459, + startTime: 1652823662, + endTime: 1660772462, refundee: "0xa70b638B70154EdfCbb8DbbBd04900F328F32c35", }, ], From 1c70393228af691af2dbe578b51eec02fd8e041a Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 17 May 2022 21:22:16 -0600 Subject: [PATCH 108/278] polygon disabled --- src/components/Header.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 97ac082..5614979 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -15,7 +15,7 @@ import { Web3ModalContext } from "../state/Web3ModalContext"; import TokensContext from "../state/TokensContext"; import NetworkContext from "../state/NetworkContext"; import { makeShortAddress, getENS, isInLayer1, isOptimism, isPolygon } from "../utils/utils"; -import { NETWORKS } from "../utils/constants"; +import { NETWORKS, FEATURES } from "../utils/constants"; import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; import { ReactComponent as ETHIcon } from "../assets/images/graph/weth.svg"; import { ReactComponent as OPTIMISMIcon } from "../assets/images/graph/optimism.svg"; @@ -269,6 +269,7 @@ const Header = ({ signerAddress, isMobile }: props) => {
{process.env.REACT_APP_NETWORK_ID === "1" ? "Polygon" : "Mumbai"}
); + const PolygonOpt = () => ( { {EthereumOpt()} {OptimismOpt()} - {PolygonOpt()} + {FEATURES.POLYGON && PolygonOpt()} From ac15ddb74a47681dc38ef677df74283447d9b5a2 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 18 May 2022 08:19:11 -0600 Subject: [PATCH 109/278] change univ3 graph url --- src/utils/univ3.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx index 6794026..35a80b8 100644 --- a/src/utils/univ3.tsx +++ b/src/utils/univ3.tsx @@ -36,7 +36,7 @@ export const UNIV3 = { }; export const GRAPHQL_UNIV3_ENDPOINT = { - mainnet: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo-2", + mainnet: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-univ3", rinkeby: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-rinkeby-two", }; From da669dca0a3b98e7303bb7e8d0ba325340849764 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 18 May 2022 08:26:50 -0600 Subject: [PATCH 110/278] changed graphql endpoint --- src/utils/constants.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 1fbd184..1db5655 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -71,7 +71,7 @@ export const NETWORKS = { export const API_ENDPOINT = "https://api.cryptex.finance"; export const GRAPHQL_ENDPOINT = { - mainnet: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo-2", + mainnet: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-graph", rinkeby: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-rinkeby-two", optimism: "https://api.thegraph.com/subgraphs/name/cryptexfinance/cryptex-optimism", okovan: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo", From b5aa8340b5a482e979a76e6c23f4ef7edf5bc382 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 18 May 2022 13:19:21 -0600 Subject: [PATCH 111/278] not need of the graph on minting --- src/components/Vault/Mint.tsx | 36 +++++------------------------------ 1 file changed, 5 insertions(+), 31 deletions(-) diff --git a/src/components/Vault/Mint.tsx b/src/components/Vault/Mint.tsx index 3d4cdde..dfabd1e 100644 --- a/src/components/Vault/Mint.tsx +++ b/src/components/Vault/Mint.tsx @@ -304,8 +304,8 @@ const Mint = ({ address, t }: props) => { (!isPolygon(currentNetwork.chainId) && selectedVault === "ETH") || (isPolygon(currentNetwork.chainId) && selectedVault === "MATIC"); - async function loadVault(vaultType: string, vaultData: any) { - if (signer.signer && validVaults() && vaultData) { + async function loadVault(vaultType: string) { + if (signer.signer && validVaults()) { let currentVault: any; let currentVaultRead: any; let currentToken; @@ -405,33 +405,6 @@ const Mint = ({ address, t }: props) => { setSelectedOracleRead(currentOracleRead); let currentVaultData: any; - // Removed GRAPH - // if data is empty load vault data from contract - /* const graphBlock = vaultData._meta.block.number; - let currentBlock = await provider.getBlockNumber(); - currentBlock -= 10; - if ( - isInLayer1(currentNetwork.chainId) && - vaultData.vaults.length > 0 && - !vaultData._meta.hasIndexingErrors && - graphBlock >= currentBlock - ) { - await vaultData.vaults.forEach((v: any) => { - if (v.address.toLowerCase() === currentVault.address.toLowerCase()) { - currentVaultData = v; - } - }); - } else { - const vaultID = await currentVault.userToVault(address); - if (!vaultID.eq(0)) { - const vault = await currentVault.vaults(vaultID); - currentVaultData = { - vaultId: vaultID, - collateral: vault.Collateral, - debt: vault.Debt, - }; - } - } */ const vaultID = await currentVault.userToVault(address); if (!vaultID.eq(0)) { const vault = await currentVault.vaults(vaultID); @@ -572,8 +545,9 @@ const Mint = ({ address, t }: props) => { if (isPolygon(currentNetwork.chainId) && vaultType === "ETH") { vaultType = "MATIC"; setSelectedVault("MATIC"); + console.log(data); } - loadVault(vaultType, data); + loadVault(vaultType); }, }); @@ -582,7 +556,7 @@ const Mint = ({ address, t }: props) => { if (!isOptimism(currentNetwork.chainId)) { await refetch(); } else { - loadVault(selectedVault, data); + loadVault(selectedVault); } } catch (error) { console.log(error); From a78c1f8a6e5315312ac33bbfc832bccf76ace3a5 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 18 May 2022 16:03:31 -0600 Subject: [PATCH 112/278] hiding wbtc on regular mode --- src/components/Vault/Mint.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Vault/Mint.tsx b/src/components/Vault/Mint.tsx index dfabd1e..bd079a2 100644 --- a/src/components/Vault/Mint.tsx +++ b/src/components/Vault/Mint.tsx @@ -92,7 +92,7 @@ const Mint = ({ address, t }: props) => { break; case "wbtc": currency = "WBTC"; - if (isOptimism(currentNetwork.chainId) || isHardMode()) { + if (isOptimism(currentNetwork.chainId) || !isHardMode()) { history?.push(`/vault/ETH`); currency = "ETH"; } @@ -1072,7 +1072,7 @@ const Mint = ({ address, t }: props) => { useEffect(() => { async function load() { - let vOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK", "WBTC"]; + let vOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; if (isHardMode()) { vOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; } From 3950e8187449896657ab605fb2c4452077094883 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 20 May 2022 09:46:09 -0600 Subject: [PATCH 113/278] updating lang --- public/locales/de/translation.json | 123 +++++++++++----- public/locales/en/translation.json | 117 ++++++++++----- public/locales/es/translation.json | 134 +++++++++++++----- public/locales/fr/translation.json | 107 ++++++++++---- public/locales/hi_IN/translation.json | 123 +++++++++++----- public/locales/it/translation.json | 123 +++++++++++----- public/locales/pt/translation.json | 123 +++++++++++----- public/locales/tr/translation.json | 123 +++++++++++----- public/locales/zh/translation.json | 83 +++++++---- .../Farm/UniV3Rewards/ClaimReward.tsx | 14 +- src/components/Farm/UniV3Rewards/Rewards.tsx | 49 +++---- src/components/Farm/UniV3Rewards/Stake.tsx | 16 ++- src/components/Vault/Mint.tsx | 16 ++- src/components/Vault/Monitoring/Liquidate.tsx | 32 +++-- src/components/Vault/Monitoring/Vaults.tsx | 28 ++-- src/components/Vault/Monitoring/index.tsx | 34 +++-- src/components/Welcome/Protocol.tsx | 24 ++-- src/components/Welcome/Summary.tsx | 6 +- src/utils/utils.tsx | 18 ++- 19 files changed, 907 insertions(+), 386 deletions(-) diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 033fbff..b63aac5 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -1,13 +1,23 @@ { + "add": "Add", + "all-vaults": "All Vaults", + "amount-tcap": "Amount of TCAP", + "approve": "Approve", "balance": "Balance", "balance2": "Current Balance", + "burn": "Burn", "choose-network": "Choose Network", "claim": "Claim", + "claiming": "Claimin", "claim-vest":"Claim Vest", "click-copy": "Click to Copy", + "collateral": "Collateral", "connect": "Connect Wallet", "contract": "Contract", "create": "Create", + "debt": "Debt", + "deposit": "Deposit", + "deposited": "Deposited", "description": "Description", "exit": "Exit", "farm": "Farm", @@ -17,23 +27,36 @@ "max": "MAX", "max-safe": "MAX SAFE", "mint": "Mint", + "my-vaults": "My Vaults", + "mode": "Mode", "last": "Last", "loading": "Loading", + "out-of-range": "Out of range", + "pending": "Pending", "pool": "Pool", "stake": "Stake", "stake2": "Amount to Stake", "staked": "Staked", + "status": "Status", + "ready": "Ready", + "remove": "Remove", + "required-tcap": "Required TCAP", "token": "Token", "tokens": "Tokens", + "totals": "Totals", "trade": "Trade", "tran-sent": "⏰ Transaction Sent!", "tran-confirmed": "✔️ Transaction Confirmed!", "tran-wait": "Plz wait for the transaction confirmation.", "tran-wait2": "All set, please wait for another confirmation", + "unstake": "Unstake", + "unstaked": "Unstaked", "update": "Update", "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "vaults": "Vauts", + "view": "View", "votes": "Votes", - "wait": "Please wait", + "wait": "Please wait", "warning": "This project is in beta. Use at your own risk.", "welcome": { "tcap": "Total Cryptocurrency Market Capitalization", @@ -42,16 +65,32 @@ "title1": "My Total Balance", "subtitle1": "Connected Account", "title2": "Use TCAP", - "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "subtitle2": "Trade TCAP using Uniswap or create new supply using a vault", "title3": "Connect Your Account", "subtitle3": "Mint TCAP, or check your balance connecting your account", "tcap-balance": "TCAP Balance", - "ctx-balance": "CTX Balance" + "ctx-balance": "CTX Balance", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price", + "summary": { + "title": "Protocol Summary", + "staked-usd": "Total Staked USD", + "staked-eth": "Staked in ETH", + "staked-dai": "Staked in DAI", + "staked-aave": "Staked in AAVE", + "staked-link": "Staked in LINK", + "staked-matic": "Staked in MATIC", + "staked-wbtc": "Staked in WBTC", + "staked-usdc": "Staked in USDC", + "staked-uni": "Staked in UNI", + "staked-snx": "Staked in SNX", + "total-supply": "TCAP Supply" + } }, "vault": { "warning": "", "loading": "Loading Vault", - "title1": "The Vault", + "title1": "Vaults", "subtitle1": "Select your Collateral", "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", "approve": "Approve Vault", @@ -65,8 +104,8 @@ "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", - "add": "Add Collateral", - "remove": "Remove Collateral" + "add": "Add {{collateral}}", + "remove": "Remove {{collateral}}" }, "debt": { "title": "Vault Debt", @@ -84,30 +123,56 @@ "errors": { "no-collateral": "Not enough collateral on vault", "burn-too-high": "Burn value too high", + "burn-balance-low": "Burn value is greater than your balance.", "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, - "pools": { - "pools": "Pools", - "enabled": "Enabled Pools", - "available": "Available Pools", - "liquidity": "Liquidity" - }, "farming": { - "farming": "Farming", - "minting": "Minting Rewards", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", "current-mint": "Current mint", "current-reward": "Current Reward", + "eth-tcap-pool": "ETH/TCAP Pool", + "eth-ctx-pool": "ETH/CTX Pool", + "farming": "Farming", "liquidity": "Liquidity Rewards", - "unlocked": "Unlocked Reward", "locked": "Locked Reward", - "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", - "unlocked-info": "Available to claim immediately.", - "locked-info": "Rewards are unlocked 6 months after the start of the pool.", + "locked-info": "Available to claim immediately.", + "minting": "Minting Rewards", "token-vault": "{{token}} Vault", - "eth-tcap-pool": "ETH/TCAP Pool", - "eth-ctx-pool": "ETH/CTX Pool" + "unlocked": "Unlocked Reward", + "unlocked-info": "Available to claim immediately.", + "univ3": { + "amount-claim": "Amount to claim", + "available-claim": "Available to claim", + "claim-info": "In order to claim rewards, you need to unstake your token.", + "claim-reward": "Claim Reward", + "current-reward": "Current Reward", + "current-reward-info": "Amount of CTX that it's been earn while the LP token is staked. You must unstake the LP token in order to claim the reward.", + "deposited-info": "LP token needs to be stake to earn rewards. ", + "pending-info": "LP token needs to be approved in order to be staked.", + "position": "Position", + "position-info1": "Position Min and Max price represents TCAP per WETH.", + "position-info2": "Current price is", + "staked-info": "LP token is staked and earning rewards.", + "unstaked-info": "LP token hasn't been staked or deposited.", + "out-of-range-info": "You aren't earning rewards because the price is out of your position range." + } + }, + "monitoring": { + "active-info": "Vault is minting TCAP.", + "empty-info": "There is not collateral on the vault.", + "liquidation-info": "Ratio is less than min required.", + "liquidate-vault": "Liquidate Vault", + "liquidating": "Liquidating", + "ratio": "Ratio", + "ready-info": "Vault has collateral and it is ready to mint TCAP.", + "reward": "Reward", + "reward-info": "Collateral amount in USD you are getting for liquidating the vault.", + "tcap-amount-info": "Amount of TCAP in USD you need to provide to liquidate vault.", + "net-reward": "Net Reward", + "net-reward-info1": "Actual profit in USD you earn after liquidation", + "net-reward-info2": "Net Reward = Reward - TCAP Amount - Burn Fee." }, "governance": { "amount-stake": "Amount to Stake", @@ -130,7 +195,8 @@ "form": { "create": "Create Crypt Keeper", "keeper": "Keeper eth name or address", - "name": "Name" + "name": "Name", + "why": "Why should users delegate to you?" }, "success": { "title": "Crypt. Keepers", @@ -138,7 +204,7 @@ }, "errors": { "creating-keeper": "Error creating keeper.", - "exists": "Crypt Keeper for the address already exists.", + "exists": "Crypt Keeper for this address already exists.", "invalid-amount": "Invalid amount to withdraw", "invalid-ens-address": "Please enter a valid eth name or address", "invalid-twitter": "It is not a valid twitter username", @@ -147,24 +213,15 @@ "too-long": "Field is too long ({{max}} characters max)" } }, - "graph": { - "staked-usd": "Total Staked in USD", - "staked-eth": "Total Staked in ETH", - "staked-dai": "Total Staked in DAI", - "staked-aave": "Total Staked in AAVE", - "staked-link": "Total Staked in LINK", - "staked-matic": "Total Staked in MATIC", - "total-supply": "Total Supply", - "tcap-price": "TCAP Price", - "ctx-price": "CTX Price" - }, "errors": { "empty": "Field can't be empty", "invalid-address": "Please enter a valid address", "invalid-ens": "Please enter a valid ENS name", "invalid-file-type": "Invalid file type.", "invalid-image-size": "Image max size is {{size}} KB", + "less-tcap": "Tcap amount is less than required.", "no-ctx": "Not enough CTX balance.", + "no-tcap": "Not enough TCAP balance.", "no-funds": "Insufficient funds to stake", "not-approve": "Token not Approved", "tran-rejected": "Transaction rejected", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 46d2199..ec1caac 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -1,13 +1,23 @@ { + "add": "Add", + "all-vaults": "All Vaults", + "amount-tcap": "Amount of TCAP", + "approve": "Approve", "balance": "Balance", "balance2": "Current Balance", + "burn": "Burn", "choose-network": "Choose Network", "claim": "Claim", + "claiming": "Claiming", "claim-vest":"Claim Vest", "click-copy": "Click to Copy", + "collateral": "Collateral", "connect": "Connect Wallet", "contract": "Contract", "create": "Create", + "debt": "Debt", + "deposit": "Deposit", + "deposited": "Deposited", "description": "Description", "exit": "Exit", "farm": "Farm", @@ -17,21 +27,34 @@ "max": "MAX", "max-safe": "MAX SAFE", "mint": "Mint", + "my-vaults": "My Vaults", + "mode": "Mode", "last": "Last", "loading": "Loading", + "out-of-range": "Out of range", + "pending": "Pending", "pool": "Pool", "stake": "Stake", "stake2": "Amount to Stake", "staked": "Staked", + "status": "Status", + "ready": "Ready", + "remove": "Remove", + "required-tcap": "Required TCAP", "token": "Token", "tokens": "Tokens", + "totals": "Totals", "trade": "Trade", "tran-sent": "⏰ Transaction Sent!", "tran-confirmed": "✔️ Transaction Confirmed!", "tran-wait": "Plz wait for the transaction confirmation.", "tran-wait2": "All set, please wait for another confirmation", + "unstake": "Unstake", + "unstaked": "Unstaked", "update": "Update", "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "vaults": "Vauts", + "view": "View", "votes": "Votes", "wait": "Please wait", "warning": "This project is in beta. Use at your own risk.", @@ -46,10 +69,26 @@ "title3": "Connect Your Account", "subtitle3": "Mint TCAP, or check your balance connecting your account", "tcap-balance": "TCAP Balance", - "ctx-balance": "CTX Balance" + "ctx-balance": "CTX Balance", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price", + "summary": { + "title": "Protocol Summary", + "staked-usd": "Total Staked USD", + "staked-eth": "Staked in ETH", + "staked-dai": "Staked in DAI", + "staked-aave": "Staked in AAVE", + "staked-link": "Staked in LINK", + "staked-matic": "Staked in MATIC", + "staked-wbtc": "Staked in WBTC", + "staked-usdc": "Staked in USDC", + "staked-uni": "Staked in UNI", + "staked-snx": "Staked in SNX", + "total-supply": "TCAP Supply" + } }, "vault": { - "warning": "", + "warning": "Warning", "loading": "Loading Vault", "title1": "Vaults", "subtitle1": "Select your Collateral", @@ -65,8 +104,8 @@ "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", - "add": "Add Collateral", - "remove": "Remove Collateral" + "add": "Add {{collateral}}", + "remove": "Remove {{collateral}}" }, "debt": { "title": "Vault Debt", @@ -89,26 +128,51 @@ "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, - "pools": { - "pools": "Pools", - "enabled": "Enabled Pools", - "available": "Available Pools", - "liquidity": "Liquidity" - }, "farming": { - "farming": "Farming", - "minting": "Minting Rewards", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", "current-mint": "Current mint", "current-reward": "Current Reward", + "eth-tcap-pool": "ETH/TCAP Pool", + "eth-ctx-pool": "ETH/CTX Pool", + "farming": "Farming", "liquidity": "Liquidity Rewards", - "unlocked": "Unlocked Reward", "locked": "Locked Reward", - "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", - "unlocked-info": "Available to claim immediately.", "locked-info": "Available to claim immediately.", + "minting": "Minting Rewards", "token-vault": "{{token}} Vault", - "eth-tcap-pool": "ETH/TCAP Pool", - "eth-ctx-pool": "ETH/CTX Pool" + "unlocked": "Unlocked Reward", + "unlocked-info": "Available to claim immediately.", + "univ3": { + "amount-claim": "Amount to claim", + "available-claim": "Available to claim", + "claim-info": "In order to claim rewards, you need to unstake your token.", + "claim-reward": "Claim Reward", + "current-reward": "Current Reward", + "current-reward-info": "Amount of CTX that it's been earn while the LP token is staked. You must unstake the LP token in order to claim the reward.", + "deposited-info": "LP token needs to be stake to earn rewards. ", + "pending-info": "LP token needs to be approved in order to be staked.", + "position": "Position", + "position-info1": "Position Min and Max price represents TCAP per WETH.", + "position-info2": "Current price is", + "staked-info": "LP token is staked and earning rewards.", + "unstaked-info": "LP token hasn't been staked or deposited.", + "out-of-range-info": "You aren't earning rewards because the price is out of your position range." + } + }, + "monitoring": { + "active-info": "Vault is minting TCAP.", + "empty-info": "There is not collateral on the vault.", + "liquidation-info": "Ratio is less than min required.", + "liquidate-vault": "Liquidate Vault", + "liquidating": "Liquidating", + "ratio": "Ratio", + "ready-info": "Vault has collateral and it is ready to mint TCAP.", + "reward": "Reward", + "reward-info": "Collateral amount in USD you are getting for liquidating the vault.", + "tcap-amount-info": "Amount of TCAP in USD you need to provide to liquidate vault.", + "net-reward": "Net Reward", + "net-reward-info1": "Actual profit in USD you earn after liquidation", + "net-reward-info2": "Net Reward = Reward - TCAP Amount - Burn Fee." }, "governance": { "amount-stake": "Amount to Stake", @@ -149,30 +213,17 @@ "too-long": "Field is too long ({{max}} characters max)" } }, - "graph": { - "staked-usd": "Total Staked USD", - "staked-eth": "Staked in ETH", - "staked-dai": "Staked in DAI", - "staked-aave": "Staked in AAVE", - "staked-link": "Staked in LINK", - "staked-matic": "Staked in MATIC", - "staked-wbtc": "Staked in WBTC", - "staked-usdc": "Staked in USDC", - "staked-uni": "Staked in UNI", - "staked-snx": "Staked in SNX", - "total-supply": "TCAP Supply", - "tcap-price": "TCAP Price", - "ctx-price": "CTX Price" - }, "errors": { "empty": "Field can't be empty", "invalid-address": "Please enter a valid address", "invalid-ens": "Please enter a valid ENS name", "invalid-file-type": "Invalid file type.", "invalid-image-size": "Image max size is {{size}} KB", + "less-tcap": "Tcap amount is less than required.", + "not-approve": "Token not Approved", "no-ctx": "Not enough CTX balance.", "no-funds": "Insufficient funds to stake", - "not-approve": "Token not Approved", + "no-tcap": "Not enough TCAP balance.", "tran-rejected": "Transaction rejected", "unexpected": "Unexpected error" } diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 5995843..b63aac5 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -1,13 +1,23 @@ { + "add": "Add", + "all-vaults": "All Vaults", + "amount-tcap": "Amount of TCAP", + "approve": "Approve", "balance": "Balance", "balance2": "Current Balance", + "burn": "Burn", "choose-network": "Choose Network", "claim": "Claim", + "claiming": "Claimin", "claim-vest":"Claim Vest", "click-copy": "Click to Copy", + "collateral": "Collateral", "connect": "Connect Wallet", "contract": "Contract", "create": "Create", + "debt": "Debt", + "deposit": "Deposit", + "deposited": "Deposited", "description": "Description", "exit": "Exit", "farm": "Farm", @@ -15,38 +25,72 @@ "inactive": "Inative", "infinite-approve": "Infinite Approve", "max": "MAX", + "max-safe": "MAX SAFE", "mint": "Mint", + "my-vaults": "My Vaults", + "mode": "Mode", "last": "Last", "loading": "Loading", + "out-of-range": "Out of range", + "pending": "Pending", "pool": "Pool", "stake": "Stake", "stake2": "Amount to Stake", "staked": "Staked", + "status": "Status", + "ready": "Ready", + "remove": "Remove", + "required-tcap": "Required TCAP", "token": "Token", "tokens": "Tokens", + "totals": "Totals", "trade": "Trade", + "tran-sent": "⏰ Transaction Sent!", + "tran-confirmed": "✔️ Transaction Confirmed!", + "tran-wait": "Plz wait for the transaction confirmation.", + "tran-wait2": "All set, please wait for another confirmation", + "unstake": "Unstake", + "unstaked": "Unstaked", "update": "Update", "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "vaults": "Vauts", + "view": "View", "votes": "Votes", - "wait": "Please wait", + "wait": "Please wait", "warning": "This project is in beta. Use at your own risk.", "welcome": { - "tcap": "Capitalización total del mercado de criptomonedas", + "tcap": "Total Cryptocurrency Market Capitalization", "tcap-token": "Total Cryptocurrency Market Capitalization Token", - "tcap-info": "Token de capitalización de mercado de criptomonedas total", - "title1": "Mi balance total", + "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", + "title1": "My Total Balance", "subtitle1": "Connected Account", "title2": "Use TCAP", - "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "subtitle2": "Trade TCAP using Uniswap or create new supply using a vault", "title3": "Connect Your Account", "subtitle3": "Mint TCAP, or check your balance connecting your account", "tcap-balance": "TCAP Balance", - "ctx-balance": "CTX Balance" + "ctx-balance": "CTX Balance", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price", + "summary": { + "title": "Protocol Summary", + "staked-usd": "Total Staked USD", + "staked-eth": "Staked in ETH", + "staked-dai": "Staked in DAI", + "staked-aave": "Staked in AAVE", + "staked-link": "Staked in LINK", + "staked-matic": "Staked in MATIC", + "staked-wbtc": "Staked in WBTC", + "staked-usdc": "Staked in USDC", + "staked-uni": "Staked in UNI", + "staked-snx": "Staked in SNX", + "total-supply": "TCAP Supply" + } }, "vault": { "warning": "", "loading": "Loading Vault", - "title1": "The Vault", + "title1": "Vaults", "subtitle1": "Select your Collateral", "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", "approve": "Approve Vault", @@ -60,8 +104,8 @@ "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", - "add": "Add Collateral", - "remove": "Remove Collateral" + "add": "Add {{collateral}}", + "remove": "Remove {{collateral}}" }, "debt": { "title": "Vault Debt", @@ -79,30 +123,56 @@ "errors": { "no-collateral": "Not enough collateral on vault", "burn-too-high": "Burn value too high", + "burn-balance-low": "Burn value is greater than your balance.", "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, - "pools": { - "pools": "Pools", - "enabled": "Enabled Pools", - "available": "Available Pools", - "liquidity": "Liquidity" - }, "farming": { - "farming": "Farming", - "minting": "Minting Rewards", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", "current-mint": "Current mint", "current-reward": "Current Reward", + "eth-tcap-pool": "ETH/TCAP Pool", + "eth-ctx-pool": "ETH/CTX Pool", + "farming": "Farming", "liquidity": "Liquidity Rewards", - "unlocked": "Unlocked Reward", "locked": "Locked Reward", - "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", - "unlocked-info": "Available to claim immediately.", - "locked-info": "Rewards are unlocked 6 months after the start of the pool.", + "locked-info": "Available to claim immediately.", + "minting": "Minting Rewards", "token-vault": "{{token}} Vault", - "eth-tcap-pool": "ETH/TCAP Pool", - "eth-ctx-pool": "ETH/CTX Pool" + "unlocked": "Unlocked Reward", + "unlocked-info": "Available to claim immediately.", + "univ3": { + "amount-claim": "Amount to claim", + "available-claim": "Available to claim", + "claim-info": "In order to claim rewards, you need to unstake your token.", + "claim-reward": "Claim Reward", + "current-reward": "Current Reward", + "current-reward-info": "Amount of CTX that it's been earn while the LP token is staked. You must unstake the LP token in order to claim the reward.", + "deposited-info": "LP token needs to be stake to earn rewards. ", + "pending-info": "LP token needs to be approved in order to be staked.", + "position": "Position", + "position-info1": "Position Min and Max price represents TCAP per WETH.", + "position-info2": "Current price is", + "staked-info": "LP token is staked and earning rewards.", + "unstaked-info": "LP token hasn't been staked or deposited.", + "out-of-range-info": "You aren't earning rewards because the price is out of your position range." + } + }, + "monitoring": { + "active-info": "Vault is minting TCAP.", + "empty-info": "There is not collateral on the vault.", + "liquidation-info": "Ratio is less than min required.", + "liquidate-vault": "Liquidate Vault", + "liquidating": "Liquidating", + "ratio": "Ratio", + "ready-info": "Vault has collateral and it is ready to mint TCAP.", + "reward": "Reward", + "reward-info": "Collateral amount in USD you are getting for liquidating the vault.", + "tcap-amount-info": "Amount of TCAP in USD you need to provide to liquidate vault.", + "net-reward": "Net Reward", + "net-reward-info1": "Actual profit in USD you earn after liquidation", + "net-reward-info2": "Net Reward = Reward - TCAP Amount - Burn Fee." }, "governance": { "amount-stake": "Amount to Stake", @@ -125,7 +195,8 @@ "form": { "create": "Create Crypt Keeper", "keeper": "Keeper eth name or address", - "name": "Name" + "name": "Name", + "why": "Why should users delegate to you?" }, "success": { "title": "Crypt. Keepers", @@ -133,7 +204,7 @@ }, "errors": { "creating-keeper": "Error creating keeper.", - "exists": "Crypt Keeper for the address already exists.", + "exists": "Crypt Keeper for this address already exists.", "invalid-amount": "Invalid amount to withdraw", "invalid-ens-address": "Please enter a valid eth name or address", "invalid-twitter": "It is not a valid twitter username", @@ -142,24 +213,15 @@ "too-long": "Field is too long ({{max}} characters max)" } }, - "graph": { - "staked-usd": "Total Staked in USD", - "staked-eth": "Total Staked in ETH", - "staked-dai": "Total Staked in DAI", - "staked-aave": "Total Staked in AAVE", - "staked-link": "Total Staked in LINK", - "staked-matic": "Total Staked in MATIC", - "total-supply": "Total Supply", - "tcap-price": "TCAP Price", - "ctx-price": "CTX Price" - }, "errors": { "empty": "Field can't be empty", "invalid-address": "Please enter a valid address", "invalid-ens": "Please enter a valid ENS name", "invalid-file-type": "Invalid file type.", "invalid-image-size": "Image max size is {{size}} KB", + "less-tcap": "Tcap amount is less than required.", "no-ctx": "Not enough CTX balance.", + "no-tcap": "Not enough TCAP balance.", "no-funds": "Insufficient funds to stake", "not-approve": "Token not Approved", "tran-rejected": "Transaction rejected", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 3d47776..c6074e9 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -1,12 +1,22 @@ { + "add": "Add", + "all-vaults": "All Vaults", + "amount-tcap": "Amount of TCAP", + "approve": "Approve", "balance": "Solde", "balance2": "Solde actuel", + "burn": "Burn", "choose-network": "Choix de réseau", "claim": "Collecter", + "claiming": "Claiming", "click-copy": "Cliquer pour copier", + "collateral": "Collateral", "connect": "Connecter son Wallet", "contract": "Contrat", "create": "Créer", + "debt": "Debt", + "deposit": "Deposit", + "deposited": "Deposited", "description": "Description", "exit": "Quitter", "farm": "Farm", @@ -16,23 +26,37 @@ "max": "MAX", "max-safe": "MAX SAFE", "mint": "Produire", + "my-vaults": "My Vaults", + "mode": "Mode", "last": "Dernier", "loading": "Chargement", + "out-of-range": "Out of range", + "pending": "Pending", "pool": "Pool", "stake": "Epargner", "stake2": "Montant à épargner", "staked": "Epargné", + "status": "Status", + "ready": "Ready", + "remove": "Remove", + "required-tcap": "Required TCAP", "token": "Token", "tokens": "Tokens", + "totals": "Totals", "trade": "Trader", "tran-sent": "⏰ Transaction envoyée!", "tran-confirmed": "✔️ Transaction Confirmée!", "tran-wait": "En attente d'une confirmation de la transaction.", "tran-wait2": "Tout est prêt, en attente d'une seconde confirmation", + "unstake": "Unstake", + "unstaked": "Unstaked", "update": "Actualiser", "vault-warning": "⚠️ Soyez sûr d'avoir un collatéral au dessus du ratio minimum pour éviter que votre position soit liquidée.", + "vaults": "Vauts", + "view": "View", "votes": "Votes", - "wait": "Attendez s'il vous plait...", + "wait": "Attendez s'il vous plait...", + "warning": "This project is in beta. Use at your own risk.", "welcome": { "tcap": "Capitalisation boursière totale du marché des crypto-monnaies", "tcap-token": "Le token de capitalisation boursière totale du marché crypto", @@ -44,7 +68,22 @@ "title3": "Connecter votre compte", "subtitle3": "Produire du TCAP, ou verifier votre solde en connectant votre compte", "tcap-balance": "Solde de TCAP", - "ctx-balance": "Solde de CTX" + "tcap-price": "TCAP Price", + "ctx-balance": "Solde de CTX", + "summary": { + "title": "Protocol Summary", + "staked-usd": "Total Staked USD", + "staked-eth": "Staked in ETH", + "staked-dai": "Staked in DAI", + "staked-aave": "Staked in AAVE", + "staked-link": "Staked in LINK", + "staked-matic": "Staked in MATIC", + "staked-wbtc": "Staked in WBTC", + "staked-usdc": "Staked in USDC", + "staked-uni": "Staked in UNI", + "staked-snx": "Staked in SNX", + "total-supply": "TCAP Supply" + } }, "vault": { "warning": "Attention", @@ -86,23 +125,50 @@ "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, - "pools": { - "pools": "Pools", - "enabled": "Pools Activés", - "available": "Pools Disponibles", - "liquidity": "Liquidité" - }, "farming": { - "farming": "Farming", - "minting": "Production des récompenses", + "current-info": "Les récompenses des premiers investisseurs sont distribuées sur 14 jours pour un total de 500,000 CTX. En supposant que 6500 blocs Ethereum sont validés par jour sur 14 jours (91,000 blocs Ethereum), les récompenses par bloc seraient de 5.4945 CTX distribués entre les débiteurs à chaque bloc. 100% des récompenses seront disponibles immédiatement.", "current-mint": "Production Actuelle", "current-reward": "Récompenses Actuelles", + "eth-tcap-pool": "ETH/TCAP Pool", + "eth-ctx-pool": "ETH/CTX Pool", + "farming": "Farming", "liquidity": "Récompenses de liquidité", - "unlocked": "Récompenses Dévérrouillez", "locked": "Récompenses Vérrouillées", - "current-info": "Les récompenses des premiers investisseurs sont distribuées sur 14 jours pour un total de 500,000 CTX. En supposant que 6500 blocs Ethereum sont validés par jour sur 14 jours (91,000 blocs Ethereum), les récompenses par bloc seraient de 5.4945 CTX distribués entre les débiteurs à chaque bloc. 100% des récompenses seront disponibles immédiatement.", + "locked-info": "Les récompenses sont débloquées 6 mois après le début de la pool.", + "minting": "Production des récompenses", + "unlocked": "Récompenses Dévérrouillez", "unlocked-info": "Disponible pour collecter immédiatement.", - "locked-info": "Les récompenses sont débloquées 6 mois après le début de la pool." + "univ3": { + "amount-claim": "Amount to claim", + "available-claim": "Available to claim", + "claim-info": "In order to claim rewards, you need to unstake your token.", + "claim-reward": "Claim Reward", + "current-reward": "Current Reward", + "current-reward-info": "Amount of CTX that it's been earn while the LP token is staked. You must unstake the LP token in order to claim the reward.", + "deposited-info": "LP token needs to be stake to earn rewards. ", + "pending-info": "LP token needs to be approved in order to be staked.", + "position": "Position", + "position-info1": "Position Min and Max price represents TCAP per WETH.", + "position-info2": "Current price is", + "staked-info": "LP token is staked and earning rewards.", + "unstaked-info": "LP token hasn't been staked or deposited.", + "out-of-range-info": "You aren't earning rewards because the price is out of your position range." + } + }, + "monitoring": { + "active-info": "Vault is minting TCAP.", + "empty-info": "There is not collateral on the vault.", + "liquidation-info": "Ratio is less than min required.", + "liquidate-vault": "Liquidate Vault", + "liquidating": "Liquidating", + "ratio": "Ratio", + "ready-info": "Vault has collateral and it is ready to mint TCAP.", + "reward": "Reward", + "reward-info": "Collateral amount in USD you are getting for liquidating the vault.", + "tcap-amount-info": "Amount of TCAP in USD you need to provide to liquidate vault.", + "net-reward": "Net Reward", + "net-reward-info1": "Actual profit in USD you earn after liquidation", + "net-reward-info2": "Net Reward = Reward - TCAP Amount - Burn Fee." }, "governance": { "amount-stake": "Montant à Epargner", @@ -142,26 +208,17 @@ "too-long": "Ce champ est trop long ({{max}} caractères maximum)" } }, - "graph": { - "staked-usd": "Total Epargné en USD", - "staked-eth": "Total Epargné en ETH", - "staked-dai": "Total Epargné en DAI", - "staked-aave": "Total Epargné en AAVE", - "staked-link": "Total Epargné en LINK", - "staked-matic": "Total Epargné en MATIC", - "total-supply": "Circulation Totale", - "tcap-price": "Prix du TCAP", - "ctx-price": "Prix du CTX" - }, "errors": { "empty": "Ces champs ne peuvent être vides", "invalid-address": "Veuillez entrer une addresse valide", "invalid-ens": "Veuillez entrer un nom ENS valide", "invalid-file-type": "Type de fichier invalide.", "invalid-image-size": "La taille maximale du fichier peut être de {{size}} KB", + "less-tcap": "Tcap amount is less than required.", + "not-approve": "Tokens non Approuvés", "no-ctx": "Solde de CTX insuffisant.", "no-funds": "Fonds insuffisants pour épargner", - "not-approve": "Tokens non Approuvés", + "no-tcap": "Not enough TCAP balance.", "tran-rejected": "Transaction rejetée", "unexpected": "Erreur inattendue" } diff --git a/public/locales/hi_IN/translation.json b/public/locales/hi_IN/translation.json index 033fbff..b63aac5 100644 --- a/public/locales/hi_IN/translation.json +++ b/public/locales/hi_IN/translation.json @@ -1,13 +1,23 @@ { + "add": "Add", + "all-vaults": "All Vaults", + "amount-tcap": "Amount of TCAP", + "approve": "Approve", "balance": "Balance", "balance2": "Current Balance", + "burn": "Burn", "choose-network": "Choose Network", "claim": "Claim", + "claiming": "Claimin", "claim-vest":"Claim Vest", "click-copy": "Click to Copy", + "collateral": "Collateral", "connect": "Connect Wallet", "contract": "Contract", "create": "Create", + "debt": "Debt", + "deposit": "Deposit", + "deposited": "Deposited", "description": "Description", "exit": "Exit", "farm": "Farm", @@ -17,23 +27,36 @@ "max": "MAX", "max-safe": "MAX SAFE", "mint": "Mint", + "my-vaults": "My Vaults", + "mode": "Mode", "last": "Last", "loading": "Loading", + "out-of-range": "Out of range", + "pending": "Pending", "pool": "Pool", "stake": "Stake", "stake2": "Amount to Stake", "staked": "Staked", + "status": "Status", + "ready": "Ready", + "remove": "Remove", + "required-tcap": "Required TCAP", "token": "Token", "tokens": "Tokens", + "totals": "Totals", "trade": "Trade", "tran-sent": "⏰ Transaction Sent!", "tran-confirmed": "✔️ Transaction Confirmed!", "tran-wait": "Plz wait for the transaction confirmation.", "tran-wait2": "All set, please wait for another confirmation", + "unstake": "Unstake", + "unstaked": "Unstaked", "update": "Update", "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "vaults": "Vauts", + "view": "View", "votes": "Votes", - "wait": "Please wait", + "wait": "Please wait", "warning": "This project is in beta. Use at your own risk.", "welcome": { "tcap": "Total Cryptocurrency Market Capitalization", @@ -42,16 +65,32 @@ "title1": "My Total Balance", "subtitle1": "Connected Account", "title2": "Use TCAP", - "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "subtitle2": "Trade TCAP using Uniswap or create new supply using a vault", "title3": "Connect Your Account", "subtitle3": "Mint TCAP, or check your balance connecting your account", "tcap-balance": "TCAP Balance", - "ctx-balance": "CTX Balance" + "ctx-balance": "CTX Balance", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price", + "summary": { + "title": "Protocol Summary", + "staked-usd": "Total Staked USD", + "staked-eth": "Staked in ETH", + "staked-dai": "Staked in DAI", + "staked-aave": "Staked in AAVE", + "staked-link": "Staked in LINK", + "staked-matic": "Staked in MATIC", + "staked-wbtc": "Staked in WBTC", + "staked-usdc": "Staked in USDC", + "staked-uni": "Staked in UNI", + "staked-snx": "Staked in SNX", + "total-supply": "TCAP Supply" + } }, "vault": { "warning": "", "loading": "Loading Vault", - "title1": "The Vault", + "title1": "Vaults", "subtitle1": "Select your Collateral", "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", "approve": "Approve Vault", @@ -65,8 +104,8 @@ "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", - "add": "Add Collateral", - "remove": "Remove Collateral" + "add": "Add {{collateral}}", + "remove": "Remove {{collateral}}" }, "debt": { "title": "Vault Debt", @@ -84,30 +123,56 @@ "errors": { "no-collateral": "Not enough collateral on vault", "burn-too-high": "Burn value too high", + "burn-balance-low": "Burn value is greater than your balance.", "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, - "pools": { - "pools": "Pools", - "enabled": "Enabled Pools", - "available": "Available Pools", - "liquidity": "Liquidity" - }, "farming": { - "farming": "Farming", - "minting": "Minting Rewards", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", "current-mint": "Current mint", "current-reward": "Current Reward", + "eth-tcap-pool": "ETH/TCAP Pool", + "eth-ctx-pool": "ETH/CTX Pool", + "farming": "Farming", "liquidity": "Liquidity Rewards", - "unlocked": "Unlocked Reward", "locked": "Locked Reward", - "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", - "unlocked-info": "Available to claim immediately.", - "locked-info": "Rewards are unlocked 6 months after the start of the pool.", + "locked-info": "Available to claim immediately.", + "minting": "Minting Rewards", "token-vault": "{{token}} Vault", - "eth-tcap-pool": "ETH/TCAP Pool", - "eth-ctx-pool": "ETH/CTX Pool" + "unlocked": "Unlocked Reward", + "unlocked-info": "Available to claim immediately.", + "univ3": { + "amount-claim": "Amount to claim", + "available-claim": "Available to claim", + "claim-info": "In order to claim rewards, you need to unstake your token.", + "claim-reward": "Claim Reward", + "current-reward": "Current Reward", + "current-reward-info": "Amount of CTX that it's been earn while the LP token is staked. You must unstake the LP token in order to claim the reward.", + "deposited-info": "LP token needs to be stake to earn rewards. ", + "pending-info": "LP token needs to be approved in order to be staked.", + "position": "Position", + "position-info1": "Position Min and Max price represents TCAP per WETH.", + "position-info2": "Current price is", + "staked-info": "LP token is staked and earning rewards.", + "unstaked-info": "LP token hasn't been staked or deposited.", + "out-of-range-info": "You aren't earning rewards because the price is out of your position range." + } + }, + "monitoring": { + "active-info": "Vault is minting TCAP.", + "empty-info": "There is not collateral on the vault.", + "liquidation-info": "Ratio is less than min required.", + "liquidate-vault": "Liquidate Vault", + "liquidating": "Liquidating", + "ratio": "Ratio", + "ready-info": "Vault has collateral and it is ready to mint TCAP.", + "reward": "Reward", + "reward-info": "Collateral amount in USD you are getting for liquidating the vault.", + "tcap-amount-info": "Amount of TCAP in USD you need to provide to liquidate vault.", + "net-reward": "Net Reward", + "net-reward-info1": "Actual profit in USD you earn after liquidation", + "net-reward-info2": "Net Reward = Reward - TCAP Amount - Burn Fee." }, "governance": { "amount-stake": "Amount to Stake", @@ -130,7 +195,8 @@ "form": { "create": "Create Crypt Keeper", "keeper": "Keeper eth name or address", - "name": "Name" + "name": "Name", + "why": "Why should users delegate to you?" }, "success": { "title": "Crypt. Keepers", @@ -138,7 +204,7 @@ }, "errors": { "creating-keeper": "Error creating keeper.", - "exists": "Crypt Keeper for the address already exists.", + "exists": "Crypt Keeper for this address already exists.", "invalid-amount": "Invalid amount to withdraw", "invalid-ens-address": "Please enter a valid eth name or address", "invalid-twitter": "It is not a valid twitter username", @@ -147,24 +213,15 @@ "too-long": "Field is too long ({{max}} characters max)" } }, - "graph": { - "staked-usd": "Total Staked in USD", - "staked-eth": "Total Staked in ETH", - "staked-dai": "Total Staked in DAI", - "staked-aave": "Total Staked in AAVE", - "staked-link": "Total Staked in LINK", - "staked-matic": "Total Staked in MATIC", - "total-supply": "Total Supply", - "tcap-price": "TCAP Price", - "ctx-price": "CTX Price" - }, "errors": { "empty": "Field can't be empty", "invalid-address": "Please enter a valid address", "invalid-ens": "Please enter a valid ENS name", "invalid-file-type": "Invalid file type.", "invalid-image-size": "Image max size is {{size}} KB", + "less-tcap": "Tcap amount is less than required.", "no-ctx": "Not enough CTX balance.", + "no-tcap": "Not enough TCAP balance.", "no-funds": "Insufficient funds to stake", "not-approve": "Token not Approved", "tran-rejected": "Transaction rejected", diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index b6678ea..b63aac5 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -1,13 +1,23 @@ { + "add": "Add", + "all-vaults": "All Vaults", + "amount-tcap": "Amount of TCAP", + "approve": "Approve", "balance": "Balance", "balance2": "Current Balance", + "burn": "Burn", "choose-network": "Choose Network", "claim": "Claim", + "claiming": "Claimin", "claim-vest":"Claim Vest", "click-copy": "Click to Copy", + "collateral": "Collateral", "connect": "Connect Wallet", "contract": "Contract", "create": "Create", + "debt": "Debt", + "deposit": "Deposit", + "deposited": "Deposited", "description": "Description", "exit": "Exit", "farm": "Farm", @@ -17,23 +27,36 @@ "max": "MAX", "max-safe": "MAX SAFE", "mint": "Mint", + "my-vaults": "My Vaults", + "mode": "Mode", "last": "Last", "loading": "Loading", + "out-of-range": "Out of range", + "pending": "Pending", "pool": "Pool", "stake": "Stake", "stake2": "Amount to Stake", "staked": "Staked", + "status": "Status", + "ready": "Ready", + "remove": "Remove", + "required-tcap": "Required TCAP", "token": "Token", "tokens": "Tokens", + "totals": "Totals", "trade": "Trade", "tran-sent": "⏰ Transaction Sent!", "tran-confirmed": "✔️ Transaction Confirmed!", "tran-wait": "Plz wait for the transaction confirmation.", "tran-wait2": "All set, please wait for another confirmation", + "unstake": "Unstake", + "unstaked": "Unstaked", "update": "Update", "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "vaults": "Vauts", + "view": "View", "votes": "Votes", - "wait": "Please wait...", + "wait": "Please wait", "warning": "This project is in beta. Use at your own risk.", "welcome": { "tcap": "Total Cryptocurrency Market Capitalization", @@ -42,16 +65,32 @@ "title1": "My Total Balance", "subtitle1": "Connected Account", "title2": "Use TCAP", - "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "subtitle2": "Trade TCAP using Uniswap or create new supply using a vault", "title3": "Connect Your Account", "subtitle3": "Mint TCAP, or check your balance connecting your account", "tcap-balance": "TCAP Balance", - "ctx-balance": "CTX Balance" + "ctx-balance": "CTX Balance", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price", + "summary": { + "title": "Protocol Summary", + "staked-usd": "Total Staked USD", + "staked-eth": "Staked in ETH", + "staked-dai": "Staked in DAI", + "staked-aave": "Staked in AAVE", + "staked-link": "Staked in LINK", + "staked-matic": "Staked in MATIC", + "staked-wbtc": "Staked in WBTC", + "staked-usdc": "Staked in USDC", + "staked-uni": "Staked in UNI", + "staked-snx": "Staked in SNX", + "total-supply": "TCAP Supply" + } }, "vault": { "warning": "", "loading": "Loading Vault", - "title1": "The Vault", + "title1": "Vaults", "subtitle1": "Select your Collateral", "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", "approve": "Approve Vault", @@ -65,8 +104,8 @@ "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", - "add": "Add Collateral", - "remove": "Remove Collateral" + "add": "Add {{collateral}}", + "remove": "Remove {{collateral}}" }, "debt": { "title": "Vault Debt", @@ -84,30 +123,56 @@ "errors": { "no-collateral": "Not enough collateral on vault", "burn-too-high": "Burn value too high", + "burn-balance-low": "Burn value is greater than your balance.", "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, - "pools": { - "pools": "Pools", - "enabled": "Enabled Pools", - "available": "Available Pools", - "liquidity": "Liquidity" - }, "farming": { - "farming": "Farming", - "minting": "Minting Rewards", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", "current-mint": "Current mint", "current-reward": "Current Reward", + "eth-tcap-pool": "ETH/TCAP Pool", + "eth-ctx-pool": "ETH/CTX Pool", + "farming": "Farming", "liquidity": "Liquidity Rewards", - "unlocked": "Unlocked Reward", "locked": "Locked Reward", - "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", - "unlocked-info": "Available to claim immediately.", - "locked-info": "Rewards are unlocked 6 months after the start of the pool.", + "locked-info": "Available to claim immediately.", + "minting": "Minting Rewards", "token-vault": "{{token}} Vault", - "eth-tcap-pool": "ETH/TCAP Pool", - "eth-ctx-pool": "ETH/CTX Pool" + "unlocked": "Unlocked Reward", + "unlocked-info": "Available to claim immediately.", + "univ3": { + "amount-claim": "Amount to claim", + "available-claim": "Available to claim", + "claim-info": "In order to claim rewards, you need to unstake your token.", + "claim-reward": "Claim Reward", + "current-reward": "Current Reward", + "current-reward-info": "Amount of CTX that it's been earn while the LP token is staked. You must unstake the LP token in order to claim the reward.", + "deposited-info": "LP token needs to be stake to earn rewards. ", + "pending-info": "LP token needs to be approved in order to be staked.", + "position": "Position", + "position-info1": "Position Min and Max price represents TCAP per WETH.", + "position-info2": "Current price is", + "staked-info": "LP token is staked and earning rewards.", + "unstaked-info": "LP token hasn't been staked or deposited.", + "out-of-range-info": "You aren't earning rewards because the price is out of your position range." + } + }, + "monitoring": { + "active-info": "Vault is minting TCAP.", + "empty-info": "There is not collateral on the vault.", + "liquidation-info": "Ratio is less than min required.", + "liquidate-vault": "Liquidate Vault", + "liquidating": "Liquidating", + "ratio": "Ratio", + "ready-info": "Vault has collateral and it is ready to mint TCAP.", + "reward": "Reward", + "reward-info": "Collateral amount in USD you are getting for liquidating the vault.", + "tcap-amount-info": "Amount of TCAP in USD you need to provide to liquidate vault.", + "net-reward": "Net Reward", + "net-reward-info1": "Actual profit in USD you earn after liquidation", + "net-reward-info2": "Net Reward = Reward - TCAP Amount - Burn Fee." }, "governance": { "amount-stake": "Amount to Stake", @@ -130,7 +195,8 @@ "form": { "create": "Create Crypt Keeper", "keeper": "Keeper eth name or address", - "name": "Name" + "name": "Name", + "why": "Why should users delegate to you?" }, "success": { "title": "Crypt. Keepers", @@ -138,7 +204,7 @@ }, "errors": { "creating-keeper": "Error creating keeper.", - "exists": "Crypt Keeper for the address already exists.", + "exists": "Crypt Keeper for this address already exists.", "invalid-amount": "Invalid amount to withdraw", "invalid-ens-address": "Please enter a valid eth name or address", "invalid-twitter": "It is not a valid twitter username", @@ -147,24 +213,15 @@ "too-long": "Field is too long ({{max}} characters max)" } }, - "graph": { - "staked-usd": "Total Staked in USD", - "staked-eth": "Total Staked in ETH", - "staked-dai": "Total Staked in DAI", - "staked-aave": "Total Staked in AAVE", - "staked-link": "Total Staked in LINK", - "staked-matic": "Total Staked in MATIC", - "total-supply": "Total Supply", - "tcap-price": "TCAP Price", - "ctx-price": "CTX Price" - }, "errors": { "empty": "Field can't be empty", "invalid-address": "Please enter a valid address", "invalid-ens": "Please enter a valid ENS name", "invalid-file-type": "Invalid file type.", "invalid-image-size": "Image max size is {{size}} KB", + "less-tcap": "Tcap amount is less than required.", "no-ctx": "Not enough CTX balance.", + "no-tcap": "Not enough TCAP balance.", "no-funds": "Insufficient funds to stake", "not-approve": "Token not Approved", "tran-rejected": "Transaction rejected", diff --git a/public/locales/pt/translation.json b/public/locales/pt/translation.json index 033fbff..b63aac5 100644 --- a/public/locales/pt/translation.json +++ b/public/locales/pt/translation.json @@ -1,13 +1,23 @@ { + "add": "Add", + "all-vaults": "All Vaults", + "amount-tcap": "Amount of TCAP", + "approve": "Approve", "balance": "Balance", "balance2": "Current Balance", + "burn": "Burn", "choose-network": "Choose Network", "claim": "Claim", + "claiming": "Claimin", "claim-vest":"Claim Vest", "click-copy": "Click to Copy", + "collateral": "Collateral", "connect": "Connect Wallet", "contract": "Contract", "create": "Create", + "debt": "Debt", + "deposit": "Deposit", + "deposited": "Deposited", "description": "Description", "exit": "Exit", "farm": "Farm", @@ -17,23 +27,36 @@ "max": "MAX", "max-safe": "MAX SAFE", "mint": "Mint", + "my-vaults": "My Vaults", + "mode": "Mode", "last": "Last", "loading": "Loading", + "out-of-range": "Out of range", + "pending": "Pending", "pool": "Pool", "stake": "Stake", "stake2": "Amount to Stake", "staked": "Staked", + "status": "Status", + "ready": "Ready", + "remove": "Remove", + "required-tcap": "Required TCAP", "token": "Token", "tokens": "Tokens", + "totals": "Totals", "trade": "Trade", "tran-sent": "⏰ Transaction Sent!", "tran-confirmed": "✔️ Transaction Confirmed!", "tran-wait": "Plz wait for the transaction confirmation.", "tran-wait2": "All set, please wait for another confirmation", + "unstake": "Unstake", + "unstaked": "Unstaked", "update": "Update", "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "vaults": "Vauts", + "view": "View", "votes": "Votes", - "wait": "Please wait", + "wait": "Please wait", "warning": "This project is in beta. Use at your own risk.", "welcome": { "tcap": "Total Cryptocurrency Market Capitalization", @@ -42,16 +65,32 @@ "title1": "My Total Balance", "subtitle1": "Connected Account", "title2": "Use TCAP", - "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "subtitle2": "Trade TCAP using Uniswap or create new supply using a vault", "title3": "Connect Your Account", "subtitle3": "Mint TCAP, or check your balance connecting your account", "tcap-balance": "TCAP Balance", - "ctx-balance": "CTX Balance" + "ctx-balance": "CTX Balance", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price", + "summary": { + "title": "Protocol Summary", + "staked-usd": "Total Staked USD", + "staked-eth": "Staked in ETH", + "staked-dai": "Staked in DAI", + "staked-aave": "Staked in AAVE", + "staked-link": "Staked in LINK", + "staked-matic": "Staked in MATIC", + "staked-wbtc": "Staked in WBTC", + "staked-usdc": "Staked in USDC", + "staked-uni": "Staked in UNI", + "staked-snx": "Staked in SNX", + "total-supply": "TCAP Supply" + } }, "vault": { "warning": "", "loading": "Loading Vault", - "title1": "The Vault", + "title1": "Vaults", "subtitle1": "Select your Collateral", "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", "approve": "Approve Vault", @@ -65,8 +104,8 @@ "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", - "add": "Add Collateral", - "remove": "Remove Collateral" + "add": "Add {{collateral}}", + "remove": "Remove {{collateral}}" }, "debt": { "title": "Vault Debt", @@ -84,30 +123,56 @@ "errors": { "no-collateral": "Not enough collateral on vault", "burn-too-high": "Burn value too high", + "burn-balance-low": "Burn value is greater than your balance.", "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, - "pools": { - "pools": "Pools", - "enabled": "Enabled Pools", - "available": "Available Pools", - "liquidity": "Liquidity" - }, "farming": { - "farming": "Farming", - "minting": "Minting Rewards", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", "current-mint": "Current mint", "current-reward": "Current Reward", + "eth-tcap-pool": "ETH/TCAP Pool", + "eth-ctx-pool": "ETH/CTX Pool", + "farming": "Farming", "liquidity": "Liquidity Rewards", - "unlocked": "Unlocked Reward", "locked": "Locked Reward", - "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", - "unlocked-info": "Available to claim immediately.", - "locked-info": "Rewards are unlocked 6 months after the start of the pool.", + "locked-info": "Available to claim immediately.", + "minting": "Minting Rewards", "token-vault": "{{token}} Vault", - "eth-tcap-pool": "ETH/TCAP Pool", - "eth-ctx-pool": "ETH/CTX Pool" + "unlocked": "Unlocked Reward", + "unlocked-info": "Available to claim immediately.", + "univ3": { + "amount-claim": "Amount to claim", + "available-claim": "Available to claim", + "claim-info": "In order to claim rewards, you need to unstake your token.", + "claim-reward": "Claim Reward", + "current-reward": "Current Reward", + "current-reward-info": "Amount of CTX that it's been earn while the LP token is staked. You must unstake the LP token in order to claim the reward.", + "deposited-info": "LP token needs to be stake to earn rewards. ", + "pending-info": "LP token needs to be approved in order to be staked.", + "position": "Position", + "position-info1": "Position Min and Max price represents TCAP per WETH.", + "position-info2": "Current price is", + "staked-info": "LP token is staked and earning rewards.", + "unstaked-info": "LP token hasn't been staked or deposited.", + "out-of-range-info": "You aren't earning rewards because the price is out of your position range." + } + }, + "monitoring": { + "active-info": "Vault is minting TCAP.", + "empty-info": "There is not collateral on the vault.", + "liquidation-info": "Ratio is less than min required.", + "liquidate-vault": "Liquidate Vault", + "liquidating": "Liquidating", + "ratio": "Ratio", + "ready-info": "Vault has collateral and it is ready to mint TCAP.", + "reward": "Reward", + "reward-info": "Collateral amount in USD you are getting for liquidating the vault.", + "tcap-amount-info": "Amount of TCAP in USD you need to provide to liquidate vault.", + "net-reward": "Net Reward", + "net-reward-info1": "Actual profit in USD you earn after liquidation", + "net-reward-info2": "Net Reward = Reward - TCAP Amount - Burn Fee." }, "governance": { "amount-stake": "Amount to Stake", @@ -130,7 +195,8 @@ "form": { "create": "Create Crypt Keeper", "keeper": "Keeper eth name or address", - "name": "Name" + "name": "Name", + "why": "Why should users delegate to you?" }, "success": { "title": "Crypt. Keepers", @@ -138,7 +204,7 @@ }, "errors": { "creating-keeper": "Error creating keeper.", - "exists": "Crypt Keeper for the address already exists.", + "exists": "Crypt Keeper for this address already exists.", "invalid-amount": "Invalid amount to withdraw", "invalid-ens-address": "Please enter a valid eth name or address", "invalid-twitter": "It is not a valid twitter username", @@ -147,24 +213,15 @@ "too-long": "Field is too long ({{max}} characters max)" } }, - "graph": { - "staked-usd": "Total Staked in USD", - "staked-eth": "Total Staked in ETH", - "staked-dai": "Total Staked in DAI", - "staked-aave": "Total Staked in AAVE", - "staked-link": "Total Staked in LINK", - "staked-matic": "Total Staked in MATIC", - "total-supply": "Total Supply", - "tcap-price": "TCAP Price", - "ctx-price": "CTX Price" - }, "errors": { "empty": "Field can't be empty", "invalid-address": "Please enter a valid address", "invalid-ens": "Please enter a valid ENS name", "invalid-file-type": "Invalid file type.", "invalid-image-size": "Image max size is {{size}} KB", + "less-tcap": "Tcap amount is less than required.", "no-ctx": "Not enough CTX balance.", + "no-tcap": "Not enough TCAP balance.", "no-funds": "Insufficient funds to stake", "not-approve": "Token not Approved", "tran-rejected": "Transaction rejected", diff --git a/public/locales/tr/translation.json b/public/locales/tr/translation.json index 033fbff..b63aac5 100644 --- a/public/locales/tr/translation.json +++ b/public/locales/tr/translation.json @@ -1,13 +1,23 @@ { + "add": "Add", + "all-vaults": "All Vaults", + "amount-tcap": "Amount of TCAP", + "approve": "Approve", "balance": "Balance", "balance2": "Current Balance", + "burn": "Burn", "choose-network": "Choose Network", "claim": "Claim", + "claiming": "Claimin", "claim-vest":"Claim Vest", "click-copy": "Click to Copy", + "collateral": "Collateral", "connect": "Connect Wallet", "contract": "Contract", "create": "Create", + "debt": "Debt", + "deposit": "Deposit", + "deposited": "Deposited", "description": "Description", "exit": "Exit", "farm": "Farm", @@ -17,23 +27,36 @@ "max": "MAX", "max-safe": "MAX SAFE", "mint": "Mint", + "my-vaults": "My Vaults", + "mode": "Mode", "last": "Last", "loading": "Loading", + "out-of-range": "Out of range", + "pending": "Pending", "pool": "Pool", "stake": "Stake", "stake2": "Amount to Stake", "staked": "Staked", + "status": "Status", + "ready": "Ready", + "remove": "Remove", + "required-tcap": "Required TCAP", "token": "Token", "tokens": "Tokens", + "totals": "Totals", "trade": "Trade", "tran-sent": "⏰ Transaction Sent!", "tran-confirmed": "✔️ Transaction Confirmed!", "tran-wait": "Plz wait for the transaction confirmation.", "tran-wait2": "All set, please wait for another confirmation", + "unstake": "Unstake", + "unstaked": "Unstaked", "update": "Update", "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", + "vaults": "Vauts", + "view": "View", "votes": "Votes", - "wait": "Please wait", + "wait": "Please wait", "warning": "This project is in beta. Use at your own risk.", "welcome": { "tcap": "Total Cryptocurrency Market Capitalization", @@ -42,16 +65,32 @@ "title1": "My Total Balance", "subtitle1": "Connected Account", "title2": "Use TCAP", - "subtitle2": "Trade TCAP using SushiSwap or create new supply using a vault", + "subtitle2": "Trade TCAP using Uniswap or create new supply using a vault", "title3": "Connect Your Account", "subtitle3": "Mint TCAP, or check your balance connecting your account", "tcap-balance": "TCAP Balance", - "ctx-balance": "CTX Balance" + "ctx-balance": "CTX Balance", + "tcap-price": "TCAP Price", + "ctx-price": "CTX Price", + "summary": { + "title": "Protocol Summary", + "staked-usd": "Total Staked USD", + "staked-eth": "Staked in ETH", + "staked-dai": "Staked in DAI", + "staked-aave": "Staked in AAVE", + "staked-link": "Staked in LINK", + "staked-matic": "Staked in MATIC", + "staked-wbtc": "Staked in WBTC", + "staked-usdc": "Staked in USDC", + "staked-uni": "Staked in UNI", + "staked-snx": "Staked in SNX", + "total-supply": "TCAP Supply" + } }, "vault": { "warning": "", "loading": "Loading Vault", - "title1": "The Vault", + "title1": "Vaults", "subtitle1": "Select your Collateral", "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", "approve": "Approve Vault", @@ -65,8 +104,8 @@ "hard-mode-info2": "You're required to mint a minimum of 20 TCAP on hard mode.", "collateral": { "title": "Staked Collateral", - "add": "Add Collateral", - "remove": "Remove Collateral" + "add": "Add {{collateral}}", + "remove": "Remove {{collateral}}" }, "debt": { "title": "Vault Debt", @@ -84,30 +123,56 @@ "errors": { "no-collateral": "Not enough collateral on vault", "burn-too-high": "Burn value too high", + "burn-balance-low": "Burn value is greater than your balance.", "min-tcap": "You need to mint a minimum of 20 TCAP on hard mode.", "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, - "pools": { - "pools": "Pools", - "enabled": "Enabled Pools", - "available": "Available Pools", - "liquidity": "Liquidity" - }, "farming": { - "farming": "Farming", - "minting": "Minting Rewards", + "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", "current-mint": "Current mint", "current-reward": "Current Reward", + "eth-tcap-pool": "ETH/TCAP Pool", + "eth-ctx-pool": "ETH/CTX Pool", + "farming": "Farming", "liquidity": "Liquidity Rewards", - "unlocked": "Unlocked Reward", "locked": "Locked Reward", - "current-info": "Early adopters rewards are issued over 14 days for a total of 500,000 CTX. Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 Ethereum blocks), the per block reward would be 5.4945 CTX split across the debtors at that point in time. 100% of the reward is immediately available.", - "unlocked-info": "Available to claim immediately.", - "locked-info": "Rewards are unlocked 6 months after the start of the pool.", + "locked-info": "Available to claim immediately.", + "minting": "Minting Rewards", "token-vault": "{{token}} Vault", - "eth-tcap-pool": "ETH/TCAP Pool", - "eth-ctx-pool": "ETH/CTX Pool" + "unlocked": "Unlocked Reward", + "unlocked-info": "Available to claim immediately.", + "univ3": { + "amount-claim": "Amount to claim", + "available-claim": "Available to claim", + "claim-info": "In order to claim rewards, you need to unstake your token.", + "claim-reward": "Claim Reward", + "current-reward": "Current Reward", + "current-reward-info": "Amount of CTX that it's been earn while the LP token is staked. You must unstake the LP token in order to claim the reward.", + "deposited-info": "LP token needs to be stake to earn rewards. ", + "pending-info": "LP token needs to be approved in order to be staked.", + "position": "Position", + "position-info1": "Position Min and Max price represents TCAP per WETH.", + "position-info2": "Current price is", + "staked-info": "LP token is staked and earning rewards.", + "unstaked-info": "LP token hasn't been staked or deposited.", + "out-of-range-info": "You aren't earning rewards because the price is out of your position range." + } + }, + "monitoring": { + "active-info": "Vault is minting TCAP.", + "empty-info": "There is not collateral on the vault.", + "liquidation-info": "Ratio is less than min required.", + "liquidate-vault": "Liquidate Vault", + "liquidating": "Liquidating", + "ratio": "Ratio", + "ready-info": "Vault has collateral and it is ready to mint TCAP.", + "reward": "Reward", + "reward-info": "Collateral amount in USD you are getting for liquidating the vault.", + "tcap-amount-info": "Amount of TCAP in USD you need to provide to liquidate vault.", + "net-reward": "Net Reward", + "net-reward-info1": "Actual profit in USD you earn after liquidation", + "net-reward-info2": "Net Reward = Reward - TCAP Amount - Burn Fee." }, "governance": { "amount-stake": "Amount to Stake", @@ -130,7 +195,8 @@ "form": { "create": "Create Crypt Keeper", "keeper": "Keeper eth name or address", - "name": "Name" + "name": "Name", + "why": "Why should users delegate to you?" }, "success": { "title": "Crypt. Keepers", @@ -138,7 +204,7 @@ }, "errors": { "creating-keeper": "Error creating keeper.", - "exists": "Crypt Keeper for the address already exists.", + "exists": "Crypt Keeper for this address already exists.", "invalid-amount": "Invalid amount to withdraw", "invalid-ens-address": "Please enter a valid eth name or address", "invalid-twitter": "It is not a valid twitter username", @@ -147,24 +213,15 @@ "too-long": "Field is too long ({{max}} characters max)" } }, - "graph": { - "staked-usd": "Total Staked in USD", - "staked-eth": "Total Staked in ETH", - "staked-dai": "Total Staked in DAI", - "staked-aave": "Total Staked in AAVE", - "staked-link": "Total Staked in LINK", - "staked-matic": "Total Staked in MATIC", - "total-supply": "Total Supply", - "tcap-price": "TCAP Price", - "ctx-price": "CTX Price" - }, "errors": { "empty": "Field can't be empty", "invalid-address": "Please enter a valid address", "invalid-ens": "Please enter a valid ENS name", "invalid-file-type": "Invalid file type.", "invalid-image-size": "Image max size is {{size}} KB", + "less-tcap": "Tcap amount is less than required.", "no-ctx": "Not enough CTX balance.", + "no-tcap": "Not enough TCAP balance.", "no-funds": "Insufficient funds to stake", "not-approve": "Token not Approved", "tran-rejected": "Transaction rejected", diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json index 88409c1..2b0ce79 100644 --- a/public/locales/zh/translation.json +++ b/public/locales/zh/translation.json @@ -46,7 +46,22 @@ "title3": "连接您的账户", "subtitle3": "铸造TCAP,或检查你的余额连接你的账户", "tcap-balance": "TCAP余额", - "ctx-balance": "CTX余额" + "tcap-price": "TCAP Price", + "ctx-balance": "CTX余额", + "summary": { + "title": "Protocol Summary", + "staked-usd": "Total Staked USD", + "staked-eth": "Staked in ETH", + "staked-dai": "Staked in DAI", + "staked-aave": "Staked in AAVE", + "staked-link": "Staked in LINK", + "staked-matic": "Staked in MATIC", + "staked-wbtc": "Staked in WBTC", + "staked-usdc": "Staked in USDC", + "staked-uni": "Staked in UNI", + "staked-snx": "Staked in SNX", + "total-supply": "TCAP Supply" + } }, "vault": { "warning": "警告", @@ -89,26 +104,51 @@ "min-tcap2": "Afte burning the minimum amount of debt should be 20 TCAP." } }, - "pools": { - "pools": "池", - "enabled": "启用的池子", - "available": "可用的池子", - "liquidity": "流动性" - }, "farming": { - "farming": "挖矿", - "minting": "铸币奖励", + "current-info": "早期采用者的奖励在14天内发放,共计500,000 CTX。假设14天内每天大约6500个以太坊区块(91,000个以太坊区块),每个区块的奖励将是5.4945 CTX,分给当时的债务人。100%的奖励是立即可用的。", "current-mint": "当前铸造", "current-reward": "当前奖励", + "eth-tcap-pool": "ETH/TCAP Pool", + "eth-ctx-pool": "ETH/CTX Pool", + "farming": "挖矿", "liquidity": "流动性奖励", - "unlocked": "解锁的奖励", "locked": "锁定的奖赏", - "current-info": "早期采用者的奖励在14天内发放,共计500,000 CTX。假设14天内每天大约6500个以太坊区块(91,000个以太坊区块),每个区块的奖励将是5.4945 CTX,分给当时的债务人。100%的奖励是立即可用的。", - "unlocked-info": "可立即领取。", "locked-info": "奖励在池子开始6个月后解锁。", + "minting": "铸币奖励", + "unlocked": "解锁的奖励", + "unlocked-info": "可立即领取。", "token-vault": "{{token}} Vault", - "eth-tcap-pool": "ETH/TCAP Pool", - "eth-ctx-pool": "ETH/CTX Pool" + "univ3": { + "amount-claim": "Amount to claim", + "available-claim": "Available to claim", + "claim-info": "In order to claim rewards, you need to unstake your token.", + "claim-reward": "Claim Reward", + "current-reward": "Current Reward", + "current-reward-info": "Amount of CTX that it's been earn while the LP token is staked. You must unstake the LP token in order to claim the reward.", + "deposited-info": "LP token needs to be stake to earn rewards. ", + "pending-info": "LP token needs to be approved in order to be staked.", + "position": "Position", + "position-info1": "Position Min and Max price represents TCAP per WETH.", + "position-info2": "Current price is", + "staked-info": "LP token is staked and earning rewards.", + "unstaked-info": "LP token hasn't been staked or deposited.", + "out-of-range-info": "You aren't earning rewards because the price is out of your position range." + } + }, + "monitoring": { + "active-info": "Vault is minting TCAP.", + "empty-info": "There is not collateral on the vault.", + "liquidation-info": "Ratio is less than min required.", + "liquidate-vault": "Liquidate Vault", + "liquidating": "Liquidating", + "ratio": "Ratio", + "ready-info": "Vault has collateral and it is ready to mint TCAP.", + "reward": "Reward", + "reward-info": "Collateral amount in USD you are getting for liquidating the vault.", + "tcap-amount-info": "Amount of TCAP in USD you need to provide to liquidate vault.", + "net-reward": "Net Reward", + "net-reward-info1": "Actual profit in USD you earn after liquidation", + "net-reward-info2": "Net Reward = Reward - TCAP Amount - Burn Fee." }, "governance": { "amount-stake": "质押金额", @@ -148,26 +188,17 @@ "too-long": "字段太长。最长 ({{max}} 字符。)" } }, - "graph": { - "staked-usd": "总质押(美元)", - "staked-eth": "总质押(以太坊)", - "staked-dai": "总质押(DAI)", - "staked-aave": "总质押(AAVE)", - "staked-link": "总质押(LINK)", - "staked-matic": "总质押(MATIC)", - "total-supply": "供应总量", - "tcap-price": "TCAP 价格", - "ctx-price": "CTX 价格" - }, "errors": { "empty": "字段不能为空", "invalid-address": "请输入一个有效的地址", "invalid-ens": "请输入一个有效的ENS名称", "invalid-file-type": "无效的文件类型。", "invalid-image-size": "图像的最大尺寸是 {{size}} KB", + "less-tcap": "Tcap amount is less than required.", + "not-approve": "未批准的代币", "no-ctx": "没有足够的CTX余额。", "no-funds": "没有足够的资金质押", - "not-approve": "未批准的代币", + "no-tcap": "Not enough TCAP balance.", "tran-rejected": "交易被拒绝", "unexpected": "意外的错误" } diff --git a/src/components/Farm/UniV3Rewards/ClaimReward.tsx b/src/components/Farm/UniV3Rewards/ClaimReward.tsx index 972b831..4d4d247 100644 --- a/src/components/Farm/UniV3Rewards/ClaimReward.tsx +++ b/src/components/Farm/UniV3Rewards/ClaimReward.tsx @@ -2,6 +2,7 @@ import React, { useState } from "react"; import { Button, Form } from "react-bootstrap"; import { ethers } from "ethers"; import Modal from "react-bootstrap/esm/Modal"; +import { useTranslation } from "react-i18next"; import "../../../styles/modal.scss"; import { errorNotification, notifyUser } from "../../../utils/utils"; import { IncentiveType } from "./types"; @@ -25,6 +26,7 @@ const ClaimReward = ({ onHide, refresh, }: props) => { + const { t } = useTranslation(); const [rewardText, setRewardText] = useState(""); const [canClaim, setCanClaim] = useState(true); @@ -53,13 +55,13 @@ const ClaimReward = ({ setRewardText(""); onHide(); } catch (error) { - errorNotification("Transaction Rejected"); + errorNotification(t("errors.tran-rejected")); } } else { errorNotification("Not enough CTX reward"); } } else { - errorNotification("Field can't be empty"); + errorNotification(t("errors.empty")); } setCanClaim(true); } @@ -77,13 +79,15 @@ const ClaimReward = ({ }} > - Claim Reward + + {t("farming.univ3.claim-reward")} +
- Amount to Claim + {t("farming.univ3.amount-claim")} MAX @@ -101,7 +105,7 @@ const ClaimReward = ({ diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 966e3c3..c323f5f 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -5,6 +5,7 @@ import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Table from "react-bootstrap/esm/Table"; import Tooltip from "react-bootstrap/esm/Tooltip"; import Spinner from "react-bootstrap/Spinner"; +import { useTranslation } from "react-i18next"; import { BigNumber, ethers } from "ethers"; import NumberFormat from "react-number-format"; import { Contract } from "ethers-multicall"; @@ -57,6 +58,7 @@ const Rewards = ({ nfpmContractRead, poolContractRead, }: props) => { + const { t } = useTranslation(); const tokens = useContext(TokensContext); const currentNetwork = useContext(NetworkContext); const [ethTcapIncentive, setEthTcapIncentive] = useState>([]); @@ -231,13 +233,13 @@ const Rewards = ({ className=" ml-4 claim" disabled={btnDisabled} > - Claim + {t("claim")} ); }; const WithdrawButton = ({ position }: btnProps) => { - const title = "Exit"; + const title = t("exit"); let btnDisabled = true; // eslint-disable-next-line @@ -282,15 +284,11 @@ const Rewards = ({
- Available to Claim + {t("farming.univ3.available-claim")} - In order to claim rewards, you need to unstake your token. - - } + overlay={{t("farming.univ3.claim-info")}} >
@@ -373,7 +377,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = onClick={liquidate} disabled={!canLiquidate} > - {canLiquidate ? "Liquidate Vault" : "Liquidating"} + {canLiquidate ? t("monitoring.liquidate-vault") : t("monitoring.liquidating")} diff --git a/src/components/Vault/Monitoring/Vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx index 2b32884..a56b56e 100644 --- a/src/components/Vault/Monitoring/Vaults.tsx +++ b/src/components/Vault/Monitoring/Vaults.tsx @@ -3,6 +3,7 @@ import Button from "react-bootstrap/esm/Button"; import Table from "react-bootstrap/Table"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; +import { useTranslation } from "react-i18next"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; import { ReactComponent as SortIcon } from "../../../assets/images/sort.svg"; import { ReactComponent as SortUpIcon } from "../../../assets/images/sort-up.svg"; @@ -42,6 +43,7 @@ export const Vaults = ({ pagination, refresh, }: dataType) => { + const { t } = useTranslation(); const [showLiquidate, setShowLiquidate] = useState(false); const [vaultIndex, setVaultIndex] = useState(-1); const [liqVault, setLiqVault] = useState(null); @@ -176,20 +178,18 @@ export const Vaults = ({ - + {currentStatus === "liquidation" && ( -
Vaults
+
{t("vaults")}
{vaultsTotals.vaults}
-
Collateral (USD)
+
{t("collateral")} (USD)
${numberFormatStr(vaultsTotals.collateralUSD, 2, 2)}
{numberFormatStr(vaultsTotals.debt, 4, 4)} -
Debt (USD)
+
{t("debt")} (USD)
${numberFormatStr(vaultsTotals.debtUSD, 2, 2)} @@ -883,7 +891,7 @@ export const Monitoring = () => {
-
View:
+
{t("view")}:
handleItemsViewChange(eventKey || "15")}> {
-
Collateral:
+
{t("collateral")}:
handleTokenChange(eventKey || "ALL")} @@ -931,7 +939,7 @@ export const Monitoring = () => {
-
Status:
+
{t("status")}:
handleStatusChange(eventKey || "ALL")}> {
{isInLayer1(currentNetwork.chainId) && (
-
Mode:
+
{t("mode")}:
handleModeChange(eventKey || "ALL")} diff --git a/src/components/Welcome/Protocol.tsx b/src/components/Welcome/Protocol.tsx index 9c40688..0de72f5 100644 --- a/src/components/Welcome/Protocol.tsx +++ b/src/components/Welcome/Protocol.tsx @@ -311,7 +311,7 @@ const Protocol = ({ data }: props) => { return ( -

Protocol Summary

+

{t("welcome.summary.title")}

{loading ? ( @@ -323,7 +323,7 @@ const Protocol = ({ data }: props) => {
-
{t("graph.staked-usd")}
+
{t("welcome.summary.staked-usd")}
{
-
{t("graph.total-supply")}
+
{t("welcome.summary.total-supply")}
{
-
{t("graph.staked-eth")}
+
{t("welcome.summary.staked-eth")}
{
-
{t("graph.staked-dai")}
+
{t("welcome.summary.staked-dai")}
{
-
{t("graph.staked-aave")}
+
{t("welcome.summary.staked-aave")}
{
-
{t("graph.staked-link")}
+
{t("welcome.summary.staked-link")}
{
-

{t("graph.staked-uni")}

+

{t("welcome.summary.staked-uni")}

{
-

{t("graph.staked-snx")}

+

{t("welcome.summary.staked-snx")}

{
-
{t("graph.staked-matic")}
+
{t("welcome.summary.staked-matic")}
{
-
{t("graph.staked-wbtc")}
+
{t("welcome.summary.staked-wbtc")}
{
-
{t("graph.staked-usdc")}
+
{t("welcome.summary.staked-usdc")}
{ decimalScale={2} />
-

TCAP Price:

+

{t("welcome.tcap-price")}:

{isInLayer1(currentNetwork.chainId) && (
@@ -184,7 +184,7 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { decimalScale={2} />
-

CTX Price:

+

{t("welcome.ctx-price")}:

)}
@@ -325,7 +325,7 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { }} disabled={address === ""} > - My Vaults + {t("my-vaults")} +
@@ -424,6 +425,16 @@ const Rewards = ({ />{" "} CTX + + - {ethTcapPositions.sort(sortPositions).map((position, index) => { - console.log(""); - return ( - - - + + - - - - - ); - })} + +
+ TCAP/WETH Pool + Uniswap +
+ +
+ + + + + ))}
-
{statusTag(index, v)}
+
+ {statusTag(index, v)} + {v.isHardVault && } +
{ const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); ethcalls.push(wethOraclePriceCall); ethcalls.push(aaveOraclePriceCall); ethcalls.push(linkOraclePriceCall); ethcalls.push(usdcOraclePriceCall); + ethcalls.push(wbtcOraclePriceCall); } if (isOptimism(currentNetwork.chainId)) { const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); @@ -223,6 +225,7 @@ export const Monitoring = () => { aaveOraclePrice, linkOraclePrice, usdcOraclePrice, + wbtcOraclePrice, ] = await signer.ethcallProvider?.all(ethcalls); } else if (isOptimism(currentNetwork.chainId)) { // @ts-ignore @@ -450,88 +453,95 @@ export const Monitoring = () => { isHardVault: boolean, decimals: number ) => { - let cVault = vaults.wethVault; - let cVaultRead = vaults.wethVaultRead; - let vaultPrice = oraclePrices?.wethOraclePrice; - if (isHardVault) { - cVault = hardVaults.wethVault; - cVaultRead = hardVaults.wethVaultRead; - } + try { + let cVault = vaults.wethVault; + let cVaultRead = vaults.wethVaultRead; + let vaultPrice = oraclePrices?.wethOraclePrice; + if (isHardVault) { + cVault = hardVaults.wethVault; + cVaultRead = hardVaults.wethVaultRead; + } - switch (vaultType) { - case "DAI": - if (isHardVault) { - cVault = hardVaults.daiVault; - cVaultRead = hardVaults.daiVaultRead; - } else { - cVault = vaults.daiVault; - cVaultRead = vaults.daiVaultRead; - } - vaultPrice = oraclePrices?.daiOraclePrice; - break; - case "AAVE": - cVault = vaults.aaveVault; - cVaultRead = vaults.aaveVaultRead; - vaultPrice = oraclePrices?.aaveOraclePrice; - break; - case "LINK": - cVault = vaults.linkVault; - cVaultRead = vaults.linkVaultRead; - vaultPrice = oraclePrices?.linkOraclePrice; - break; - case "SNX": - cVault = vaults.snxVault; - cVaultRead = vaults.snxVaultRead; - vaultPrice = oraclePrices?.snxOraclePrice; - break; - case "UNI": - cVault = vaults.uniVault; - cVaultRead = vaults.uniVaultRead; - vaultPrice = oraclePrices?.uniOraclePrice; - break; - case "MATIC": - cVault = vaults.maticVault; - cVaultRead = vaults.maticVaultRead; - vaultPrice = oraclePrices?.maticOraclePrice; - break; - case "WBTC": - cVault = vaults.wbtcVault; - cVaultRead = vaults.wbtcVaultRead; - vaultPrice = oraclePrices?.wbtcOraclePrice; - break; - case "USDC": - cVault = hardVaults.usdcVault; - cVaultRead = hardVaults.usdcVaultRead; - vaultPrice = oraclePrices?.usdcOraclePrice; - break; - default: - if (isHardVault) { - cVault = hardVaults.wethVault; - cVaultRead = hardVaults.wethVaultRead; - } else { - cVault = vaults.wethVault; - cVaultRead = vaults.wethVaultRead; - } - vaultPrice = oraclePrices?.wethOraclePrice; - break; - } + switch (vaultType) { + case "DAI": + if (isHardVault) { + cVault = hardVaults.daiVault; + cVaultRead = hardVaults.daiVaultRead; + } else { + cVault = vaults.daiVault; + cVaultRead = vaults.daiVaultRead; + } + vaultPrice = oraclePrices?.daiOraclePrice; + break; + case "AAVE": + cVault = vaults.aaveVault; + cVaultRead = vaults.aaveVaultRead; + vaultPrice = oraclePrices?.aaveOraclePrice; + break; + case "LINK": + cVault = vaults.linkVault; + cVaultRead = vaults.linkVaultRead; + vaultPrice = oraclePrices?.linkOraclePrice; + break; + case "SNX": + cVault = vaults.snxVault; + cVaultRead = vaults.snxVaultRead; + vaultPrice = oraclePrices?.snxOraclePrice; + break; + case "UNI": + cVault = vaults.uniVault; + cVaultRead = vaults.uniVaultRead; + vaultPrice = oraclePrices?.uniOraclePrice; + break; + case "MATIC": + cVault = vaults.maticVault; + cVaultRead = vaults.maticVaultRead; + vaultPrice = oraclePrices?.maticOraclePrice; + break; + case "WBTC": + cVault = vaults.wbtcVault; + cVaultRead = vaults.wbtcVaultRead; + vaultPrice = oraclePrices?.wbtcOraclePrice; + break; + case "USDC": + cVault = hardVaults.usdcVault; + cVaultRead = hardVaults.usdcVaultRead; + vaultPrice = oraclePrices?.usdcOraclePrice; + break; + default: + if (isHardVault) { + cVault = hardVaults.wethVault; + cVaultRead = hardVaults.wethVaultRead; + } else { + cVault = vaults.wethVault; + cVaultRead = vaults.wethVaultRead; + } + vaultPrice = oraclePrices?.wethOraclePrice; + break; + } - const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); - const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); - // @ts-ignore - const [reqTcap, liqReward] = await signer.ethcallProvider?.all([reqTcapCall, liqRewardCall]); - - const reqTcapText = ethers.utils.formatEther(reqTcap); - const liqRewardText = ethers.utils.formatUnits(liqReward, decimals); - const currentLiqFee = await cVault?.getFee(reqTcap); - const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - - return ( - toUSD(liqRewardText, vaultPrice || "0") - - toUSD(reqTcapText, oraclePrices?.tcapOraclePrice || "0") - - toUSD(ethFee, oraclePrices?.wethOraclePrice || "0") - ); + const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); + const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); + // @ts-ignore + const [reqTcap, liqReward] = await signer.ethcallProvider?.all([reqTcapCall, liqRewardCall]); + + const reqTcapText = ethers.utils.formatEther(reqTcap); + const liqRewardText = ethers.utils.formatUnits(liqReward, decimals); + const currentLiqFee = await cVault?.getFee(reqTcap); + const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + + return ( + toUSD(liqRewardText, vaultPrice || "0") - + toUSD(reqTcapText, oraclePrices?.tcapOraclePrice || "0") - + toUSD(ethFee, oraclePrices?.wethOraclePrice || "0") + ); + } catch (error) { + if (error.code !== "UNPREDICTABLE_GAS_LIMIT") { + console.log(error.code); + } + return 0; + } }; const calculateVaultData = ( @@ -683,6 +693,7 @@ export const Monitoring = () => { if (showAllVaults) { symbols.push({ key: "aave", name: "AAVE" }); symbols.push({ key: "link", name: "LINK" }); + symbols.push({ key: "usdc", name: "USDC" }); } } else if (isOptimism(currentNetwork.chainId)) { symbols.push({ key: "eth", name: "ETH" }); @@ -802,8 +813,8 @@ export const Monitoring = () => { blockTS: vaultList[index].blockTS, url: vaultList[index].url, }; - allVaults[index] = v; - setVaultList(allVaults); + allVaults[index] = Object.create(v); + setVaultList(Array.from(allVaults)); setRenderTable(!renderTable); }; diff --git a/src/styles/app.scss b/src/styles/app.scss index a54af3e..404d9cc 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -287,13 +287,18 @@ html, text-align: right; padding: 0.9rem; } +.ttip-hard-vault > .tooltip-inner { + max-width: 350px; + width: 350px; + text-align: left; +} .univ3-status-tooltip > .tooltip-inner { min-width: 400px; width: 400px; text-align: left; padding: 0.9rem; - .empty { + .unstaked { text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; } .deposited { diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 14c132b..412b161 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -343,8 +343,26 @@ } .rewards { display: flex; - justify-content: flex-end; + justify-content: space-between; margin-bottom: 1.3rem; + h6 { + color: $white; + margin-top: 3px; + margin-right: 10px; + font-size: 1.1rem; + } + .number { + color: $white; + text-shadow: 0 0 4px #f195f9,0 0 10px #fff,0 0 20px #e440f2,0 -10px 40px #b626c4; + } + &-tier { + display: flex; + flex-direction: row; + align-items: center; + h6 { + margin-bottom: 0.2rem; + } + } &-total { display: flex; flex-direction: row; @@ -356,16 +374,6 @@ margin-left: 4px; } } - h6 { - color: $white; - margin-top: 3px; - margin-right: 10px; - font-size: 1.1rem; - } - .number { - color: $white; - text-shadow: 0 0 4px #f195f9,0 0 10px #fff,0 0 20px #e440f2,0 -10px 40px #b626c4; - } } } .position { @@ -410,7 +418,7 @@ } } } - .empty { + .unstaked { text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; } .deposited { diff --git a/src/styles/toast.scss b/src/styles/toast.scss index 0aaa9e6..afa9546 100644 --- a/src/styles/toast.scss +++ b/src/styles/toast.scss @@ -89,4 +89,7 @@ margin-right: 1rem; } } + p { + margin-left: 4.3rem; + } } diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 28635a0..36c6873 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -204,11 +204,28 @@ } } .status { + display: flex; + align-items: center; font-family: "Nineteen Ninety Seven"; font-size: 15px; -webkit-animation: fire 2s infinite alternate; animation: fire 2s infinite alternate; color: #fff !important; + svg { + margin-left: 7px; + &.empty { + filter: brightness(1118%) drop-shadow(0px 0px 5px #f28040); + } + &.ready { + filter: brightness(1118%) drop-shadow(0px 0px 5px #167226); + } + &.active { + filter: brightness(1118%) drop-shadow(0px 0px 5px #e440f2); + } + &.liquidation { + filter: brightness(1118%) drop-shadow(0px 0px 5px #c33); + } + } button { background: transparent; border: 0.8px solid #f28040; diff --git a/src/styles/vault.scss b/src/styles/vault.scss index 30029d5..07d8b41 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -90,6 +90,7 @@ border: 1px solid #dfd1ea; border-radius: 5px; margin-bottom: 0rem !important; + margin-right: 0.5rem; input[type="radio"] { display: none; } @@ -104,6 +105,14 @@ } } + .alert-warning { + margin-top: 0rem; + margin-bottom: 0rem; + padding: 0.2rem 1rem; + height: 2rem; + width: 70%; + } + .dd-collateral { display: flex; align-items: center; From bdadd1e89d12ab4772fb4f69c24dbf3c8ecd35f1 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 27 Apr 2022 07:39:55 -0600 Subject: [PATCH 097/278] change btn name --- src/components/Vault/Monitoring/Liquidate.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index d69aee0..ad970db 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -289,7 +289,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = Amount of TCAP - MAX REWARD + MIN REQUIRED From 4483d1469c0a5d77bfeef0ce13d5a57a98c284cd Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 27 Apr 2022 08:33:25 -0600 Subject: [PATCH 098/278] updating liq rewards dates --- src/components/Farm.tsx | 74 ++++++++++++----------------------------- src/styles/farm.scss | 3 -- 2 files changed, 22 insertions(+), 55 deletions(-) diff --git a/src/components/Farm.tsx b/src/components/Farm.tsx index a96f428..0520ae0 100644 --- a/src/components/Farm.tsx +++ b/src/components/Farm.tsx @@ -21,12 +21,7 @@ import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; import { ReactComponent as WETHIcon } from "../assets/images/graph/weth.svg"; import { ReactComponent as DAIIcon } from "../assets/images/graph/DAI.svg"; import Loading from "./Loading"; -import { - notifyUser, - errorNotification, - tsToDateString, - getPriceInUSDFromPair, -} from "../utils/utils"; +import { notifyUser, errorNotification, getPriceInUSDFromPair } from "../utils/utils"; import { Stake } from "./modals/Stake"; const ctxClaimVestShowDate = new Date(1634511235 * 1000); @@ -48,8 +43,6 @@ const Farm = () => { const [ctxPoolBalance, setCtxPoolBalance] = useState("0.0"); const [ethVestAmount, setEthVestAmount] = useState(ethers.BigNumber.from(0)); const [ctxVestAmount, setCtxVestAmount] = useState(ethers.BigNumber.from(0)); - const [vestingEndTime, setVestingEndTime] = useState(0); - const [ctxVestingEndTime, setCtxVestingEndTime] = useState(0); const [updateData, setUpdateData] = useState(false); const signer = useContext(SignerContext); const tokens = useContext(TokensContext); @@ -184,9 +177,7 @@ const Farm = () => { const rateCtxPoolCall = await rewards.ctxPoolRewardRead?.rewardRate(); const ctxLPsStakedCall = await rewards.ctxPoolRewardRead?.totalSupply(); const wethPoolVestingRatioCall = await rewards.wethPoolRewardRead?.vestingRatio(); - const wethPoolVestingTimeCall = await rewards.wethPoolRewardRead?.vestingEnd(); const ctxVestingRatioCall = await rewards.ctxPoolRewardRead?.vestingRatio(); - const ctxVestingTimeCall = await rewards.ctxPoolRewardRead?.vestingEnd(); // @ts-ignore const [ @@ -205,9 +196,7 @@ const Farm = () => { rateCtxPool, ctxLPsStaked, wethPoolVestingRatio, - wethPoolVestingTime, ctxVestingRatio, - ctxVestingTime, ] = await signer.ethcallProvider?.all([ wethOracleCall, tcapOracleCall, @@ -224,9 +213,7 @@ const Farm = () => { rateCtxPoolCall, ctxLPsStakedCall, wethPoolVestingRatioCall, - wethPoolVestingTimeCall, ctxVestingRatioCall, - ctxVestingTimeCall, ]); const currentPriceTCAP = ethers.utils.formatEther(tcapPrice); @@ -282,9 +269,6 @@ const Farm = () => { ) ); - setVestingEndTime(wethPoolVestingTime); - setCtxVestingEndTime(ctxVestingTime); - if (signer.signer) { const currentAddress = await signer.signer.getAddress(); setAddress(currentAddress); @@ -701,7 +685,7 @@ const Farm = () => { trigger={["hover", "click"]} overlay={ - Rewards are unlocked 6 months after the start of the pool. + Available to claim immediately. } > @@ -760,23 +744,16 @@ const Farm = () => { />{" "} CTX -
- {" "} - CTX -
-
- - {tsToDateString(vestingEndTime)} - -
+
+ {" "} + CTX @@ -900,23 +877,16 @@ const Farm = () => { />{" "} CTX -
- {" "} - CTX -
-
- - {tsToDateString(ctxVestingEndTime)} - -
+
+ {" "} + CTX diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 6e49716..10ded9a 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -242,9 +242,6 @@ font-size: 0.8rem; color: $light; } - &.vested-reward { - padding-top: 2.2rem; - } } a.btn { From b3c29412568a0ea475fb4dda5a08fce7d8a57f71 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 27 Apr 2022 09:52:50 -0600 Subject: [PATCH 099/278] sort lp tokens by id --- src/components/Farm/UniV3Rewards/Rewards.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 5676e40..565c09b 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -68,7 +68,7 @@ const Rewards = ({ const OWNER_POSITIONS = gql` query ownerPools($owner: String!) { - positions(orderBy: id, where: { owner: $owner, liquidity_gt: 0 }) { + positions(where: { owner: $owner, liquidity_gt: 0 }, orderBy: id) { id poolAddress tickLower { @@ -263,6 +263,8 @@ const Rewards = ({ ); + const sortPositions = (p1: PositionType, p2: PositionType) => p1.lpTokenId - p2.lpTokenId; + const RenderRewards = () => ( <>
@@ -336,7 +338,7 @@ const Rewards = ({ Staked: LP token is staked and earning rewards.
Out of range: You aren't earning - rewards beacause the price is out of your position range. + rewards because the price is out of your position range. } > @@ -362,7 +364,7 @@ const Rewards = ({
APYAPR
{t("governance.staked-reward")}APYAPR
{statusTag(index, v)} - {v.isHardVault && } + {v.isHardVault && Hard mode}
diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index d152059..8a5da9d 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -84,6 +84,7 @@ export const Monitoring = () => { const [radioValue, setRadioValue] = useState("1"); const [tokenSymbol, setTokenSymbol] = useState("all"); const [currentStatus, setCurrentStatus] = useState("all"); + const [vaultMode, setVaultMode] = useState("all"); const [renderTable, setRenderTable] = useState(false); const radios = [ { name: "All Vaults", value: "1" }, @@ -104,6 +105,11 @@ export const Monitoring = () => { { key: VAULT_STATUS.active, name: "Active" }, { key: VAULT_STATUS.liquidation, name: "Liquidation" }, ]; + const modeList = [ + { key: "all", name: "All" }, + { key: "regular", name: "Regular" }, + { key: "hard", name: "Hard" }, + ]; const buildFilters = () => { const weiLimit = "100000000"; @@ -111,6 +117,7 @@ export const Monitoring = () => { let ownerFilter = ""; let vaultFilter = ""; let statusFilter = ""; + let modeFilter = ""; if (radioValue === "2" && ownerAddress !== "") { ownerFilter = `, owner: "${ownerAddress}"`; } @@ -125,6 +132,10 @@ export const Monitoring = () => { statusFilter = `collateral_gte: "${weiLimit}", debt_lt: "${weiLimit}"`; } } + if (vaultMode !== "all") { + const isHard = vaultMode === "hard" ? "true" : "false"; + modeFilter = "hardVault: ".concat(isHard); + } filter = ownerFilter; if (vaultFilter !== "") { @@ -133,6 +144,9 @@ export const Monitoring = () => { if (statusFilter !== "") { filter = filter.concat(`, ${statusFilter}`); } + if (modeFilter !== "") { + filter = filter.concat(`, ${modeFilter}`); + } if (filter !== "") { if (loadMore) { filter = `, where: { blockTS_gt: "${pagination.lastId}" ${filter} }`; @@ -737,6 +751,11 @@ export const Monitoring = () => { setTokenSymbol(newToken); }; + const handleModeChange = (newMode: string) => { + setSkipQuery(false); + setVaultMode(newMode); + }; + const onPageSelected = (pageNumber: number) => { const nextPage = pageNumber === pagination.pages ? 0 : pageNumber + 1; const newPagination = { @@ -827,7 +846,7 @@ export const Monitoring = () => {
Totals
-
- Position + {t("farming.univ3.position")} - Position Min and Max price represents TCAP per WETH.
- Current price is{" "} + {t("farming.univ3.position-info1")}
+ {t("farming.univ3.position-info2")}{" "} {numberFormatStr(cumulativePrice.toString(), 4, 4)} {" "} @@ -338,23 +336,23 @@ const Rewards = ({
- Status + {t("status")} - Pending: LP token needs to be - approved in order to be staked.
- Unstaked: LP token hasn't been staked - or deposited.
- Deposited: LP token needs to be - stake to earn rewards.
- Staked: LP token is staked and earning - rewards.
- Out of range: You aren't earning - rewards because the price is out of your position range. + Pending:{" "} + {t("farming.univ3.pending-info")}
+ Unstaked:{" "} + {t("farming.univ3.unstaked-info")}
+ Deposited:{" "} + {t("farming.univ3.deposited-info")}
+ Staked:{" "} + {t("farming.univ3.staked-info")}
+ Out of range:{" "} + {t("farming.univ3.out-of-range-info")} } > @@ -362,15 +360,14 @@ const Rewards = ({
- Current Reward + {t("farming.univ3.current-reward")} - Amount of CTX that it's been earn while the LP token is staked. You must unstake - the LP token in order to claim the reward. + {t("farming.univ3.current-reward-info")} } > @@ -474,7 +471,7 @@ const Rewards = ({ return ( -

Uniswap V3 Liquidity Rewards

+

Uniswap V3 {t("farming.liquidity")}

{ownerAddress !== "" ? ( diff --git a/src/components/Farm/UniV3Rewards/Stake.tsx b/src/components/Farm/UniV3Rewards/Stake.tsx index f4dab5a..4aab3c9 100644 --- a/src/components/Farm/UniV3Rewards/Stake.tsx +++ b/src/components/Farm/UniV3Rewards/Stake.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; import Button from "react-bootstrap/esm/Button"; import { BigNumber, ethers } from "ethers"; +import { useTranslation } from "react-i18next"; import { UNIV3, encodeIncentive } from "../../../utils/univ3"; import { IncentiveType, PositionType, StakeStatus } from "./types"; import { notifyUser, errorNotification } from "../../../utils/utils"; @@ -22,6 +23,7 @@ const Stake = ({ stakerContract, refresh, }: props) => { + const { t } = useTranslation(); const [title, setTitle] = useState("Stake"); const [btnDisabled, setBtnDisabled] = useState(true); @@ -31,14 +33,14 @@ const Stake = ({ let btnTitle = "Stake"; let bDisabled = true; if (position.status === StakeStatus.not_approved) { - btnTitle = "Approve"; + btnTitle = t("approve"); bDisabled = false; } else if (position.status === StakeStatus.staked) { bDisabled = false; - btnTitle = "Unstake"; + btnTitle = t("unstake"); } else if (currentTime < incentive.startTime) { bDisabled = false; - btnTitle = "Deposit"; + btnTitle = t("deposit"); } else if (currentTime >= incentive.startTime && currentTime <= incentive.endTime) { // eslint-disable-next-line bDisabled = !(position.status === StakeStatus.empty || position.status === StakeStatus.deposited); @@ -58,7 +60,7 @@ const Stake = ({ notifyUser(tx, refresh); } catch (error) { console.log(error); - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } setBtnDisabled(false); }; @@ -75,7 +77,7 @@ const Stake = ({ notifyUser(tx, refresh); } catch (error) { console.log(error); - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } setBtnDisabled(false); }; @@ -87,7 +89,7 @@ const Stake = ({ notifyUser(tx, refresh); } catch (error) { console.log(error); - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } setBtnDisabled(false); }; @@ -99,7 +101,7 @@ const Stake = ({ notifyUser(tx, refresh); } catch (error) { console.log(error); - errorNotification("Transaction rejected"); + errorNotification(t("errors.tran-rejected")); } setBtnDisabled(false); }; diff --git a/src/components/Vault/Mint.tsx b/src/components/Vault/Mint.tsx index bd079a2..8fdeeee 100644 --- a/src/components/Vault/Mint.tsx +++ b/src/components/Vault/Mint.tsx @@ -1361,7 +1361,9 @@ const Mint = ({ address, t }: props) => { - Add {selectedVault} + + {t("vault.collateral.add", { collateral: selectedVault })} + {t("max")} @@ -1383,7 +1385,7 @@ const Mint = ({ address, t }: props) => { onClick={addCollateral} disabled={btnDisabled} > - Add + {t("add")} @@ -1399,7 +1401,9 @@ const Mint = ({ address, t }: props) => { - Remove {selectedVault} + + {t("vault.collateral.remove", { collateral: selectedVault })} + {t("max-safe")} @@ -1421,7 +1425,7 @@ const Mint = ({ address, t }: props) => { onClick={removeCollateral} disabled={btnDisabled} > - Remove + {t("remove")} @@ -1492,7 +1496,7 @@ const Mint = ({ address, t }: props) => { onClick={mintTCAP} disabled={btnDisabled} > - Mint + {t("mint")} @@ -1530,7 +1534,7 @@ const Mint = ({ address, t }: props) => { onClick={burnTCAP} disabled={btnDisabled} > - Burn + {t("burn")} diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index ad970db..c35b58a 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -7,6 +7,7 @@ import Modal from "react-bootstrap/esm/Modal"; import NumberFormat from "react-number-format"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; +import { useTranslation } from "react-i18next"; import "../../../styles/modal.scss"; import NetworkContext from "../../../state/NetworkContext"; import SignerContext from "../../../state/SignerContext"; @@ -32,6 +33,7 @@ type props = { }; const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) => { + const { t } = useTranslation(); const currentNetwork = useContext(NetworkContext); const signer = useContext(SignerContext); const oracles = useContext(OracleContext); @@ -209,13 +211,13 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = errorNotification("Burn fee less than required."); } } else { - errorNotification("Not enough TCAP balance."); + errorNotification(t("errors.no-tcap")); } } else { - errorNotification("Tcap amount is less than required."); + errorNotification(t("errors.less-tcap")); } } else { - errorNotification("Field can't be empty"); + errorNotification(t("errors.empty")); } setCanLiquidate(true); } @@ -235,20 +237,20 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = const rewardHelp = () => ( - Collateral amount in USD you are getting for liquidating the vault. + {t("monitoring.reward-info")} ); const tcapAmountHelp = () => ( - Amount of TCAP in USD you need to provide to liquidate vault. + {t("monitoring.tcap-amount-info")} ); const netRewardHelp = () => ( - Actual profit in USD you earn after liquidation:
- Net Reward = Reward - TCAP Amount - Burn Fee. + {t("monitoring.net-reward-info1")}:
+ {t("monitoring.net-reward-info2")}
); @@ -279,14 +281,16 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = }} > - Liquidate Vault + + {t("monitoring.liquidate-vault")} +
- Reward + {t("monitoring.reward")} {helpToolTip(0)} - Required TCAP + {t("required-tcap")} {helpToolTip(1)} Burn Fee - Net Reward + {t("monitoring.net-reward")} {helpToolTip(3)}
- Status + {t("status")} - Empty: There is not collateral on the vault.{" "} -
- Ready: Vault has collateral and it is ready to - mint TCAP.
- Active: Vault is minting TCAP.
- Liquidation: Ratio is less than min - required.
+ Empty: {t("monitoring.empty-info")}
+ Ready: {t("monitoring.ready-info")}
+ Active: {t("monitoring.active-info")}
+ Liquidation:{" "} + {t("monitoring.liquidation-info")}
} > @@ -197,35 +197,35 @@ export const Vaults = ({
- Collateral + {t("collateral")} - Collateral (USD) + {t("collateral")} (USD)
- Debt + {t("debt")}
Debt (USD){t("debt")} (USD) - Ratio + {t("monitoring.ratio")} - Net Reward + {t("monitoring.net-reward")} diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 74d0a62..525b62e 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -7,6 +7,7 @@ import Dropdown from "react-bootstrap/Dropdown"; import Row from "react-bootstrap/esm/Row"; import ToggleButton from "react-bootstrap/esm/ToggleButton"; import Spinner from "react-bootstrap/Spinner"; +import { useTranslation } from "react-i18next"; import "../../../styles/vault-monitoring.scss"; import { useQuery, gql } from "@apollo/client"; import { useLocation } from "react-router-dom"; @@ -26,6 +27,7 @@ import { toUSD, validOracles, validVaults, + validHardVaults, } from "../../../utils/utils"; import { Vaults } from "./Vaults"; import { VaultPagination } from "./Pagination"; @@ -68,6 +70,7 @@ type liqVaultsTempType = { const showAllVaults = true; export const Monitoring = () => { + const { t } = useTranslation(); const currentNetwork = useContext(NetworkContext); const oracles = useContext(OraclesContext); const vaults = useContext(vaultsContext); @@ -92,8 +95,8 @@ export const Monitoring = () => { const [vaultMode, setVaultMode] = useState("all"); const [renderTable, setRenderTable] = useState(false); const radios = [ - { name: "All Vaults", value: "1" }, - { name: "My Vaults", value: "2" }, + { name: t("all-vaults"), value: "1" }, + { name: t("my-vaults"), value: "2" }, ]; const viewsList = [ { key: "5", name: "5" }, @@ -279,7 +282,13 @@ export const Monitoring = () => { }; const loadRatios = async () => { - if (signer && vaults && validVaults(currentNetwork.chainId || 1, vaults)) { + if ( + signer && + vaults && + hardVaults && + validVaults(currentNetwork.chainId || 1, vaults) && + validHardVaults(currentNetwork.chainId || 1, hardVaults) + ) { const daiRatioCall = await vaults.daiVaultRead?.ratio(); const ethcalls = [daiRatioCall]; @@ -324,7 +333,6 @@ export const Monitoring = () => { let hardEthRatio = 0; let hardDaiRatio = 0; let hardUsdcRatio = 0; - if (isInLayer1(currentNetwork.chainId)) { // @ts-ignore [daiRatio, ethRatio, aaveRatio, linkRatio, hardEthRatio, hardDaiRatio, hardUsdcRatio] = @@ -850,29 +858,29 @@ export const Monitoring = () => { -
Totals
+
{t("totals")}
APR
+ + <> { switch (symbol) { case "ETH": if (isHardVault) { - minRatio = vaultsRatio?.hardEthRatio || 1100; + minRatio = vaultsRatio?.hardEthRatio || 100; } else { minRatio = vaultsRatio?.ethRatio || 200; } From d124f655e4e00578c2205e348ce1dbfd6246d6b2 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 24 May 2022 00:08:37 -0600 Subject: [PATCH 116/278] fixe usd tcap balance when is very low --- src/components/Welcome/Summary.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/Welcome/Summary.tsx b/src/components/Welcome/Summary.tsx index c87431c..b90638b 100644 --- a/src/components/Welcome/Summary.tsx +++ b/src/components/Welcome/Summary.tsx @@ -109,8 +109,11 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { const tcapString = ethers.utils.formatEther(currentTcapBalance); setTcapBalance(tcapString); const tcapUSD = parseFloat(tcapString) * parseFloat(tPrice); - setTcapUSDBalance(tcapUSD.toString()); - + if (tcapUSD < 0.0001) { + setTcapUSDBalance("0.0"); + } else { + setTcapUSDBalance(tcapUSD.toString()); + } if (isInLayer1(currentNetwork.chainId)) { const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(signerAddress); // @ts-ignore From 495000049f806d6b21ea18b224181295de76f70b Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 24 May 2022 22:40:03 -0600 Subject: [PATCH 117/278] adding APR on univ3 rewards --- src/components/Farm/UniV3Rewards/Apr.tsx | 105 ++++++++++++ src/components/Farm/UniV3Rewards/Rewards.tsx | 159 ++++++++++--------- src/styles/farm.scss | 17 +- src/utils/univ3.tsx | 2 +- 4 files changed, 205 insertions(+), 78 deletions(-) create mode 100644 src/components/Farm/UniV3Rewards/Apr.tsx diff --git a/src/components/Farm/UniV3Rewards/Apr.tsx b/src/components/Farm/UniV3Rewards/Apr.tsx new file mode 100644 index 0000000..57dcc0b --- /dev/null +++ b/src/components/Farm/UniV3Rewards/Apr.tsx @@ -0,0 +1,105 @@ +import React, { useContext, useState } from "react"; +import { useQuery, gql } from "@apollo/client"; +import { ethers } from "ethers"; +import { Contract } from "ethers-multicall"; +import NumberFormat from "react-number-format"; +import SignerContext from "../../../state/SignerContext"; +import OraclesContext from "../../../state/OraclesContext"; +import TokensContext from "../../../state/TokensContext"; +import { getPriceInUSDFromPair } from "../../../utils/utils"; +import { computeIncentiveId } from "../../../utils/univ3"; +import { IncentiveType } from "./types"; + +type props = { + incentive: IncentiveType; + stakerContractRead: Contract | undefined; +}; + +const Apr = ({ incentive, stakerContractRead }: props) => { + const signer = useContext(SignerContext); + const oracles = useContext(OraclesContext); + const tokens = useContext(TokensContext); + const [apr, setApr] = useState(0); + + const TVL = gql` + query aprs { + apr(id: "1") { + id + totalAmount0 + totalAmount1 + } + } + `; + + const calculateApr = async (aprData: any) => { + if ( + signer.signer && + oracles.wethOracleRead && + oracles.tcapOracleRead && + tokens.ctxPoolTokenRead && + stakerContractRead && + aprData + ) { + const incentiveId = computeIncentiveId(incentive); + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const tcapOraclePriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); + const incentivesCall = await stakerContractRead?.incentives(incentiveId); + + // @ts-ignore + const [wethOraclePrice, tcapOraclePrice, reservesCtxPool, incentivesInfo] = + await signer.ethcallProvider?.all([ + wethOraclePriceCall, + tcapOraclePriceCall, + reservesCtxPoolCall, + incentivesCall, + ]); + + const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + const tcapPrice = ethers.utils.formatEther(tcapOraclePrice); + const currentPriceCTX = await getPriceInUSDFromPair( + reservesCtxPool[0], + reservesCtxPool[1], + parseFloat(currentPriceETH) + ); + const rewardUnclaimed = ethers.utils.formatEther(incentivesInfo[0]); + const tvlUsd = + parseFloat(tcapPrice) * aprData.totalAmount0 + + parseFloat(currentPriceETH) * aprData.totalAmount1; + const remainingSeconds = incentive.endTime - Date.now() / 1000; + const remainingDays = remainingSeconds / (3600 * 24); + const rewardRate = parseFloat(rewardUnclaimed) / remainingDays; + const ONE_YEAR = 365; + const aprNumerator = rewardRate * currentPriceCTX * ONE_YEAR * 100; + const aprValue = aprNumerator / tvlUsd; + setApr(aprValue); + } + }; + + const { loading, data, error } = useQuery(TVL, { + fetchPolicy: "no-cache", + pollInterval: 80000, + notifyOnNetworkStatusChange: true, + onError: () => { + console.log(error); + }, + onCompleted: () => { + if (signer.signer) { + calculateApr(data.apr); + } + }, + }); + + return ( + + ); +}; + +export default Apr; diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 966e3c3..16aa938 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -29,6 +29,7 @@ import { import { IncentiveType, PositionType, positionDefaultValues, StakeStatus } from "./types"; import ClaimReward from "./ClaimReward"; import Stake from "./Stake"; +import Apr from "./Apr"; type props = { ownerAddress: string; @@ -96,6 +97,7 @@ const Rewards = ({ ethTcapPool = UNIV3.mainnet.tcapPool; break; } + // console.log(computeIncentiveId(ethTcapPool.incentives[0])); setEthTcapIncentive(ethTcapPool.incentives); const ethPositions = new Array(); @@ -362,87 +364,94 @@ const Rewards = ({ - Current Reward - - Amount of CTX that it's been earn while the LP token is staked. You must unstake - the LP token in order to claim the reward. - - } - > - - +
+
Current Reward
+
+ + Amount of CTX that it's been earn while the LP token is staked. You must + unstake the LP token in order to claim the reward. + + } + > + + +
+
APR
- - - -
-
- Min: {numberFormatStr(position.tickUpperPrice1.toString(), 4, 4)} -
- -
- Max: {numberFormatStr(position.tickLowerPrice1.toString(), 4, 4)} -
-
-
- TCAP/WETH Pool - Uniswap + {ethTcapPositions.sort(sortPositions).map((position, index) => ( +
+ + + +
+
+ Min: {numberFormatStr(position.tickUpperPrice1.toString(), 4, 4)}
-
-
- {position.priceInRange ? ( - - {position.status === StakeStatus.not_approved - ? "Pending" - : capitalize(position.status)} - - ) : ( - Out of range - )} + +
+ Max: {numberFormatStr(position.tickLowerPrice1.toString(), 4, 4)}
-
- {" "} - CTX - - <> - refresh()} - /> - - -
+
+ {position.priceInRange ? ( + + {position.status === StakeStatus.not_approved + ? "Pending" + : capitalize(position.status)} + + ) : ( + Out of range + )} +
+
+ {" "} + CTX + + + + + + <> + refresh()} + /> + + +
diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 43af5f7..6424347 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -298,6 +298,12 @@ } } &.univ3 { + .card-header { + padding-left: 0rem; + } + .card-body { + padding: 1rem 0rem; + } thead { .btn { margin-top: 0rem; @@ -334,9 +340,16 @@ width: 6rem; margin-right: 1rem; padding: 0.1rem 1rem; + } + .current-rewards { + display: flex; + flex-direction: row; + align-items: center; } - .card-body { - padding: 1rem 0rem; + .fire { + .number { + font-family: "Nineteen Ninety Seven"; + } } .rewards { display: flex; diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx index 201b512..35a80b8 100644 --- a/src/utils/univ3.tsx +++ b/src/utils/univ3.tsx @@ -36,7 +36,7 @@ export const UNIV3 = { }; export const GRAPHQL_UNIV3_ENDPOINT = { - mainnet: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-graph", + mainnet: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-univ3", rinkeby: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-rinkeby-two", }; From 91572a008c50c6e87ed9f84b1feb4340aa98e88b Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 25 May 2022 16:37:58 -0600 Subject: [PATCH 118/278] added univ3 rewards apr --- src/components/Farm/UniV3Rewards/Apr.tsx | 3 +- src/components/Farm/UniV3Rewards/Rewards.tsx | 58 +++++++++++--------- src/styles/farm.scss | 56 ++++++++++++++----- 3 files changed, 75 insertions(+), 42 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/Apr.tsx b/src/components/Farm/UniV3Rewards/Apr.tsx index 57dcc0b..d696587 100644 --- a/src/components/Farm/UniV3Rewards/Apr.tsx +++ b/src/components/Farm/UniV3Rewards/Apr.tsx @@ -66,6 +66,7 @@ const Apr = ({ incentive, stakerContractRead }: props) => { const tvlUsd = parseFloat(tcapPrice) * aprData.totalAmount0 + parseFloat(currentPriceETH) * aprData.totalAmount1; + console.log(tvlUsd); const remainingSeconds = incentive.endTime - Date.now() / 1000; const remainingDays = remainingSeconds / (3600 * 24); const rewardRate = parseFloat(rewardUnclaimed) / remainingDays; @@ -78,7 +79,7 @@ const Apr = ({ incentive, stakerContractRead }: props) => { const { loading, data, error } = useQuery(TVL, { fetchPolicy: "no-cache", - pollInterval: 80000, + pollInterval: 400000, notifyOnNetworkStatusChange: true, onError: () => { console.log(error); diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 16aa938..b1a17e4 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -175,7 +175,7 @@ const Rewards = ({ const { loading, data, error, refetch } = useQuery(OWNER_POSITIONS, { fetchPolicy: "no-cache", - pollInterval: 60000, + pollInterval: 90000, notifyOnNetworkStatusChange: true, variables: { owner: ownerAddress.toLowerCase() }, onError: () => { @@ -271,16 +271,22 @@ const Rewards = ({ <>
-
Fee tier:
- +
+
Fee tier:
+ +
+
+
APR:
+ +
@@ -383,7 +389,6 @@ const Rewards = ({
-
APR
- - - - <>
-
- - + - diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 6424347..0d0422b 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -340,7 +340,12 @@ width: 6rem; margin-right: 1rem; padding: 0.1rem 1rem; - } + } + .number { + font-size: 1rem; + color: $white; + text-shadow: 0 0 4px #f195f9,0 0 10px #fff,0 0 20px #e440f2,0 -10px 40px #b626c4; + } .current-rewards { display: flex; flex-direction: row; @@ -351,28 +356,30 @@ font-family: "Nineteen Ninety Seven"; } } + h6 { + color: $white; + margin-top: 3px; + margin-right: 15px; + font-size: 1.1rem; + } .rewards { display: flex; justify-content: space-between; - margin-bottom: 1.3rem; - h6 { - color: $white; - margin-top: 3px; - margin-right: 20px; - font-size: 1.1rem; - } - .number { - color: $white; - text-shadow: 0 0 4px #f195f9,0 0 10px #fff,0 0 20px #e440f2,0 -10px 40px #b626c4; - } - &-tier { + margin-bottom: 1rem; + &-item { display: flex; - flex-direction: row; + padding-right: 2.2rem; align-items: center; h6 { - margin-bottom: 0.2rem; + margin: 0rem; + margin-right: 0.4rem; } } + &-tier { + display: flex; + flex-direction: row; + align-items: center; + } &-total { display: flex; flex-direction: row; @@ -457,7 +464,26 @@ } .lp-info { display: flex; + flex-direction: column; padding: 15px; + .row1 { + display: flex; + flex-direction: row; + } + .row2 { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + h6 { + font-size: 0.9rem; + margin: 0rem; + } + .number { + font-size: 0.85rem; + margin-left: 0.2rem; + } + } } .icons { display: flex; From 1723c3025268f69c41a30608fb7709f3c68cb73c Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 25 May 2022 18:43:14 -0600 Subject: [PATCH 119/278] finished checking apr --- src/components/Farm/UniV3Rewards/Apr.tsx | 1 - src/components/Farm/UniV3Rewards/index.tsx | 24 ++++++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/Apr.tsx b/src/components/Farm/UniV3Rewards/Apr.tsx index d696587..f188585 100644 --- a/src/components/Farm/UniV3Rewards/Apr.tsx +++ b/src/components/Farm/UniV3Rewards/Apr.tsx @@ -66,7 +66,6 @@ const Apr = ({ incentive, stakerContractRead }: props) => { const tvlUsd = parseFloat(tcapPrice) * aprData.totalAmount0 + parseFloat(currentPriceETH) * aprData.totalAmount1; - console.log(tvlUsd); const remainingSeconds = incentive.endTime - Date.now() / 1000; const remainingDays = remainingSeconds / (3600 * 24); const rewardRate = parseFloat(rewardUnclaimed) / remainingDays; diff --git a/src/components/Farm/UniV3Rewards/index.tsx b/src/components/Farm/UniV3Rewards/index.tsx index 0a3489b..b1b569e 100644 --- a/src/components/Farm/UniV3Rewards/index.tsx +++ b/src/components/Farm/UniV3Rewards/index.tsx @@ -83,17 +83,19 @@ const UniV3Rewards = ({ signer }: props) => { }, [currentNetwork.chainId]); return ( - - - +
+ + + +
); }; From 239c6221287fa7595d3758367ce7edd627565b11 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 25 May 2022 18:46:03 -0600 Subject: [PATCH 120/278] fixed apr design error --- src/components/Farm/UniV3Rewards/index.tsx | 24 ++++++++++------------ 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/index.tsx b/src/components/Farm/UniV3Rewards/index.tsx index b1b569e..0a3489b 100644 --- a/src/components/Farm/UniV3Rewards/index.tsx +++ b/src/components/Farm/UniV3Rewards/index.tsx @@ -83,19 +83,17 @@ const UniV3Rewards = ({ signer }: props) => { }, [currentNetwork.chainId]); return ( -
- - - -
+ + + ); }; From 39da027b5eba82e902a6676f137acc3ea517237b Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 30 May 2022 14:38:10 -0600 Subject: [PATCH 121/278] show apr when wallet not connected --- src/components/Farm/UniV3Rewards/Apr.tsx | 7 ++++--- src/components/Farm/UniV3Rewards/Rewards.tsx | 22 +++++++++----------- src/components/Farm/UniV3Rewards/index.tsx | 8 ++++--- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/Apr.tsx b/src/components/Farm/UniV3Rewards/Apr.tsx index f188585..c229583 100644 --- a/src/components/Farm/UniV3Rewards/Apr.tsx +++ b/src/components/Farm/UniV3Rewards/Apr.tsx @@ -33,12 +33,13 @@ const Apr = ({ incentive, stakerContractRead }: props) => { const calculateApr = async (aprData: any) => { if ( - signer.signer && + signer && oracles.wethOracleRead && oracles.tcapOracleRead && tokens.ctxPoolTokenRead && stakerContractRead && - aprData + aprData && + incentive ) { const incentiveId = computeIncentiveId(incentive); const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); @@ -84,7 +85,7 @@ const Apr = ({ incentive, stakerContractRead }: props) => { console.log(error); }, onCompleted: () => { - if (signer.signer) { + if (signer) { calculateApr(data.apr); } }, diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index b1a17e4..dc74bfb 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -45,10 +45,6 @@ type btnProps = { position: PositionType; }; -type infoMsgProps = { - message: string; -}; - const Rewards = ({ ownerAddress, signer, @@ -87,7 +83,7 @@ const Rewards = ({ } `; - const loadData = async (positionsData: any) => { + const confIncetive = (): any => { let ethTcapPool = UNIV3.mainnet.tcapPool; switch (currentNetwork.chainId) { case NETWORKS.rinkeby.chainId: @@ -99,6 +95,12 @@ const Rewards = ({ } // console.log(computeIncentiveId(ethTcapPool.incentives[0])); setEthTcapIncentive(ethTcapPool.incentives); + + return ethTcapPool; + }; + + const loadData = async (positionsData: any) => { + const ethTcapPool = confIncetive(); const ethPositions = new Array(); // Read pool price @@ -185,6 +187,8 @@ const Rewards = ({ if (signer.signer && ownerAddress !== "") { loadData(data); setFirstLoad(false); + } else { + confIncetive(); } }, }); @@ -259,12 +263,6 @@ const Rewards = ({ ); }; - const InfoMessage = ({ message }: infoMsgProps) => ( -
-
{message}
-
- ); - const sortPositions = (p1: PositionType, p2: PositionType) => p1.lpTokenId - p2.lpTokenId; const RenderRewards = () => ( @@ -501,7 +499,7 @@ const Rewards = ({ )} ) : ( - + )} { setApolloClient(clientOracle(GRAPHQL_UNIV3_ENDPOINT.mainnet)); break; } - if (signer.signer) { + if (signer) { const stakerRead = new Contract(UNIV3.stakerAddress, UniswapV3Staker); const staker = new ethers.Contract(UNIV3.stakerAddress, UniswapV3Staker, signer.signer); const nfpmRead = new Contract( @@ -74,8 +74,10 @@ const UniV3Rewards = ({ signer }: props) => { setNfpmContract(nfpm); setNfpmContractRead(nfpmRead); setPoolContractRead(poolRead); - const oAddress = await signer.signer.getAddress(); - setOwnerAddress(oAddress); + if (signer.signer) { + const oAddress = await signer.signer.getAddress(); + setOwnerAddress(oAddress); + } } }; load(); From 8371267cda6fc513c8e592c0f4d56d0d59b4d205 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 31 May 2022 20:50:38 -0600 Subject: [PATCH 122/278] added vaultId and filter ratio on monitoring tool --- src/components/Vault/Monitoring/Vaults.tsx | 2 + src/components/Vault/Monitoring/index.tsx | 132 +++++++++++++++++++-- src/styles/vault-monitoring.scss | 81 ++++++++++--- 3 files changed, 193 insertions(+), 22 deletions(-) diff --git a/src/components/Vault/Monitoring/Vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx index 2b32884..5349658 100644 --- a/src/components/Vault/Monitoring/Vaults.tsx +++ b/src/components/Vault/Monitoring/Vaults.tsx @@ -175,6 +175,7 @@ export const Vaults = ({ +
-
View:
+
View
handleItemsViewChange(eventKey || "15")}> {
-
Collateral:
+
Collateral
handleTokenChange(eventKey || "ALL")} @@ -931,7 +1010,7 @@ export const Monitoring = () => {
-
Status:
+
Status
handleStatusChange(eventKey || "ALL")}> {
{isInLayer1(currentNetwork.chainId) && (
-
Mode:
+
Mode
handleModeChange(eventKey || "ALL")} @@ -977,6 +1056,45 @@ export const Monitoring = () => {
)} + {currentStatus !== VAULT_STATUS.empty && currentStatus !== VAULT_STATUS.ready && ( +
+
Ratio Range
+ + +
+ + {currentMinRatio} {currentMaxRatio} + +
+
+ +
+ + + +
+ +
+
+
+ )} {currentAddress !== "" && (
@@ -999,7 +1117,7 @@ export const Monitoring = () => { )}
- {loading || !pricesUpdated ? ( + {loading || filteringRatios || !pricesUpdated ? ( ) : ( Date: Thu, 2 Jun 2022 17:53:50 -0600 Subject: [PATCH 123/278] link to uni position added --- src/components/Farm/UniV3Rewards/Rewards.tsx | 24 ++++++++++++++++---- src/components/Vault/Monitoring/Vaults.tsx | 8 ------- src/styles/farm.scss | 9 ++++++++ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index dc74bfb..43ad113 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -281,6 +281,17 @@ const Rewards = ({ decimalScale={4} />
+
+
TCAP/WETH Price:
+ +
APR:
@@ -332,11 +343,6 @@ const Rewards = ({ overlay={ Position Min and Max price represents TCAP per WETH.
- Current price is{" "} - - {numberFormatStr(cumulativePrice.toString(), 4, 4)} - {" "} - TCAP per WETH
} > @@ -437,6 +443,14 @@ const Rewards = ({
@@ -377,7 +381,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = onClick={liquidate} disabled={!canLiquidate} > - {canLiquidate ? t("monitoring.liquidate-vault") : t("monitoring.liquidating")} + <>{canLiquidate ? t("monitoring.liquidate-vault") : t("monitoring.liquidating")} diff --git a/src/components/Vault/Monitoring/Vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx index b552495..bde486d 100644 --- a/src/components/Vault/Monitoring/Vaults.tsx +++ b/src/components/Vault/Monitoring/Vaults.tsx @@ -171,18 +171,20 @@ export const Vaults = ({ - + {currentStatus === "liquidation" && ( -
{t("vaults")}
+
+ <>{t("vaults")} +
{vaultsTotals.vaults}-
{t("collateral")} (USD)
+
+ <>{t("collateral")} (USD) +
${numberFormatStr(vaultsTotals.collateralUSD, 2, 2)}
-
{t("debt")}
+
+ <>{t("debt")} +
{numberFormatStr(vaultsTotals.debt, 4, 4)}-
{t("debt")} (USD)
+
+ <>{t("debt")} (USD) +
${numberFormatStr(vaultsTotals.debtUSD, 2, 2)} @@ -968,7 +981,9 @@ export const Monitoring = () => {
-
{t("view")}:
+
+ <>{t("view")}: +
handleItemsViewChange(eventKey || "15")}> {
-
{t("collateral")}:
+
+ <>{t("collateral")}: +
handleTokenChange(eventKey || "ALL")} @@ -1038,7 +1055,9 @@ export const Monitoring = () => {
{isInLayer1(currentNetwork.chainId) && (
-
{t("mode")}:
+
+ <>{t("mode")}: +
handleModeChange(eventKey || "ALL")} diff --git a/src/components/Vault/Vault.tsx b/src/components/Vault/Vault.tsx index 1f7b314..340f881 100644 --- a/src/components/Vault/Vault.tsx +++ b/src/components/Vault/Vault.tsx @@ -38,18 +38,24 @@ export const Vault = () => { return (
-

{t("vault.title1")}

+

+ <>{t("vault.title1")} +

{!signer.signer ? (
-
{t("connect")}
-

{t("vault.no-connected")}

+
+ <>{t("connect")} +
+

+ <>{t("vault.no-connected")} +

) : ( diff --git a/src/components/Warnings.tsx b/src/components/Warnings.tsx index 2f12f8e..816530c 100644 --- a/src/components/Warnings.tsx +++ b/src/components/Warnings.tsx @@ -18,7 +18,9 @@ const Warnings = () => { }} dismissible > - {t("vault-warning")} + + <>{t("vault-warning")} + )} diff --git a/src/components/Welcome/Protocol.tsx b/src/components/Welcome/Protocol.tsx index eadc131..f959f75 100644 --- a/src/components/Welcome/Protocol.tsx +++ b/src/components/Welcome/Protocol.tsx @@ -311,7 +311,9 @@ const Protocol = ({ data }: props) => { return ( -

{t("welcome.summary.title")}

+

+ <>{t("welcome.summary.title")} +

{loading ? ( @@ -323,7 +325,9 @@ const Protocol = ({ data }: props) => {
-
{t("welcome.summary.staked-usd")}
+
+ <>{t("welcome.summary.staked-usd")} +
{
-
{t("welcome.summary.total-supply")}
+
+ <>{t("welcome.summary.total-supply")} +
{
-
{t("welcome.summary.staked-eth")}
+
+ <>{t("welcome.summary.staked-eth")} +
{
-
{t("welcome.summary.staked-dai")}
+
+ <>{t("welcome.summary.staked-dai")} +
{
-
{t("welcome.summary.staked-aave")}
+
+ <>{t("welcome.summary.staked-aave")} +
{
-
{t("welcome.summary.staked-link")}
+
+ <>{t("welcome.summary.staked-link")} +
{
-

{t("welcome.summary.staked-uni")}

+

+ <>{t("welcome.summary.staked-uni")} +

{
-

{t("welcome.summary.staked-snx")}

+

+ <>{t("welcome.summary.staked-snx")} +

{
-
{t("welcome.summary.staked-matic")}
+
+ <>{t("welcome.summary.staked-matic")} +
{
-
{t("welcome.summary.staked-wbtc")}
+
+ <>{t("welcome.summary.staked-wbtc")} +
{
-
{t("welcome.summary.staked-usdc")}
+
+ <>{t("welcome.summary.staked-usdc")} +
{ {t("welcome.tcap-info")}} + overlay={ + + <>{t("welcome.tcap-info")} + + } >
-

{t("welcome.tcap")}:

+

+ <>{t("welcome.tcap")}: +

@@ -173,7 +179,9 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { decimalScale={2} />

-

{t("welcome.tcap-price")}:

+

+ <>{t("welcome.tcap-price")}: +

{isInLayer1(currentNetwork.chainId) && (
@@ -187,7 +195,9 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { decimalScale={2} />
-

{t("welcome.ctx-price")}:

+

+ <>{t("welcome.ctx-price")}: +

)}
{
-

{t("welcome.title1")}

+

+ <>{t("welcome.title1")} +

-
{t("welcome.tcap-balance")}
+
+ <>{t("welcome.tcap-balance")} +
@@ -241,7 +255,9 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { {isInLayer1(currentNetwork.chainId) && (
-
{t("welcome.ctx-balance")}
+
+ <>{t("welcome.ctx-balance")} +
@@ -275,11 +291,15 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { ) : ( -

{t("welcome.title3")}

+

+ <>{t("welcome.title3")} +

-

{t("welcome.subtitle3")}

+

+ <>{t("welcome.subtitle3")} +

@@ -298,10 +318,14 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { )} -

{t("welcome.title2")}

+

+ <>{t("welcome.title2")} +

-

{t("welcome.subtitle2")}

+

+ <>{t("welcome.subtitle2")} +

@@ -335,7 +359,7 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { }} disabled={address === ""} > - {t("my-vaults")} + <>{t("my-vaults")} diff --git a/src/components/modals/Stake.tsx b/src/components/modals/Stake.tsx index 41f7a6c..839b471 100644 --- a/src/components/modals/Stake.tsx +++ b/src/components/modals/Stake.tsx @@ -106,18 +106,24 @@ export const Stake = ({ show, poolTitle, poolToken, pool, balance, onHide, refre > - {t("stake")} {poolTitle} + <> + {t("stake")} {poolTitle} +

- {t("balance2")}: {balance} + <> + {t("balance2")}: {balance} +

{isApproved ? ( <> - {t("stake2")} + + <>{t("stake2")} + MAX @@ -141,17 +147,19 @@ export const Stake = ({ show, poolTitle, poolToken, pool, balance, onHide, refre {isApproved ? ( <> ) : ( <> )}{" "} - {t("tokens")} + <>{t("tokens")} ); diff --git a/src/index.tsx b/src/index.tsx index 5807be5..8b1081d 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,14 +1,16 @@ import React from "react"; -import ReactDOM from "react-dom"; +import { createRoot } from "react-dom/client"; import { BrowserRouter as Router } from "react-router-dom"; import "./styles/app.scss"; import App from "./App"; -ReactDOM.render( +const container = document.getElementById("root"); +// @ts-ignore +const root = createRoot(container); +root.render( - , - document.getElementById("root") + ); diff --git a/yarn.lock b/yarn.lock index 3c19775..5445ca8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1145,13 +1145,20 @@ core-js-pure "^3.25.1" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.18.3", "@babel/runtime@^7.6.2": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" + integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== + dependencies: + regenerator-runtime "^0.13.10" + "@babel/template@^7.10.4", "@babel/template@^7.18.10", "@babel/template@^7.3.3": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" @@ -2006,7 +2013,7 @@ schema-utils "^2.6.5" source-map "^0.7.3" -"@popperjs/core@^2.11.6": +"@popperjs/core@^2.11.5": version "2.11.6" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== @@ -2049,23 +2056,40 @@ penpal "3.0.7" pocket-js-core "0.0.3" +"@react-aria/ssr@^3.2.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.3.0.tgz#25e81daf0c7a270a4a891159d8d984578e4512d8" + integrity sha512-yNqUDuOVZIUGP81R87BJVi/ZUZp/nYOBXbPsRe7oltJOfErQZD+UezMpw4vM2KRz18cURffvmC8tJ6JTeyDtaQ== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-hook/media-query@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@react-hook/media-query/-/media-query-1.1.1.tgz#7fc4e52591784a39be924b62b4270ae3e18ec578" integrity sha512-VM14wDOX5CW5Dn6b2lTiMd79BFMTut9AZj2+vIRT3LCKgMCYmdqruTtzDPSnIVDQdtxdPgtOzvU9oK20LopuOw== -"@restart/context@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02" - integrity sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q== - -"@restart/hooks@^0.4.7": +"@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7": version "0.4.7" resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.7.tgz#d79ca6472c01ce04389fc73d4a79af1b5e33cd39" integrity sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A== dependencies: dequal "^2.0.2" +"@restart/ui@^1.3.1": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.4.0.tgz#8333294fefb045f58852d5bb34367c3323e2edb3" + integrity sha512-5dDj5uDzUgK1iijWPRg6AnxjkHM04XhTQDJirM1h/8tIc7KyLtF9YyjcCpNEn259hPMXswpkfXKNgiag0skPFg== + dependencies: + "@babel/runtime" "^7.18.3" + "@popperjs/core" "^2.11.5" + "@react-aria/ssr" "^3.2.0" + "@restart/hooks" "^0.4.7" + "@types/warning" "^3.0.0" + dequal "^2.0.2" + dom-helpers "^5.2.0" + uncontrollable "^7.2.1" + warning "^4.0.3" + "@rollup/plugin-node-resolve@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" @@ -2368,11 +2392,6 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== -"@types/invariant@^2.2.33": - version "2.2.35" - resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be" - integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg== - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -2460,7 +2479,7 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== -"@types/prop-types@*", "@types/prop-types@^15.7.3": +"@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== @@ -2477,12 +2496,12 @@ dependencies: "@types/react" "*" -"@types/react-dom@^16.9.8": - version "16.9.16" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.16.tgz#c591f2ed1c6f32e9759dfa6eb4abfd8041f29e39" - integrity sha512-Oqc0RY4fggGA3ltEgyPLc3IV9T73IGoWjkONbsyJ3ZBn+UPPCYpU2ec0i3cEbJuEdZtkqcCF2l1zf2pBdgUGSg== +"@types/react-dom@^18.0.8": + version "18.0.8" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.8.tgz#d2606d855186cd42cc1b11e63a71c39525441685" + integrity sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw== dependencies: - "@types/react" "^16" + "@types/react" "*" "@types/react-router-dom@^5.1.6": version "5.3.3" @@ -2501,14 +2520,14 @@ "@types/history" "^4.7.11" "@types/react" "*" -"@types/react-transition-group@^4.4.1": +"@types/react-transition-group@^4.4.4": version "4.4.5" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@>=16.14.8", "@types/react@>=16.9.11": +"@types/react@*", "@types/react@>=16.9.11": version "18.0.21" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.21.tgz#b8209e9626bb00a34c76f55482697edd2b43cc67" integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA== @@ -2517,10 +2536,10 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@^16", "@types/react@^16.9.53": - version "16.14.32" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.32.tgz#d4e4fe5ece3c27fcb4608b1f4a614f7dec881392" - integrity sha512-hvEy4vGVADbtj/U6+CA5SRC5QFIjdxD7JslAie8EuAYZwhYY9bgforpXNyF1VFzhnkEOesDy1278t1wdjN74cw== +"@types/react@^18.0.24": + version "18.0.24" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.24.tgz#2f79ed5b27f08d05107aab45c17919754cc44c20" + integrity sha512-wRJWT6ouziGUy+9uX0aW4YOJxAY0bG6/AOk5AW5QSvZqI7dk6VBIbXvcVgIw/W5Jrl24f77df98GEKTJGOLx7Q== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -12866,26 +12885,21 @@ react-blockies@^1.4.1: dependencies: prop-types "^15.5.10" -react-bootstrap@^1.4.0: - version "1.6.6" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-1.6.6.tgz#3f3b274f8923b9886008a0e61485b5ac9a2b3073" - integrity sha512-pSzYyJT5u4rc8+5myM8Vid2JG52L8AmYSkpznReH/GM4+FhLqEnxUa0+6HRTaGwjdEixQNGchwY+b3xCdYWrDA== +react-bootstrap@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.5.0.tgz#e25e649e37f080d38eeb92ad5b4ed562a1d7de62" + integrity sha512-j/aLR+okzbYk61TM3eDOU1NqOqnUdwyVrF+ojoCRUxPdzc2R0xXvqyRsjSoyRoCo7n82Fs/LWjPCin/QJNdwvA== dependencies: - "@babel/runtime" "^7.14.0" - "@restart/context" "^2.1.4" - "@restart/hooks" "^0.4.7" - "@types/invariant" "^2.2.33" - "@types/prop-types" "^15.7.3" - "@types/react" ">=16.14.8" - "@types/react-transition-group" "^4.4.1" - "@types/warning" "^3.0.0" + "@babel/runtime" "^7.17.2" + "@restart/hooks" "^0.4.6" + "@restart/ui" "^1.3.1" + "@types/react-transition-group" "^4.4.4" classnames "^2.3.1" dom-helpers "^5.2.1" invariant "^2.2.4" - prop-types "^15.7.2" + prop-types "^15.8.1" prop-types-extra "^1.1.0" - react-overlays "^5.1.2" - react-transition-group "^4.4.1" + react-transition-group "^4.4.2" uncontrollable "^7.2.1" warning "^4.0.3" @@ -12929,14 +12943,13 @@ react-dom@^16.8.6: prop-types "^15.6.2" scheduler "^0.19.1" -react-dom@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== +react-dom@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" + scheduler "^0.23.0" react-error-overlay@^6.0.9: version "6.0.11" @@ -12983,20 +12996,6 @@ react-number-format@^4.4.1: dependencies: prop-types "^15.7.2" -react-overlays@^5.1.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.2.1.tgz#49dc007321adb6784e1f212403f0fb37a74ab86b" - integrity sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA== - dependencies: - "@babel/runtime" "^7.13.8" - "@popperjs/core" "^2.11.6" - "@restart/hooks" "^0.4.7" - "@types/warning" "^3.0.0" - dom-helpers "^5.2.0" - prop-types "^15.7.2" - uncontrollable "^7.2.1" - warning "^4.0.3" - react-refresh@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" @@ -13109,7 +13108,7 @@ react-toastify@^6.1.0: prop-types "^15.7.2" react-transition-group "^4.4.1" -react-transition-group@^4.4.1: +react-transition-group@^4.4.1, react-transition-group@^4.4.2: version "4.4.5" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== @@ -13128,13 +13127,12 @@ react@^16.8.6: object-assign "^4.1.1" prop-types "^15.6.2" -react@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== +react@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" read-pkg-up@^1.0.1: version "1.0.1" @@ -13295,6 +13293,11 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerator-runtime@^0.13.10: + version "0.13.10" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" + integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== + regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" @@ -13824,13 +13827,12 @@ scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" schema-utils@^1.0.0: version "1.0.0" From 96afb9e9d2be67eab63edf54f8b5c993e2ae970e Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 2 Nov 2022 18:45:20 -0600 Subject: [PATCH 174/278] unifying mint and monitoring tool --- src/App.tsx | 58 +++-- .../Farm/MintingRewards/Rewards.tsx | 4 +- src/components/Farm/MintingRewards/index.tsx | 4 +- src/components/Farm/UniV3Rewards/Apr.tsx | 10 +- src/components/Farm/UniV3Rewards/Rewards.tsx | 10 +- src/components/Farm/UniV3Rewards/index.tsx | 7 +- src/components/Farm/index.tsx | 26 ++- src/components/Governance/Delegate.tsx | 7 +- src/components/Governance/Delegators.tsx | 7 +- src/components/Governance/ProfileCard.tsx | 7 +- src/components/Governance/StakerStats.tsx | 7 +- src/components/Header.tsx | 11 +- src/components/MushroomNft/Sewagefruit.tsx | 10 +- src/components/Sidebar.tsx | 4 +- src/components/Vault/Mint.tsx | 26 ++- src/components/Vault/Monitoring/Liquidate.tsx | 26 ++- src/components/Vault/Monitoring/index.tsx | 18 +- src/components/Vault/Vault.tsx | 5 +- src/components/Vaults/common.tsx | 87 ++++++++ src/components/Vaults/index.tsx | 23 ++ src/components/Vaults/monitoring.tsx | 208 ++++++++++++++++++ src/components/Vaults/types.tsx | 69 ++++++ src/components/Vaults/usePrices.tsx | 116 ++++++++++ src/components/Vaults/useRatios.tsx | 115 ++++++++++ src/components/Welcome/Protocol.tsx | 13 +- src/components/Welcome/Summary.tsx | 20 +- src/components/Welcome/index.tsx | 4 +- src/components/modals/Delegate.tsx | 3 +- src/components/modals/NewProposal.tsx | 144 ------------ src/components/modals/Stake.tsx | 4 +- src/components/modals/Vote.tsx | 187 ---------------- src/hooks/index.tsx | 19 ++ src/hooks/useGovernance.tsx | 4 +- src/hooks/useHardVaults.tsx | 4 +- src/hooks/useMushroomNft.tsx | 2 +- src/hooks/useNetworks.tsx | 4 +- src/hooks/useOracles.tsx | 4 +- src/hooks/useRewards.tsx | 4 +- src/hooks/useSigner.tsx | 4 +- src/hooks/useTokens.tsx | 4 +- src/hooks/useVaults.tsx | 4 +- src/state/GovernanceContext.tsx | 6 +- src/state/HardVaultsContext.tsx | 6 +- src/state/MushroomNftContext.tsx | 4 +- src/state/NetworkContext.tsx | 6 +- src/state/OraclesContext.tsx | 6 +- src/state/RewardsContext.tsx | 6 +- src/state/SignerContext.tsx | 6 +- src/state/TokensContext.tsx | 6 +- src/state/VaultsContext.tsx | 6 +- src/state/index.tsx | 19 ++ src/utils/utils.tsx | 10 +- 52 files changed, 834 insertions(+), 540 deletions(-) create mode 100644 src/components/Vaults/common.tsx create mode 100644 src/components/Vaults/index.tsx create mode 100644 src/components/Vaults/monitoring.tsx create mode 100644 src/components/Vaults/types.tsx create mode 100644 src/components/Vaults/usePrices.tsx create mode 100644 src/components/Vaults/useRatios.tsx delete mode 100644 src/components/modals/NewProposal.tsx delete mode 100644 src/components/modals/Vote.tsx create mode 100644 src/hooks/index.tsx create mode 100644 src/state/index.tsx diff --git a/src/App.tsx b/src/App.tsx index efc5879..e4ec875 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -17,30 +17,25 @@ import Sidebar from "./components/Sidebar"; import Topbar from "./components/Topbar"; import WelcomeWrapper from "./components/Welcome/index"; import { Vault, Monitoring } from "./components/Vault"; +import Vaults from "./components/Vaults"; import Delegators from "./components/Governance/Delegators"; import MushroomNft from "./components/MushroomNft"; import Loading from "./components/Loading"; import Farm from "./components/Farm"; import Warnings from "./components/Warnings"; -import { useSigner } from "./hooks/useSigner"; -import { useNetworks } from "./hooks/useNetworks"; -import { useVaults } from "./hooks/useVaults"; -import { useHardVaults } from "./hooks/useHardVaults"; -import { useTokens } from "./hooks/useTokens"; -import { useOracles } from "./hooks/useOracles"; -import { useGovernance } from "./hooks/useGovernance"; -import { useRewards } from "./hooks/useRewards"; -import { useMushroomNft } from "./hooks/useMushroomNft"; -import signerContext from "./state/SignerContext"; -import NetworkContext from "./state/NetworkContext"; -import vaultsContext from "./state/VaultsContext"; -import hardVaultsContext from "./state/HardVaultsContext"; -import tokensContext from "./state/TokensContext"; -import oraclesContext from "./state/OraclesContext"; -import governanceContext from "./state/GovernanceContext"; -import rewardsContext from "./state/RewardsContext"; -import mushroomNftContext from "./state/MushroomNftContext"; -import { Web3ModalContext } from "./state/Web3ModalContext"; +import * as hooks from "./hooks"; +import { + governanceContext, + hardVaultsContext, + mushroomNftContext, + networkContext, + oraclesContext, + rewardsContext, + signerContext, + tokensContext, + vaultsContext, + Web3ModalContext, +} from "./state"; import cryptexJson from "./contracts/cryptex.json"; import ERC20 from "./contracts/ERC20.json"; import WETH from "./contracts/WETH.json"; @@ -64,7 +59,7 @@ const clientOracle = (graphqlEndpoint: string) => }); const App = () => { - const signer = useSigner(); + const signer = hooks.useSigner(); const web3Modal = useContext(Web3ModalContext); const [isLoadingContracts, setLoadingContracts] = useState(false); const [invalidNetwork, setInvalidNetwork] = useState(false); @@ -75,15 +70,15 @@ const App = () => { process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.rinkeby ) ); - const networks = useNetworks(); + const networks = hooks.useNetworks(); const [currentSignerAddress, setCurrentSignerAddress] = useState(""); - const vaults = useVaults(); - const hardVaults = useHardVaults(); - const tokens = useTokens(); - const oracles = useOracles(); - const governance = useGovernance(); - const rewards = useRewards(); - const mushroomNft = useMushroomNft(); + const vaults = hooks.useVaults(); + const hardVaults = hooks.useHardVaults(); + const tokens = hooks.useTokens(); + const oracles = hooks.useOracles(); + const governance = hooks.useGovernance(); + const rewards = hooks.useRewards(); + const mushroomNft = hooks.useMushroomNft(); const match = useRouteMatch(); setMulticallAddress(NETWORKS.optimism.chainId, "0xD0E99f15B24F265074747B2A1444eB02b9E30422"); setMulticallAddress(NETWORKS.okovan.chainId, "0x4EFBb8983D5C18A8b6B5084D936B7D12A0BEe2c9"); @@ -910,7 +905,7 @@ const App = () => { return ( - + @@ -947,6 +942,9 @@ const App = () => { + + + @@ -967,7 +965,7 @@ const App = () => { - + ); }; diff --git a/src/components/Farm/MintingRewards/Rewards.tsx b/src/components/Farm/MintingRewards/Rewards.tsx index 2c56c07..40997a8 100644 --- a/src/components/Farm/MintingRewards/Rewards.tsx +++ b/src/components/Farm/MintingRewards/Rewards.tsx @@ -7,7 +7,7 @@ import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Table from "react-bootstrap/esm/Table"; import Tooltip from "react-bootstrap/esm/Tooltip"; import { useQuery, gql } from "@apollo/client"; -import VaultsContext from "../../../state/VaultsContext"; +import { vaultsContext } from "../../../state"; import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; import { ReactComponent as DAIIcon } from "../../../assets/images/graph/DAI.svg"; @@ -19,7 +19,7 @@ type props = { }; const Rewards = ({ address, ethRewards, daiRewards, claimRewards }: props) => { - const vaults = useContext(VaultsContext); + const vaults = useContext(vaultsContext); const [ethDebt, setEthDebt] = useState("0.0"); const [daiDebt, setDaiDebt] = useState("0.0"); diff --git a/src/components/Farm/MintingRewards/index.tsx b/src/components/Farm/MintingRewards/index.tsx index dcaf5e3..abcbf05 100644 --- a/src/components/Farm/MintingRewards/index.tsx +++ b/src/components/Farm/MintingRewards/index.tsx @@ -1,6 +1,6 @@ import React, { useContext, useEffect, useState } from "react"; import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; -import NetworkContext from "../../../state/NetworkContext"; +import { networkContext } from "../../../state"; import { GRAPHQL_ENDPOINT, NETWORKS } from "../../../utils/constants"; import Rewards from "./Rewards"; @@ -18,7 +18,7 @@ type props = { }; const MintingRerwards = ({ address, ethRewards, daiRewards, claimRewards }: props) => { - const currentNetwork = useContext(NetworkContext); + const currentNetwork = useContext(networkContext); const [apolloClient, setApolloClient] = useState( clientOracle( process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.rinkeby diff --git a/src/components/Farm/UniV3Rewards/Apr.tsx b/src/components/Farm/UniV3Rewards/Apr.tsx index 47951d4..c76ec2c 100644 --- a/src/components/Farm/UniV3Rewards/Apr.tsx +++ b/src/components/Farm/UniV3Rewards/Apr.tsx @@ -3,9 +3,7 @@ import { useQuery, gql } from "@apollo/client"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; import NumberFormat from "react-number-format"; -import SignerContext from "../../../state/SignerContext"; -import OraclesContext from "../../../state/OraclesContext"; -import TokensContext from "../../../state/TokensContext"; +import { oraclesContext, signerContext, tokensContext } from "../../../state"; import { getPriceInUSDFromPair } from "../../../utils/utils"; import { computeIncentiveId } from "../../../utils/univ3"; import { IncentiveType } from "./types"; @@ -16,9 +14,9 @@ type props = { }; const Apr = ({ incentive, stakerContractRead }: props) => { - const signer = useContext(SignerContext); - const oracles = useContext(OraclesContext); - const tokens = useContext(TokensContext); + const signer = useContext(signerContext); + const oracles = useContext(oraclesContext); + const tokens = useContext(tokensContext); const [apr, setApr] = useState(0); const TVL = gql` diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 2a1b2ef..b8c6a5f 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -15,9 +15,7 @@ import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg import { ReactComponent as CtxIcon } from "../../../assets/images/ctx-coin.svg"; import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; import { ReactComponent as UNIIconSmall } from "../../../assets/images/vault/uni.svg"; -import NetworkContext from "../../../state/NetworkContext"; -import { SignerContext } from "../../../state/SignerContext"; -import TokensContext from "../../../state/TokensContext"; +import { ISignerContext, networkContext, tokensContext } from "../../../state"; import { NETWORKS } from "../../../utils/constants"; import { UNIV3, computeIncentiveId } from "../../../utils/univ3"; import { @@ -34,7 +32,7 @@ import Apr from "./Apr"; type props = { ownerAddress: string; - signer: SignerContext; + signer: ISignerContext; stakerContract: ethers.Contract | undefined; stakerContractRead: Contract | undefined; nfpmContract: ethers.Contract | undefined; @@ -56,8 +54,8 @@ const Rewards = ({ poolContractRead, }: props) => { const { t } = useTranslation(); - const tokens = useContext(TokensContext); - const currentNetwork = useContext(NetworkContext); + const tokens = useContext(tokensContext); + const currentNetwork = useContext(networkContext); const [ethTcapIncentive, setEthTcapIncentive] = useState>([]); const [ethTcapPositions, setEthTcapPositions] = useState>([]); const [cumulativePrice, setCumulativePrice] = useState(0); diff --git a/src/components/Farm/UniV3Rewards/index.tsx b/src/components/Farm/UniV3Rewards/index.tsx index b2f2617..a46d875 100644 --- a/src/components/Farm/UniV3Rewards/index.tsx +++ b/src/components/Farm/UniV3Rewards/index.tsx @@ -5,8 +5,7 @@ import { Contract } from "ethers-multicall"; import UniswapV3Staker from "../../../contracts/UniswapV3Staker.json"; import NonfungiblePositionManager from "../../../contracts/NonfungiblePositionManager.json"; import UniV3Pool from "../../../contracts/UniV3Pool.json"; -import NetworkContext from "../../../state/NetworkContext"; -import { SignerContext } from "../../../state/SignerContext"; +import { networkContext, ISignerContext } from "../../../state"; import { NETWORKS } from "../../../utils/constants"; import { GRAPHQL_UNIV3_ENDPOINT, UNIV3 } from "../../../utils/univ3"; import { toFragment } from "../../../utils/utils"; @@ -20,11 +19,11 @@ const clientOracle = (graphqlEndpoint: string) => }); type props = { - signer: SignerContext; + signer: ISignerContext; }; const UniV3Rewards = ({ signer }: props) => { - const currentNetwork = useContext(NetworkContext); + const currentNetwork = useContext(networkContext); const [ownerAddress, setOwnerAddress] = useState(""); const [stakerContract, setStakerContract] = useState(); const [stakerContractRead, setStakerContractRead] = useState(); diff --git a/src/components/Farm/index.tsx b/src/components/Farm/index.tsx index 421c206..de670c7 100644 --- a/src/components/Farm/index.tsx +++ b/src/components/Farm/index.tsx @@ -8,12 +8,14 @@ import Tooltip from "react-bootstrap/esm/Tooltip"; import { ethers } from "ethers"; import { useTranslation } from "react-i18next"; import NumberFormat from "react-number-format"; -import SignerContext from "../../state/SignerContext"; -import TokensContext from "../../state/TokensContext"; -import NetworkContext from "../../state/NetworkContext"; -import OraclesContext from "../../state/OraclesContext"; -import GovernanceContext from "../../state/GovernanceContext"; -import RewardsContext from "../../state/RewardsContext"; +import { + governanceContext, + networkContext, + oraclesContext, + rewardsContext, + signerContext, + tokensContext, +} from "../../state"; import UniV3Rewards from "./UniV3Rewards/index"; import "../../styles/farm.scss"; import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; @@ -47,12 +49,12 @@ const Farm = () => { const [ethVestAmount, setEthVestAmount] = useState(ethers.BigNumber.from(0)); const [ctxVestAmount, setCtxVestAmount] = useState(ethers.BigNumber.from(0)); const [updateData, setUpdateData] = useState(false); - const currentNetwork = useContext(NetworkContext); - const signer = useContext(SignerContext); - const tokens = useContext(TokensContext); - const oracles = useContext(OraclesContext); - const governance = useContext(GovernanceContext); - const rewards = useContext(RewardsContext); + const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); + const tokens = useContext(tokensContext); + const oracles = useContext(oraclesContext); + const governance = useContext(governanceContext); + const rewards = useContext(rewardsContext); // const [stakeShow, setStakeShow] = useState(false); // const [stakeBalance, setStakeBalance] = useState("0"); // const [selectedPoolTitle, setSelectedPoolTitle] = useState(""); diff --git a/src/components/Governance/Delegate.tsx b/src/components/Governance/Delegate.tsx index b12e7cd..c048311 100644 --- a/src/components/Governance/Delegate.tsx +++ b/src/components/Governance/Delegate.tsx @@ -3,8 +3,7 @@ import { Button, Form } from "react-bootstrap"; import { ethers, BigNumber } from "ethers"; import Modal from "react-bootstrap/esm/Modal"; import "../../styles/modal.scss"; -import SignerContext from "../../state/SignerContext"; -import TokensContext from "../../state/TokensContext"; +import { tokensContext, signerContext } from "../../state"; import { errorNotification, notifyUser } from "../../utils/utils"; type props = { @@ -26,8 +25,8 @@ const Delegate = ({ refresh, t, }: props) => { - const tokens = useContext(TokensContext); - const signer = useContext(SignerContext); + const tokens = useContext(tokensContext); + const signer = useContext(signerContext); const [stakeText, setStakeText] = useState(""); const [ctxBalance, setCtxBalance] = useState(""); const [isApproved, setIsApproved] = useState(false); diff --git a/src/components/Governance/Delegators.tsx b/src/components/Governance/Delegators.tsx index e186c08..4aa4623 100644 --- a/src/components/Governance/Delegators.tsx +++ b/src/components/Governance/Delegators.tsx @@ -8,8 +8,7 @@ import KeeperForm from "./KeeperForm"; import Delegate from "./Delegate"; import Withdraw from "./Withdraw"; import StakerStats from "./StakerStats"; -import SignerContext from "../../state/SignerContext"; -import GovernanceContext from "../../state/GovernanceContext"; +import { governanceContext, signerContext } from "../../state"; import { API_ENDPOINT, FEATURES } from "../../utils/constants"; import { delegatorsInfo } from "./data"; @@ -39,8 +38,8 @@ const Delegators = ({ currentSignerAddress }: props) => { const [withdrawTimes, setWithdrawTimes] = useState([]); const [updateData, setUpdateData] = useState(false); const [updateTimes, setUpdateTimes] = useState(false); - const signer = useContext(SignerContext); - const governance = useContext(GovernanceContext); + const signer = useContext(signerContext); + const governance = useContext(governanceContext); const DELEGATORS = gql` query DELEGATORS($currentSignerAddress: String!) { diff --git a/src/components/Governance/ProfileCard.tsx b/src/components/Governance/ProfileCard.tsx index 2d4ef4a..c034214 100644 --- a/src/components/Governance/ProfileCard.tsx +++ b/src/components/Governance/ProfileCard.tsx @@ -12,8 +12,7 @@ import ethereumImg from "../../assets/images/Ethereum-ETH-icon.png"; import discordImg from "../../assets/images/discord-icon.jpg"; import twitterImg from "../../assets/images/twitter.svg"; import tallyImg from "../../assets/images/tally.png"; -import SignerContext from "../../state/SignerContext"; -import GovernanceContext from "../../state/GovernanceContext"; +import { governanceContext, signerContext } from "../../state"; import { VoteBadge, ProfileImage } from "./common"; import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; import { infoType } from "./data"; @@ -52,8 +51,8 @@ const ProfileCard = ({ const [briefLength, setBriefLength] = useState(239); const [tokenOwnerStake, setTokenOwnerStake] = useState<{ stake: string; stakeRaw: string }>(); const [withdrawTime, setWithdrawTime] = useState(0); - const signer = useContext(SignerContext); - const governance = useContext(GovernanceContext); + const signer = useContext(signerContext); + const governance = useContext(governanceContext); const mediaQuery = useMediaQuery("only screen and (max-height: 850px)"); const etherscanUrl = () => { diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 532f7ff..3cc516f 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -3,8 +3,7 @@ import { Button } from "react-bootstrap"; import { ethers } from "ethers"; import Table from "react-bootstrap/esm/Table"; import NumberFormat from "react-number-format"; -import GovernanceContext from "../../state/GovernanceContext"; -import SignerContext from "../../state/SignerContext"; +import { governanceContext, signerContext } from "../../state"; import { errorNotification, notifyUser } from "../../utils/utils"; const sixMonthCtxRewardAmount = 12654; @@ -18,8 +17,8 @@ type props = { }; const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: props) => { - const signer = useContext(SignerContext); - const governance = useContext(GovernanceContext); + const signer = useContext(signerContext); + const governance = useContext(governanceContext); const [totalStaked, setTotalStaked] = useState("0.0"); const [stake, setStake] = useState("0.0"); const [rewards, setRewards] = useState("0.0"); diff --git a/src/components/Header.tsx b/src/components/Header.tsx index e4c38be..66351f4 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -9,10 +9,7 @@ import "../styles/header.scss"; import { ethers } from "ethers"; import Davatar from "@davatar/react"; import NumberFormat from "react-number-format"; -import SignerContext from "../state/SignerContext"; -import { Web3ModalContext } from "../state/Web3ModalContext"; -import TokensContext from "../state/TokensContext"; -import NetworkContext from "../state/NetworkContext"; +import { networkContext, signerContext, tokensContext, Web3ModalContext } from "../state"; import { makeShortAddress, getENS, isInLayer1, isOptimism, isPolygon } from "../utils/utils"; import { NETWORKS, FEATURES } from "../utils/constants"; import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; @@ -31,9 +28,9 @@ type props = { const Header = ({ signerAddress, isMobile }: props) => { const { t } = useTranslation(); const web3Modal = useContext(Web3ModalContext); - const signer = useContext(SignerContext); - const tokens = useContext(TokensContext); - const currentNetwork = useContext(NetworkContext); + const signer = useContext(signerContext); + const tokens = useContext(tokensContext); + const currentNetwork = useContext(networkContext); const [address, setAddress] = useState("0x0000000000000000000000000000000000000000"); const [addressField, setAddressField] = useState(""); const [tokenBalance, setTokenBalance] = useState("0.0"); diff --git a/src/components/MushroomNft/Sewagefruit.tsx b/src/components/MushroomNft/Sewagefruit.tsx index d54788e..64c6419 100644 --- a/src/components/MushroomNft/Sewagefruit.tsx +++ b/src/components/MushroomNft/Sewagefruit.tsx @@ -5,9 +5,7 @@ import Spinner from "react-bootstrap/Spinner"; import { useTranslation } from "react-i18next"; import "../../styles/sewagefruit.scss"; import Loading from "../Loading"; -import SignerContext from "../../state/SignerContext"; -import MushroomNftContext from "../../state/MushroomNftContext"; -import NetworkContext from "../../state/NetworkContext"; +import { mushroomNftContext, networkContext, signerContext } from "../../state"; import { useMerkleTree } from "../../hooks/useMerkleTree"; import { NETWORKS } from "../../utils/constants"; import { errorNotification, isGoerli, notifyUser } from "../../utils/utils"; @@ -31,9 +29,9 @@ type UserStatusType = { const SewageFruit = () => { const { t } = useTranslation(); // const { isInitialized, Moralis } = useMoralis(); - const currentNetwork = useContext(NetworkContext); - const signer = useContext(SignerContext); - const mushroom = useContext(MushroomNftContext); + const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); + const mushroom = useContext(mushroomNftContext); const merkleTree = useMerkleTree(isGoerli(currentNetwork.chainId) ? whitelistGoerli : whitelist); const [signerAddress, setSignerAddress] = useState(""); const [loading, setLoading] = useState(true); diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 88cfcd7..f8516ec 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -4,7 +4,7 @@ import { GiSpottedMushroom } from "react-icons/gi"; import "../styles/sidebar.scss"; import { Link, useLocation } from "react-router-dom"; import { Web3ModalContext } from "../state/Web3ModalContext"; -import NetworkContext from "../state/NetworkContext"; +import { networkContext } from "../state"; import { isInLayer1 } from "../utils/utils"; import { ReactComponent as Logo } from "../assets/images/favicon.svg"; import { ReactComponent as MenuLogo } from "../assets/images/menu.svg"; @@ -22,7 +22,7 @@ type props = { }; const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { - const currentNetwork = useContext(NetworkContext); + const currentNetwork = useContext(networkContext); const location = useLocation(); let activeVal = "dashboard"; switch (location.pathname) { diff --git a/src/components/Vault/Mint.tsx b/src/components/Vault/Mint.tsx index 834e73f..86dc120 100644 --- a/src/components/Vault/Mint.tsx +++ b/src/components/Vault/Mint.tsx @@ -13,12 +13,14 @@ import { ethers, BigNumber } from "ethers"; import NumberFormat from "react-number-format"; import { useRouteMatch, useHistory } from "react-router-dom"; import { useQuery, gql, NetworkStatus } from "@apollo/client"; -import NetworkContext from "../../state/NetworkContext"; -import OraclesContext from "../../state/OraclesContext"; -import TokensContext from "../../state/TokensContext"; -import VaultsContext from "../../state/VaultsContext"; -import HardVaultsContext from "../../state/HardVaultsContext"; -import SignerContext from "../../state/SignerContext"; +import { + hardVaultsContext, + networkContext, + oraclesContext, + signerContext, + tokensContext, + vaultsContext, +} from "../../state"; import "../../styles/mint.scss"; import { ReactComponent as ETHIconSmall } from "../../assets/images/vault/eth.svg"; import { ReactComponent as DAIIconSmall } from "../../assets/images/vault/dai.svg"; @@ -55,12 +57,12 @@ type props = { // TODO: Vault doesn't show if approve is 0 even if there is data in the vault const Mint = ({ address, t }: props) => { - const currentNetwork = useContext(NetworkContext); - const oracles = useContext(OraclesContext); - const tokens = useContext(TokensContext); - const vaults = useContext(VaultsContext); - const hardVaults = useContext(HardVaultsContext); - const signer = useContext(SignerContext); + const currentNetwork = useContext(networkContext); + const oracles = useContext(oraclesContext); + const tokens = useContext(tokensContext); + const vaults = useContext(vaultsContext); + const hardVaults = useContext(hardVaultsContext); + const signer = useContext(signerContext); const [vaultMode, setVaultMode] = useState( isInLayer1(currentNetwork.chainId) ? "hard" : "normal" ); diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx index c7242bc..1e5500f 100644 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ b/src/components/Vault/Monitoring/Liquidate.tsx @@ -9,12 +9,14 @@ import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; import { useTranslation } from "react-i18next"; import "../../../styles/modal.scss"; -import NetworkContext from "../../../state/NetworkContext"; -import SignerContext from "../../../state/SignerContext"; -import OracleContext from "../../../state/OraclesContext"; -import TokensContext from "../../../state/TokensContext"; -import VaultContext from "../../../state/VaultsContext"; -import HardVaultsContext from "../../../state/HardVaultsContext"; +import { + hardVaultsContext, + networkContext, + oraclesContext, + signerContext, + tokensContext, + vaultsContext, +} from "../../../state"; import { VaultsType } from "./types"; import { errorNotification, @@ -34,12 +36,12 @@ type props = { const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) => { const { t } = useTranslation(); - const currentNetwork = useContext(NetworkContext); - const signer = useContext(SignerContext); - const oracles = useContext(OracleContext); - const vaults = useContext(VaultContext); - const hardVaults = useContext(HardVaultsContext); - const tokens = useContext(TokensContext); + const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); + const oracles = useContext(oraclesContext); + const vaults = useContext(vaultsContext); + const hardVaults = useContext(hardVaultsContext); + const tokens = useContext(tokensContext); const [currentVault, setCurrentVault] = useState(); const [tcapBalance, setTcapBalance] = useState("0"); const [tcapPrice, setTcapPrice] = useState("0"); diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 648db43..678cd87 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -14,11 +14,13 @@ import ToggleButton from "react-bootstrap/esm/ToggleButton"; import "../../../styles/vault-monitoring.scss"; import { useQuery, gql } from "@apollo/client"; import { useLocation } from "react-router-dom"; -import NetworkContext from "../../../state/NetworkContext"; -import OraclesContext from "../../../state/OraclesContext"; -import SignerContext from "../../../state/SignerContext"; -import vaultsContext from "../../../state/VaultsContext"; -import hardVaultsContext from "../../../state/HardVaultsContext"; +import { + hardVaultsContext, + networkContext, + oraclesContext, + signerContext, + vaultsContext, +} from "../../../state"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; import { getRatio2, @@ -74,11 +76,11 @@ const showAllVaults = true; export const Monitoring = () => { const { t } = useTranslation(); - const currentNetwork = useContext(NetworkContext); - const oracles = useContext(OraclesContext); + const currentNetwork = useContext(networkContext); + const oracles = useContext(oraclesContext); const vaults = useContext(vaultsContext); const hardVaults = useContext(hardVaultsContext); - const signer = useContext(SignerContext); + const signer = useContext(signerContext); const { state } = useLocation(); const [skipQuery, setSkipQuery] = useState(false); const [currentAddress, setCurrentAddress] = useState(""); diff --git a/src/components/Vault/Vault.tsx b/src/components/Vault/Vault.tsx index 340f881..6c83183 100644 --- a/src/components/Vault/Vault.tsx +++ b/src/components/Vault/Vault.tsx @@ -1,8 +1,7 @@ import React, { useState, useEffect, useContext } from "react"; import Button from "react-bootstrap/esm/Button"; import { useTranslation } from "react-i18next"; -import { Web3ModalContext } from "../../state/Web3ModalContext"; -import SignerContext from "../../state/SignerContext"; +import { signerContext, Web3ModalContext } from "../../state"; import "../../styles/mint.scss"; import Loading from "../Loading"; @@ -11,7 +10,7 @@ import Mint from "./Mint"; export const Vault = () => { const { t } = useTranslation(); const web3Modal = useContext(Web3ModalContext); - const signer = useContext(SignerContext); + const signer = useContext(signerContext); // State const [isLoading, setIsLoading] = useState(true); diff --git a/src/components/Vaults/common.tsx b/src/components/Vaults/common.tsx new file mode 100644 index 0000000..d46cbe4 --- /dev/null +++ b/src/components/Vaults/common.tsx @@ -0,0 +1,87 @@ +import { OraclePricesType, VaultsRatioType } from "./types"; + +export const getMinRatio = (ratios: VaultsRatioType, symbol: string, isHardVault: boolean) => { + let minRatio = 200; + switch (symbol) { + case "ETH": + minRatio = isHardVault ? ratios.hardEthRatio : ratios.ethRatio; + break; + case "WETH": + minRatio = isHardVault ? ratios.hardWethRatio : ratios.ethRatio; + break; + case "DAI": + minRatio = isHardVault ? ratios.hardDaiRatio : ratios.daiRatio; + break; + case "AAVE": + minRatio = ratios.aaveRatio; + break; + case "LINK": + minRatio = ratios.linkRatio; + break; + case "UNI": + minRatio = ratios.uniRatio; + break; + case "SNX": + minRatio = ratios.snxRatio; + break; + case "MATIC": + minRatio = ratios.maticRatio; + break; + case "WBTC": + minRatio = ratios.wbtcRatio; + break; + case "USDC": + minRatio = ratios.hardUsdcRatio; + break; + default: + break; + } + + return minRatio; +}; + +export const getCollateralPrice = (prices: OraclePricesType, symbol: string) => { + let price = "0"; + switch (symbol) { + case "ETH": + price = prices.wethOraclePrice; + break; + case "WETH": + price = prices.wethOraclePrice; + break; + case "DAI": + price = prices.daiOraclePrice; + break; + case "AAVE": + price = prices.aaveOraclePrice; + break; + case "LINK": + price = prices.linkOraclePrice; + break; + case "UNI": + price = prices.uniOraclePrice; + break; + case "SNX": + price = prices.snxOraclePrice; + break; + case "MATIC": + price = prices.maticOraclePrice; + break; + case "WBTC": + price = prices.wbtcOraclePrice; + break; + case "USDC": + price = prices.usdcOraclePrice; + break; + default: + break; + } + return price; +}; + +export const VAULT_STATUS = { + empty: "empty", + ready: "ready", + active: "active", + liquidation: "liquidation", +}; diff --git a/src/components/Vaults/index.tsx b/src/components/Vaults/index.tsx new file mode 100644 index 0000000..dc5c48a --- /dev/null +++ b/src/components/Vaults/index.tsx @@ -0,0 +1,23 @@ +import React, { useContext, useEffect, useState } from "react"; + +import { signerContext } from "../../state/index"; +import Monitoring from "./monitoring"; + +const Vaults = () => { + const signer = useContext(signerContext); + const [ownerAddress, setOwnerAddress] = useState(""); + + useEffect(() => { + const load = async () => { + if (signer && signer.signer) { + const address = await signer.signer.getAddress(); + setOwnerAddress(address); + } + }; + load(); + }, [signer]); + + return ; +}; + +export default Vaults; diff --git a/src/components/Vaults/monitoring.tsx b/src/components/Vaults/monitoring.tsx new file mode 100644 index 0000000..ab9afe2 --- /dev/null +++ b/src/components/Vaults/monitoring.tsx @@ -0,0 +1,208 @@ +import React, { useContext, useRef, useState } from "react"; +import { Card, Row } from "react-bootstrap/esm"; +import Col from "react-bootstrap/Col"; +// import Spinner from "react-bootstrap/Spinner"; +import { useTranslation } from "react-i18next"; + +import { useRatios } from "./useRatios"; +import { usePrices } from "./usePrices"; +import { getMinRatio, getCollateralPrice, VAULT_STATUS } from "./common"; +import { DropdownItemType, PaginationType, VaultsTotalsType, VaultsType } from "./types"; + +const pagDefault = { + previous: 0, + current: 0, + next: 0, + pages: 0, + lastDataPage: 0, + itemsPerPage: 10, + itemsCount: 0, + lastId: "0", +}; + +const totalsDefault = { + vaults: 0, + collateral: "0", + collateralUSD: "0", + debt: "0", + debtUSD: "0", +}; + +type liqVaultsTempType = { + vaultId: string; + vaultType: string; + decimals: number; + hardVault: boolean; +}; + +const showAllVaults = true; + +type props = { + ownerAddress: string; +}; + +const Monitoring = ({ ownerAddress }: props) => { + const { t } = useTranslation(); + const prices = usePrices(); + const ratios = useRatios(); + const [skipQuery, setSkipQuery] = useState(false); + const [vaultsTotals, setVaultsTotals] = useState(totalsDefault); + const [vaultList, setVaultList] = useState>([]); + const [vaultGraphList, setVaultGraphList] = useState>([]); + const [pagination, setPagination] = useState(pagDefault); + const [loadMore, setLoadMore] = useState(false); + const [filteringRatios, setFilteringRatios] = useState(false); + const [radioValue, setRadioValue] = useState("2"); + const [tokenSymbol, setTokenSymbol] = useState("all"); + const [currentStatus, setCurrentStatus] = useState("all"); + const [vaultMode, setVaultMode] = useState("all"); + const [currentMinRatio, setCurrentMinRatio] = useState("0%"); + const [currentMaxRatio, setCurrentMaxRatio] = useState("2500%"); + const [renderTable, setRenderTable] = useState(false); + const ratioRangeDropdown = useRef(null); + const minRatioInput = useRef(null); + const maxRatioInput = useRef(null); + const radios = [ + { name: t("all-vaults"), value: "1" }, + { name: t("my-vaults"), value: "2" }, + ]; + const viewsList = [ + { key: "5", name: "5" }, + { key: "10", name: "10" }, + { key: "15", name: "15" }, + { key: "20", name: "20" }, + { key: "25", name: "25" }, + { key: "30", name: "30" }, + ]; + const statusList = [ + { key: "all", name: "All" }, + { key: VAULT_STATUS.empty, name: "Empty" }, + { key: VAULT_STATUS.ready, name: "Ready" }, + { key: VAULT_STATUS.active, name: "Active" }, + { key: VAULT_STATUS.liquidation, name: "Liquidation" }, + ]; + const modeList = [ + { key: "all", name: "All" }, + { key: "regular", name: "Regular" }, + { key: "hard", name: "Hard" }, + ]; + + const buildFilters = () => { + const weiLimit = "100000000"; + let filter = ""; + let ownerFilter = ""; + let vaultFilter = ""; + let statusFilter = ""; + let modeFilter = ""; + if (radioValue === "2" && ownerAddress !== "") { + ownerFilter = `, owner: "${ownerAddress}"`; + } + if (tokenSymbol !== "all") { + vaultFilter = `tokenSymbol: "${tokenSymbol.toUpperCase()}"`; + } + if (currentStatus !== "all") { + if (currentStatus === "empty") { + statusFilter = `collateral_lt: "${weiLimit}"`; + } + if (currentStatus === "ready") { + statusFilter = `collateral_gte: "${weiLimit}", debt_lt: "${weiLimit}"`; + } + } + if (vaultMode !== "all") { + const isHard = vaultMode === "hard" ? "true" : "false"; + modeFilter = "hardVault: ".concat(isHard); + } + + filter = ownerFilter; + if (vaultFilter !== "") { + filter = filter.concat(`, ${vaultFilter}`); + } + if (statusFilter !== "") { + filter = filter.concat(`, ${statusFilter}`); + } + if (modeFilter !== "") { + filter = filter.concat(`, ${modeFilter}`); + } + if (filter !== "") { + if (loadMore) { + filter = `, where: { blockTS_gt: "${pagination.lastId}" ${filter} }`; + } else { + filter = `, where: { blockTS_gt: "0" ${filter} }`; + } + } + return filter; + }; + + const str = + "query allVaults {" + + `vaults(first: 1000, orderBy: blockTS ${buildFilters()}) {` + + "id " + + "vaultId " + + "owner " + + "collateral " + + "debt " + + "currentRatio " + + "tokenSymbol " + + "hardVault " + + "blockTS " + + "underlyingProtocol { " + + "underlyingToken { " + + "decimals " + + "} " + + "}" + + "} " + + "}"; + + return ( +
+ + + + +
+ <>{t("totals")} +
+
+ +
+ +
+ <>{t("vaults")} +
+ +
+
+ <>{t("collateral")} (USD) +
+ +
+
+
+ <>{t("debt")} +
+
+ +
+
+ <>{t("debt")} (USD) +
+ + + + + + +

{getMinRatio(ratios, "ETH", true).toString()}

+

{getMinRatio(ratios, "ETH", false).toString()}

+

{getMinRatio(ratios, "AAVE", true).toString()}

+

{getCollateralPrice(prices, "DAI")}

+

{getCollateralPrice(prices, "ETH")}

+
+
+ + + + ); +}; + +export default Monitoring; diff --git a/src/components/Vaults/types.tsx b/src/components/Vaults/types.tsx new file mode 100644 index 0000000..e4883a8 --- /dev/null +++ b/src/components/Vaults/types.tsx @@ -0,0 +1,69 @@ +export type PaginationType = { + previous: number; + current: number; + next: number; + pages: number; + lastDataPage: number; + itemsPerPage: number; + itemsCount: number; + lastId: string; +}; + +export type OraclePricesType = { + tcapOraclePrice: string; + wethOraclePrice: string; + daiOraclePrice: string; + aaveOraclePrice: string; + linkOraclePrice: string; + uniOraclePrice: string; + snxOraclePrice: string; + maticOraclePrice: string; + wbtcOraclePrice: string; + usdcOraclePrice: string; +}; + +export type VaultsRatioType = { + ethRatio: number; + wethRatio: number; + daiRatio: number; + aaveRatio: number; + linkRatio: number; + uniRatio: number; + snxRatio: number; + maticRatio: number; + wbtcRatio: number; + hardEthRatio: number; + hardWethRatio: number; + hardDaiRatio: number; + hardUsdcRatio: number; +}; + +export type VaultsType = { + id: string; + collateralSymbol: string; + collateralValue: string; + collateralUsd: string; + debt: string; + debtUsd: string; + ratio: number; + minRatio: string; + decimals: number; + isHardVault: boolean; + netReward: number; + status: string; + blockTS: string; + url: string; +}; + +export type VaultsTotalsType = { + vaults: number; + collateral: string; + collateralUSD: string; + debt: string; + debtUSD: string; +}; + +export type DropdownItemType = { + key: string; + name: string; +}; diff --git a/src/components/Vaults/usePrices.tsx b/src/components/Vaults/usePrices.tsx new file mode 100644 index 0000000..e0cfea5 --- /dev/null +++ b/src/components/Vaults/usePrices.tsx @@ -0,0 +1,116 @@ +import { useContext, useEffect, useState } from "react"; +import { ethers, BigNumber } from "ethers"; +import { oraclesContext, networkContext, signerContext } from "../../state/index"; +import { isInLayer1, isOptimism, isPolygon, validOracles } from "../../utils/utils"; +import { OraclePricesType } from "./types"; + +export const usePrices = (): OraclePricesType => { + const currentNetwork = useContext(networkContext); + const oracles = useContext(oraclesContext); + const signer = useContext(signerContext); + const [oraclePrices, setOraclePrices] = useState({ + tcapOraclePrice: "0", + wethOraclePrice: "0", + daiOraclePrice: "0", + aaveOraclePrice: "0", + linkOraclePrice: "0", + uniOraclePrice: "0", + snxOraclePrice: "0", + maticOraclePrice: "0", + wbtcOraclePrice: "0", + usdcOraclePrice: "0", + }); + + const loadPrices = async () => { + if (signer && oracles && validOracles(currentNetwork.chainId || 1, oracles)) { + const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); + + const ethcalls = [tcapPriceCall, daiOraclePriceCall]; + if (isInLayer1(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + ethcalls.push(aaveOraclePriceCall); + ethcalls.push(linkOraclePriceCall); + ethcalls.push(usdcOraclePriceCall); + ethcalls.push(wbtcOraclePriceCall); + } + if (isOptimism(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); + const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + ethcalls.push(linkOraclePriceCall); + ethcalls.push(snxOraclePriceCall); + ethcalls.push(uniOraclePriceCall); + } + if (isPolygon(currentNetwork.chainId)) { + const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + ethcalls.push(maticOraclePriceCall); + ethcalls.push(wbtcOraclePriceCall); + } + let tcapOraclePrice = BigNumber.from(0); + let wethOraclePrice = BigNumber.from(0); + let daiOraclePrice = BigNumber.from(0); + let aaveOraclePrice = BigNumber.from(0); + let linkOraclePrice = BigNumber.from(0); + let snxOraclePrice = BigNumber.from(0); + let uniOraclePrice = BigNumber.from(0); + let maticOraclePrice = BigNumber.from(0); + let wbtcOraclePrice = BigNumber.from(0); + let usdcOraclePrice = BigNumber.from(0); + + if (isInLayer1(currentNetwork.chainId)) { + // @ts-ignore + [ + tcapOraclePrice, + daiOraclePrice, + wethOraclePrice, + aaveOraclePrice, + linkOraclePrice, + usdcOraclePrice, + wbtcOraclePrice, + ] = await signer.ethcallProvider?.all(ethcalls); + } else if (isOptimism(currentNetwork.chainId)) { + // @ts-ignore + [ + tcapOraclePrice, + daiOraclePrice, + wethOraclePrice, + linkOraclePrice, + snxOraclePrice, + uniOraclePrice, + ] = await signer.ethcallProvider?.all(ethcalls); + } else if (isPolygon(currentNetwork.chainId)) { + // @ts-ignore + [tcapOraclePrice, daiOraclePrice, maticOraclePrice, wbtcOraclePrice] = + await signer.ethcallProvider?.all(ethcalls); + } + + setOraclePrices({ + tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), + wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), + daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), + aaveOraclePrice: ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)), + linkOraclePrice: ethers.utils.formatEther(linkOraclePrice.mul(10000000000)), + uniOraclePrice: ethers.utils.formatEther(uniOraclePrice.mul(10000000000)), + snxOraclePrice: ethers.utils.formatEther(snxOraclePrice.mul(10000000000)), + maticOraclePrice: ethers.utils.formatEther(maticOraclePrice.mul(10000000000)), + wbtcOraclePrice: ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)), + usdcOraclePrice: ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)), + }); + } + }; + + useEffect(() => { + loadPrices(); + }); + + return oraclePrices; +}; diff --git a/src/components/Vaults/useRatios.tsx b/src/components/Vaults/useRatios.tsx new file mode 100644 index 0000000..3f34adc --- /dev/null +++ b/src/components/Vaults/useRatios.tsx @@ -0,0 +1,115 @@ +import { useContext, useEffect, useState } from "react"; +import { hardVaultsContext, networkContext, signerContext, vaultsContext } from "../../state/index"; +import { isInLayer1, isOptimism, isPolygon, validVaults, validHardVaults } from "../../utils/utils"; +import { VaultsRatioType } from "./types"; + +export const useRatios = (): VaultsRatioType => { + const currentNetwork = useContext(networkContext); + const vaults = useContext(vaultsContext); + const hardVaults = useContext(hardVaultsContext); + const signer = useContext(signerContext); + const [vaultsRatio, setVaultsRatio] = useState({ + ethRatio: 150, + wethRatio: 200, + daiRatio: 200, + aaveRatio: 200, + linkRatio: 200, + uniRatio: 200, + snxRatio: 200, + maticRatio: 200, + wbtcRatio: 200, + hardEthRatio: 125, + hardWethRatio: 125, + hardDaiRatio: 125, + hardUsdcRatio: 125, + }); + + const loadRatios = async () => { + if ( + signer && + vaults && + hardVaults && + validVaults(currentNetwork.chainId || 1, vaults) && + validHardVaults(currentNetwork.chainId || 1, hardVaults) + ) { + const daiRatioCall = await vaults.daiVaultRead?.ratio(); + const ethcalls = [daiRatioCall]; + + if (isInLayer1(currentNetwork.chainId)) { + const wethRatioCall = await vaults.wethVaultRead?.ratio(); + const aaveRatioCall = await vaults.aaveVaultRead?.ratio(); + const linkRatioCall = await vaults.linkVaultRead?.ratio(); + const hardWethRatioCall = await hardVaults.wethVaultRead?.ratio(); + const hardDaiRatioCall = await hardVaults.daiVaultRead?.ratio(); + const hardUsdcRatioCall = await hardVaults.usdcVaultRead?.ratio(); + ethcalls.push(wethRatioCall); + ethcalls.push(aaveRatioCall); + ethcalls.push(linkRatioCall); + ethcalls.push(hardWethRatioCall); + ethcalls.push(hardDaiRatioCall); + ethcalls.push(hardUsdcRatioCall); + } + if (isOptimism(currentNetwork.chainId)) { + const wethRatioCall = await vaults.wethVaultRead?.ratio(); + const linkRatioCall = await vaults.linkVaultRead?.ratio(); + const snxRatioCall = await vaults.snxVaultRead?.ratio(); + const uniRatioCall = await vaults.uniVaultRead?.ratio(); + ethcalls.push(wethRatioCall); + ethcalls.push(linkRatioCall); + ethcalls.push(snxRatioCall); + ethcalls.push(uniRatioCall); + } + if (isPolygon(currentNetwork.chainId)) { + const maticRatioCall = await vaults.maticVaultRead?.ratio(); + const wbtcRatioCall = await vaults.wbtcVaultRead?.ratio(); + ethcalls.push(maticRatioCall); + ethcalls.push(wbtcRatioCall); + } + let ethRatio = 0; + let daiRatio = 0; + let aaveRatio = 0; + let linkRatio = 0; + let snxRatio = 0; + let uniRatio = 0; + let maticRatio = 0; + let wbtcRatio = 0; + let hardEthRatio = 0; + let hardDaiRatio = 0; + let hardUsdcRatio = 0; + if (isInLayer1(currentNetwork.chainId)) { + // @ts-ignore + [daiRatio, ethRatio, aaveRatio, linkRatio, hardEthRatio, hardDaiRatio, hardUsdcRatio] = + await signer.ethcallProvider?.all(ethcalls); + } else if (isOptimism(currentNetwork.chainId)) { + // @ts-ignore + [daiRatio, ethRatio, linkRatio, snxRatio, uniRatio] = await signer.ethcallProvider?.all( + ethcalls + ); + } else if (isPolygon(currentNetwork.chainId)) { + // @ts-ignore + [daiRatio, maticRatio, wbtcRatio] = await signer.ethcallProvider?.all(ethcalls); + } + setVaultsRatio({ + ethRatio, + wethRatio: ethRatio, + daiRatio, + aaveRatio, + linkRatio, + uniRatio, + snxRatio, + maticRatio, + wbtcRatio, + hardEthRatio, + hardWethRatio: hardEthRatio, + hardDaiRatio, + hardUsdcRatio, + }); + } + }; + + useEffect(() => { + loadRatios(); + }); + + return vaultsRatio; +}; diff --git a/src/components/Welcome/Protocol.tsx b/src/components/Welcome/Protocol.tsx index f959f75..c4758fb 100644 --- a/src/components/Welcome/Protocol.tsx +++ b/src/components/Welcome/Protocol.tsx @@ -4,10 +4,7 @@ import Spinner from "react-bootstrap/Spinner"; import { BigNumber, ethers } from "ethers"; import { useTranslation } from "react-i18next"; import NumberFormat from "react-number-format"; -import NetworkContext from "../../state/NetworkContext"; -import TokensContext from "../../state/TokensContext"; -import SignerContext from "../../state/SignerContext"; -import OraclesContext from "../../state/OraclesContext"; +import { networkContext, oraclesContext, signerContext, tokensContext } from "../../state"; import { ReactComponent as StakeIcon } from "../../assets/images/graph/stake.svg"; import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; import { ReactComponent as WETHIcon } from "../../assets/images/graph/weth.svg"; @@ -36,10 +33,10 @@ type props = { const Protocol = ({ data }: props) => { const { t } = useTranslation(); - const currentNetwork = useContext(NetworkContext); - const tokens = useContext(TokensContext); - const signer = useContext(SignerContext); - const oracles = useContext(OraclesContext); + const currentNetwork = useContext(networkContext); + const tokens = useContext(tokensContext); + const signer = useContext(signerContext); + const oracles = useContext(oraclesContext); const [ethStake, setETHStake] = useState("0"); const [daiStake, setDAIStake] = useState("0"); const [maticStake, setMATICStake] = useState("0"); diff --git a/src/components/Welcome/Summary.tsx b/src/components/Welcome/Summary.tsx index c62c296..a6a34ac 100644 --- a/src/components/Welcome/Summary.tsx +++ b/src/components/Welcome/Summary.tsx @@ -10,11 +10,13 @@ import { useTranslation } from "react-i18next"; import { ethers } from "ethers"; import NumberFormat from "react-number-format"; import { useQuery, gql } from "@apollo/client"; -import NetworkContext from "../../state/NetworkContext"; -import SignerContext from "../../state/SignerContext"; -import TokensContext from "../../state/TokensContext"; -import OraclesContext from "../../state/OraclesContext"; -import { Web3ModalContext } from "../../state/Web3ModalContext"; +import { + networkContext, + oraclesContext, + signerContext, + tokensContext, + Web3ModalContext, +} from "../../state"; import { makeShortAddress, getPriceInUSDFromPair, getENS, isInLayer1 } from "../../utils/utils"; import "../../styles/summary.scss"; import Protocol from "./Protocol"; @@ -40,11 +42,11 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { const [ctxUSDBalance, setCtxUSDBalance] = useState("0.0"); const [ctxBalance, setCtxBalance] = useState("0.0"); const [isLoading, setIsLoading] = useState(true); - const currentNetwork = useContext(NetworkContext); - const signer = useContext(SignerContext); + const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); const web3Modal = useContext(Web3ModalContext); - const tokens = useContext(TokensContext); - const oracles = useContext(OraclesContext); + const tokens = useContext(tokensContext); + const oracles = useContext(oraclesContext); const VAULTS_STATE = gql` { diff --git a/src/components/Welcome/index.tsx b/src/components/Welcome/index.tsx index f488838..459a73b 100644 --- a/src/components/Welcome/index.tsx +++ b/src/components/Welcome/index.tsx @@ -1,6 +1,6 @@ import React, { useContext, useEffect, useState } from "react"; import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; -import NetworkContext from "../../state/NetworkContext"; +import { networkContext } from "../../state"; import { GRAPHQL_ENDPOINT, NETWORKS } from "../../utils/constants"; import Summary from "./Summary"; @@ -16,7 +16,7 @@ type props = { }; const WelcomeWrapper = ({ signerAddress, loadingContracts }: props) => { - const currentNetwork = useContext(NetworkContext); + const currentNetwork = useContext(networkContext); const [apolloClient, setApolloClient] = useState( clientOracle( process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.rinkeby diff --git a/src/components/modals/Delegate.tsx b/src/components/modals/Delegate.tsx index 2c954de..f38781f 100644 --- a/src/components/modals/Delegate.tsx +++ b/src/components/modals/Delegate.tsx @@ -3,9 +3,8 @@ import Modal from "react-bootstrap/esm/Modal"; import Button from "react-bootstrap/esm/Button"; import Form from "react-bootstrap/esm/Form"; import "../../styles/modal.scss"; -import governanceContext from "../../state/GovernanceContext"; +import { governanceContext, tokensContext } from "../../state"; import { isValidAddress, errorNotification, notifyUser } from "../../utils/utils"; -import tokensContext from "../../state/TokensContext"; type props = { show: boolean; diff --git a/src/components/modals/NewProposal.tsx b/src/components/modals/NewProposal.tsx deleted file mode 100644 index 0b9c4a1..0000000 --- a/src/components/modals/NewProposal.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import React, { useContext, useState } from "react"; -import Modal from "react-bootstrap/esm/Modal"; -import Button from "react-bootstrap/esm/Button"; -import Form from "react-bootstrap/esm/Form"; -import { ethers } from "ethers"; -import governanceContext from "../../state/GovernanceContext"; -import "../../styles/modal.scss"; -import { errorNotification, notifyUser } from "../../utils/utils"; - -type props = { - show: boolean; - onHide: () => void; - refresh: () => void; -}; - -export const NewProposal = ({ show, onHide, refresh }: props) => { - const governance = useContext(governanceContext); - const [description, setDescription] = useState(""); - const [target, setTarget] = useState(""); - const [signature, setSignature] = useState(""); - const [values, setValues] = useState(""); - - const onChangeDescription = (event: React.ChangeEvent) => { - setDescription(event.target.value); - }; - - const onChangeTarget = (event: React.ChangeEvent) => { - setTarget(event.target.value); - }; - - const onChangeSignature = (event: React.ChangeEvent) => { - setSignature(event.target.value); - }; - - const onChangeValues = (event: React.ChangeEvent) => { - setValues(event.target.value); - }; - - const createProposal = async (event: React.MouseEvent) => { - event.preventDefault(); - if (governance.governorAlpha) { - if (description !== "") { - try { - const targets = [target]; - const msgValues = ["0"]; - const signatures = [signature]; - const abi = new ethers.utils.AbiCoder(); - const start = signature.indexOf("(") + 1; - const end = signature.indexOf(")"); - const types = signature.substring(start, end).split(","); - const valuesArray = values.split(","); - const calldata = abi.encode(types, valuesArray); - const calldatas = [calldata]; - const tx = await governance.governorAlpha.propose( - targets, - msgValues, - signatures, - calldatas, - description - ); - notifyUser(tx, refresh); - setDescription(""); - onHide(); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification("Transaction rejected"); - } else { - errorNotification("Description can't be empty"); - } - } - } else { - errorNotification("Description can't be empty"); - } - } - }; - - return ( - - - New Proposal - - -

- Create a new proposal with a maximun of 10 actions. You need a total of 100,000 CTX - delegated to your address in order to create a new proposal -

- - - Description - - - - Target Contract - - - - Function to Call - - - - Values - - - -
- - - -
- ); -}; diff --git a/src/components/modals/Stake.tsx b/src/components/modals/Stake.tsx index 839b471..934ca89 100644 --- a/src/components/modals/Stake.tsx +++ b/src/components/modals/Stake.tsx @@ -4,7 +4,7 @@ import Button from "react-bootstrap/esm/Button"; import Form from "react-bootstrap/esm/Form"; import { ethers, BigNumber } from "ethers"; import { useTranslation } from "react-i18next"; -import SignerContext from "../../state/SignerContext"; +import { signerContext } from "../../state"; import "../../styles/modal.scss"; import { errorNotification, notifyUser } from "../../utils/utils"; @@ -23,7 +23,7 @@ export const Stake = ({ show, poolTitle, poolToken, pool, balance, onHide, refre const { t } = useTranslation(); const [stakeText, setStakeText] = useState(""); const [isApproved, setIsApproved] = useState(false); - const signer = useContext(SignerContext); + const signer = useContext(signerContext); // Infinite Approval const infiniteApproveValue = BigNumber.from("1157920892373161954235709850086879078532699"); diff --git a/src/components/modals/Vote.tsx b/src/components/modals/Vote.tsx deleted file mode 100644 index beb28f5..0000000 --- a/src/components/modals/Vote.tsx +++ /dev/null @@ -1,187 +0,0 @@ -import React, { useContext } from "react"; -import Modal from "react-bootstrap/esm/Modal"; -import Button from "react-bootstrap/esm/Button"; -import Row from "react-bootstrap/esm/Row"; -import Col from "react-bootstrap/esm/Col"; -import ProgressBar from "react-bootstrap/esm/ProgressBar"; -import { ethers } from "ethers"; -import governanceContext from "../../state/GovernanceContext"; -import "../../styles/modal.scss"; -import { errorNotification, notifyUser } from "../../utils/utils"; - -type props = { - show: boolean; - onHide: () => void; - proposal: any; - forVote: number; - against: number; - endTime: string; - status: string; -}; - -export const Vote = ({ show, onHide, proposal, forVote, against, endTime, status }: props) => { - const governance = useContext(governanceContext); - if (!proposal) { - return <>; - } - - const denominator = forVote + against; - const forRate = denominator !== 0 ? (forVote / denominator) * 100 : 0; - const againstRate = denominator !== 0 ? (against / denominator) * 100 : 0; - const animated = status === "PENDING"; - - const abi = new ethers.utils.AbiCoder(); - - const etherscanURL = process?.env?.REACT_APP_ETHERSCAN; - - const clickVote = async (support: Boolean) => { - if (governance.governorAlpha) { - try { - const tx = await governance.governorAlpha.castVote(proposal.id, support); - notifyUser(tx); - onHide(); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification("Transaction rejected"); - } else { - onHide(); - errorNotification("Voter already voted"); - } - } - } - }; - - return ( - - - {proposal.description} - - -
- - {denominator !== 0 ? ( - - - - - ) : ( -
No votes yet!
- )} - - {status !== "ACTIVE" ? ( -
- - - ) : ( - <> - - - - - - - - )} - - - - ); -}; diff --git a/src/hooks/index.tsx b/src/hooks/index.tsx new file mode 100644 index 0000000..f4f7904 --- /dev/null +++ b/src/hooks/index.tsx @@ -0,0 +1,19 @@ +export * from "./useGovernance"; + +export * from "./useHardVaults"; + +export * from "./useMerkleTree"; + +export * from "./useMushroomNft"; + +export * from "./useNetworks"; + +export * from "./useOracles"; + +export * from "./useRewards"; + +export * from "./useSigner"; + +export * from "./useTokens"; + +export * from "./useVaults"; diff --git a/src/hooks/useGovernance.tsx b/src/hooks/useGovernance.tsx index 5733c28..94a29c5 100644 --- a/src/hooks/useGovernance.tsx +++ b/src/hooks/useGovernance.tsx @@ -1,9 +1,9 @@ import React, { useState } from "react"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -import { GovernanceContext } from "../state/GovernanceContext"; +import { IGovernanceContext } from "../state"; -export const useGovernance = (): GovernanceContext => { +export const useGovernance = (): IGovernanceContext => { const [governorAlpha, setGovernorAlpha] = useState(); const [timelock, setTimelock] = useState(); const [delegatorFactory, setDelegatorFactory] = useState(); diff --git a/src/hooks/useHardVaults.tsx b/src/hooks/useHardVaults.tsx index 88d2ac4..d8a5434 100644 --- a/src/hooks/useHardVaults.tsx +++ b/src/hooks/useHardVaults.tsx @@ -1,9 +1,9 @@ import React, { useState } from "react"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -import { HardVaultsContext } from "../state/HardVaultsContext"; +import { IHardVaultsContext } from "../state"; -export const useHardVaults = (): HardVaultsContext => { +export const useHardVaults = (): IHardVaultsContext => { const [wethVault, setWETHVault] = useState(); const [daiVault, setDAIVault] = useState(); const [usdcVault, setUSDCVault] = useState(); diff --git a/src/hooks/useMushroomNft.tsx b/src/hooks/useMushroomNft.tsx index 1c0b7aa..3701547 100644 --- a/src/hooks/useMushroomNft.tsx +++ b/src/hooks/useMushroomNft.tsx @@ -1,7 +1,7 @@ import React, { useState } from "react"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -import { IMushroomNftContext } from "../state/MushroomNftContext"; +import { IMushroomNftContext } from "../state"; export const useMushroomNft = (): IMushroomNftContext => { const [mushroomNft, setMushroomNft] = useState(); diff --git a/src/hooks/useNetworks.tsx b/src/hooks/useNetworks.tsx index 8d93043..d414ed0 100644 --- a/src/hooks/useNetworks.tsx +++ b/src/hooks/useNetworks.tsx @@ -1,7 +1,7 @@ import React, { useState } from "react"; -import { NetworkContext } from "../state/NetworkContext"; +import { INetworkContext } from "../state"; -export const useNetworks = (): NetworkContext => { +export const useNetworks = (): INetworkContext => { const [chainId, setChainId] = useState(); const [name, setName] = useState(); const [wethAddress, setWETHAddress] = useState(""); diff --git a/src/hooks/useOracles.tsx b/src/hooks/useOracles.tsx index 385eac6..fab0eeb 100644 --- a/src/hooks/useOracles.tsx +++ b/src/hooks/useOracles.tsx @@ -1,9 +1,9 @@ import React, { useState } from "react"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -import { OraclesContext } from "../state/OraclesContext"; +import { IOraclesContext } from "../state"; -export const useOracles = (): OraclesContext => { +export const useOracles = (): IOraclesContext => { const [wethOracle, setETHOracle] = useState(); const [daiOracle, setDAIOracle] = useState(); const [wbtcOracle, setWBTCOracle] = useState(); diff --git a/src/hooks/useRewards.tsx b/src/hooks/useRewards.tsx index ad4513b..572bbb7 100644 --- a/src/hooks/useRewards.tsx +++ b/src/hooks/useRewards.tsx @@ -1,9 +1,9 @@ import React, { useState } from "react"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -import { RewardsContext } from "../state/RewardsContext"; +import { IRewardsContext } from "../state"; -export const useRewards = (): RewardsContext => { +export const useRewards = (): IRewardsContext => { const [wethReward, setWETHReward] = useState(); const [daiReward, setDAIReward] = useState(); const [wbtcReward, setWBTCReward] = useState(); diff --git a/src/hooks/useSigner.tsx b/src/hooks/useSigner.tsx index b282852..06c4d4d 100644 --- a/src/hooks/useSigner.tsx +++ b/src/hooks/useSigner.tsx @@ -2,9 +2,9 @@ import React, { useState } from "react"; import { ethers } from "ethers"; import { Provider } from "ethers-multicall"; -import { SignerContext } from "../state/SignerContext"; +import { ISignerContext } from "../state"; -export const useSigner = (): SignerContext => { +export const useSigner = (): ISignerContext => { const [signer, setSigner] = useState(); const [ethcallProvider, setEthcallProvider] = useState(); const setCurrentSigner = React.useCallback((currentSigner: ethers.Signer): void => { diff --git a/src/hooks/useTokens.tsx b/src/hooks/useTokens.tsx index 544b3fb..35db826 100644 --- a/src/hooks/useTokens.tsx +++ b/src/hooks/useTokens.tsx @@ -1,9 +1,9 @@ import React, { useState } from "react"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -import { TokensContext } from "../state/TokensContext"; +import { ITokensContext } from "../state"; -export const useTokens = (): TokensContext => { +export const useTokens = (): ITokensContext => { const [wethToken, setETHToken] = useState(); const [daiToken, setDAIToken] = useState(); const [wbtcToken, setWBTCToken] = useState(); diff --git a/src/hooks/useVaults.tsx b/src/hooks/useVaults.tsx index ffd4237..ff276b7 100644 --- a/src/hooks/useVaults.tsx +++ b/src/hooks/useVaults.tsx @@ -1,9 +1,9 @@ import React, { useState } from "react"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -import { VaultsContext } from "../state/VaultsContext"; +import { IVaultsContext } from "../state"; -export const useVaults = (): VaultsContext => { +export const useVaults = (): IVaultsContext => { const [wethVault, setWETHVault] = useState(); const [daiVault, setDAIVault] = useState(); const [wbtcVault, setWBTCVault] = useState(); diff --git a/src/state/GovernanceContext.tsx b/src/state/GovernanceContext.tsx index 2319aee..96495d3 100644 --- a/src/state/GovernanceContext.tsx +++ b/src/state/GovernanceContext.tsx @@ -2,7 +2,7 @@ import React from "react"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -export interface GovernanceContext { +export interface IGovernanceContext { governorAlpha?: ethers.Contract; setCurrentGovernorAlpha: (currentGovernorAlpha: ethers.Contract) => void; timelock?: ethers.Contract; @@ -26,6 +26,4 @@ export const GOVERNANCE_DEFAULT_VALUE = { setCurrentDelegatorFactoryRead: () => {}, }; -const governanceContext = React.createContext(GOVERNANCE_DEFAULT_VALUE); - -export default governanceContext; +export const governanceContext = React.createContext(GOVERNANCE_DEFAULT_VALUE); diff --git a/src/state/HardVaultsContext.tsx b/src/state/HardVaultsContext.tsx index 790b01e..a78ac6c 100644 --- a/src/state/HardVaultsContext.tsx +++ b/src/state/HardVaultsContext.tsx @@ -2,7 +2,7 @@ import React from "react"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -export interface HardVaultsContext { +export interface IHardVaultsContext { wethVault?: ethers.Contract; setCurrentWETHVault: (currentVault: ethers.Contract) => void; daiVault?: ethers.Contract; @@ -32,6 +32,4 @@ export const HARD_VAULTS_DEFAULT_VALUE = { setCurrentWBTCVaultRead: () => {}, }; -const hardVaultsContext = React.createContext(HARD_VAULTS_DEFAULT_VALUE); - -export default hardVaultsContext; +export const hardVaultsContext = React.createContext(HARD_VAULTS_DEFAULT_VALUE); diff --git a/src/state/MushroomNftContext.tsx b/src/state/MushroomNftContext.tsx index 756e836..7c63e6e 100644 --- a/src/state/MushroomNftContext.tsx +++ b/src/state/MushroomNftContext.tsx @@ -14,6 +14,4 @@ export const MUSHROOM_VALUE = { setCurrentMushroomNftRead: () => {}, }; -const mushroomNftContext = React.createContext(MUSHROOM_VALUE); - -export default mushroomNftContext; +export const mushroomNftContext = React.createContext(MUSHROOM_VALUE); diff --git a/src/state/NetworkContext.tsx b/src/state/NetworkContext.tsx index 264f0ca..1b8681b 100644 --- a/src/state/NetworkContext.tsx +++ b/src/state/NetworkContext.tsx @@ -1,7 +1,7 @@ import React from "react"; import { NETWORKS } from "../utils/constants"; -export interface NetworkContext { +export interface INetworkContext { chainId?: number; setCurrentChainId: (newChainId: number) => void; name?: string; @@ -35,6 +35,4 @@ const NETWORK_DEFAULT_VALUE = { setCurrentIsBrowserWallet: () => {}, }; -const networkContext = React.createContext(NETWORK_DEFAULT_VALUE); - -export default networkContext; +export const networkContext = React.createContext(NETWORK_DEFAULT_VALUE); diff --git a/src/state/OraclesContext.tsx b/src/state/OraclesContext.tsx index 8d0cfb1..8cfd574 100644 --- a/src/state/OraclesContext.tsx +++ b/src/state/OraclesContext.tsx @@ -2,7 +2,7 @@ import React from "react"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -export interface OraclesContext { +export interface IOraclesContext { wethOracle?: ethers.Contract; setCurrentWETHOracle: (currentOracle: ethers.Contract) => void; daiOracle?: ethers.Contract; @@ -68,6 +68,4 @@ export const ORACLES_DEFAULT_VALUE = { setCurrentUSDCOracleRead: () => {}, }; -const oraclesContext = React.createContext(ORACLES_DEFAULT_VALUE); - -export default oraclesContext; +export const oraclesContext = React.createContext(ORACLES_DEFAULT_VALUE); diff --git a/src/state/RewardsContext.tsx b/src/state/RewardsContext.tsx index bb9f0d6..45d0efa 100644 --- a/src/state/RewardsContext.tsx +++ b/src/state/RewardsContext.tsx @@ -2,7 +2,7 @@ import React from "react"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -export interface RewardsContext { +export interface IRewardsContext { wethReward?: ethers.Contract; setCurrentWETHReward: (currentReward: ethers.Contract) => void; daiReward?: ethers.Contract; @@ -50,6 +50,4 @@ export const REWARDS_DEFAULT_VALUE = { setCurrentCTXPoolRewardRead: () => {}, }; -const rewardsContext = React.createContext(REWARDS_DEFAULT_VALUE); - -export default rewardsContext; +export const rewardsContext = React.createContext(REWARDS_DEFAULT_VALUE); diff --git a/src/state/SignerContext.tsx b/src/state/SignerContext.tsx index 8758e91..73f8b49 100644 --- a/src/state/SignerContext.tsx +++ b/src/state/SignerContext.tsx @@ -2,7 +2,7 @@ import React from "react"; import { Provider } from "ethers-multicall"; import { ethers } from "ethers"; -export interface SignerContext { +export interface ISignerContext { signer?: ethers.Signer; setCurrentSigner: (currentSigner: ethers.Signer) => void; ethcallProvider?: Provider; @@ -14,6 +14,4 @@ export const SIGNER_DEFAULT_VALUE = { setCurrentEthcallProvider: () => {}, }; -const signerContext = React.createContext(SIGNER_DEFAULT_VALUE); - -export default signerContext; +export const signerContext = React.createContext(SIGNER_DEFAULT_VALUE); diff --git a/src/state/TokensContext.tsx b/src/state/TokensContext.tsx index 4d0e552..84e63ee 100644 --- a/src/state/TokensContext.tsx +++ b/src/state/TokensContext.tsx @@ -2,7 +2,7 @@ import React from "react"; import { Contract } from "ethers-multicall"; import { ethers } from "ethers"; -export interface TokensContext { +export interface ITokensContext { wethToken?: ethers.Contract; setCurrentWETHToken: (currentToken: ethers.Contract) => void; daiToken?: ethers.Contract; @@ -98,6 +98,4 @@ export const TOKENS_DEFAULT_VALUE = { setCurrentCTXPoolTokenRead: () => {}, }; -const tokensContext = React.createContext(TOKENS_DEFAULT_VALUE); - -export default tokensContext; +export const tokensContext = React.createContext(TOKENS_DEFAULT_VALUE); diff --git a/src/state/VaultsContext.tsx b/src/state/VaultsContext.tsx index 7eea54a..c2e6c91 100644 --- a/src/state/VaultsContext.tsx +++ b/src/state/VaultsContext.tsx @@ -2,7 +2,7 @@ import React from "react"; import { ethers } from "ethers"; import { Contract } from "ethers-multicall"; -export interface VaultsContext { +export interface IVaultsContext { wethVault?: ethers.Contract; setCurrentWETHVault: (currentVault: ethers.Contract) => void; daiVault?: ethers.Contract; @@ -56,6 +56,4 @@ export const VAULTS_DEFAULT_VALUE = { setCurrentMaticVaultRead: () => {}, }; -const vaultsContext = React.createContext(VAULTS_DEFAULT_VALUE); - -export default vaultsContext; +export const vaultsContext = React.createContext(VAULTS_DEFAULT_VALUE); diff --git a/src/state/index.tsx b/src/state/index.tsx new file mode 100644 index 0000000..144abcb --- /dev/null +++ b/src/state/index.tsx @@ -0,0 +1,19 @@ +export * from "./GovernanceContext"; + +export * from "./HardVaultsContext"; + +export * from "./MushroomNftContext"; + +export * from "./NetworkContext"; + +export * from "./OraclesContext"; + +export * from "./RewardsContext"; + +export * from "./SignerContext"; + +export * from "./TokensContext"; + +export * from "./VaultsContext"; + +export * from "./Web3ModalContext"; diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 9e1a393..81a5914 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -5,9 +5,7 @@ import { toast } from "react-toastify"; import successImg from "../assets/images/noti-success.png"; import errorImg from "../assets/images/noti-error.png"; import { FEATURES, NETWORKS } from "./constants"; -import { OraclesContext } from "../state/OraclesContext"; -import { VaultsContext } from "../state/VaultsContext"; -import { HardVaultsContext } from "../state/HardVaultsContext"; +import { IHardVaultsContext, IOraclesContext, IVaultsContext } from "../state"; export const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); @@ -352,7 +350,7 @@ export const getDefaultProvider = (chainId: number | undefined, name: string | u return provider; }; -export const validOracles = (chainId: number, oracles: OraclesContext): boolean => { +export const validOracles = (chainId: number, oracles: IOraclesContext): boolean => { let valid = !isUndefined(oracles.daiOracleRead) && !isUndefined(oracles.tcapOracleRead); if (isInLayer1(chainId)) { @@ -379,7 +377,7 @@ export const validOracles = (chainId: number, oracles: OraclesContext): boolean return valid; }; -export const validVaults = (chainId: number, vaults: VaultsContext): boolean => { +export const validVaults = (chainId: number, vaults: IVaultsContext): boolean => { let valid = !isUndefined(vaults.daiVaultRead); if (isInLayer1(chainId)) { @@ -405,7 +403,7 @@ export const validVaults = (chainId: number, vaults: VaultsContext): boolean => return valid; }; -export const validHardVaults = (chainId: number, hardVaults: HardVaultsContext): boolean => { +export const validHardVaults = (chainId: number, hardVaults: IHardVaultsContext): boolean => { let valid = true; if (isInLayer1(chainId)) { valid = From 9b8b14447389d433d8373f02ad6fa0c2635e9dd0 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 18 Nov 2022 09:05:27 -0600 Subject: [PATCH 175/278] working on vaults --- src/App.tsx | 134 +- src/components/Header.tsx | 66 +- src/components/Vault/Monitoring/Vaults.tsx | 4 +- src/components/Vault/Monitoring/common.tsx | 2 +- src/components/Vault/Monitoring/index.tsx | 4 +- src/components/Vaults/common.tsx | 112 +- src/components/Vaults/index.tsx | 60 +- src/components/Vaults/monitoring.tsx | 208 - src/components/Vaults/types.tsx | 7 + src/components/Vaults/usePrices.tsx | 10 +- src/components/Vaults/useRatios.tsx | 10 +- src/components/Welcome/Protocol.tsx | 35 + src/components/Welcome/Summary.tsx | 7 - src/components/Welcome/index.tsx | 6 + src/contracts/cryptex.json | 9250 ++++++++++++++++++++ src/styles/mint.scss | 166 +- src/styles/vault-monitoring.scss | 19 +- src/utils/constants.tsx | 18 + src/utils/utils.tsx | 9 + 19 files changed, 9805 insertions(+), 322 deletions(-) delete mode 100644 src/components/Vaults/monitoring.tsx diff --git a/src/App.tsx b/src/App.tsx index e4ec875..d973e5a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -47,6 +47,7 @@ import { isValidNetwork, getDefaultProvider, toFragment, + isArbitrum, isOptimism, isGoerli, } from "./utils/utils"; @@ -82,6 +83,10 @@ const App = () => { const match = useRouteMatch(); setMulticallAddress(NETWORKS.optimism.chainId, "0xD0E99f15B24F265074747B2A1444eB02b9E30422"); setMulticallAddress(NETWORKS.okovan.chainId, "0x4EFBb8983D5C18A8b6B5084D936B7D12A0BEe2c9"); + setMulticallAddress( + NETWORKS.arbitrum_goerli.chainId, + "0x108B25170319f38DbED14cA9716C54E5D1FF4623" + ); const setCurrentNetwork = (networkId: number, walletName: string, isBrowserWallet: boolean) => { let cNetwork; @@ -94,11 +99,19 @@ const App = () => { cNetwork = NETWORKS.rinkeby; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.rinkeby)); break; - case 10: + case NETWORKS.arbitrum.chainId: + cNetwork = NETWORKS.arbitrum; + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum)); + break; + case NETWORKS.arbitrum_goerli.chainId: + cNetwork = NETWORKS.arbitrum_goerli; + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum_goerli)); + break; + case NETWORKS.optimism.chainId: cNetwork = NETWORKS.optimism; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.optimism)); break; - case 69: + case NETWORKS.okovan.chainId: cNetwork = NETWORKS.okovan; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.okovan)); break; @@ -428,6 +441,113 @@ const App = () => { } }; + const setArbitrumContracts = async ( + chainId: number, + currentSigner: ethers.Signer, + ethcallProvider: Provider + ) => { + await ethcallProvider.init(); + signer.setCurrentEthcallProvider(ethcallProvider); + let contracts; + let wethAddress; + let daiAddress; + + switch (chainId) { + case NETWORKS.arbitrum.chainId: + contracts = cryptexJson[42161].mainnet.contracts; + wethAddress = NETWORKS.arbitrum.weth; + daiAddress = NETWORKS.arbitrum.dai; + break; + case NETWORKS.arbitrum_goerli.chainId: + contracts = cryptexJson[421613].arbitrum_goerli.contracts; + wethAddress = NETWORKS.arbitrum_goerli.weth; + daiAddress = NETWORKS.arbitrum_goerli.dai; + break; + default: + contracts = cryptexJson[42161].arbitrum.contracts; + wethAddress = NETWORKS.arbitrum.weth; + daiAddress = NETWORKS.arbitrum.dai; + break; + } + + // Set Vaults + const currentWETHVault = new ethers.Contract( + contracts.WETHVaultHandler.address, + contracts.WETHVaultHandler.abi, + currentSigner + ); + vaults.setCurrentWETHVault(currentWETHVault); + const currentDAIVault = new ethers.Contract( + contracts.DAIVaultHandler.address, + contracts.DAIVaultHandler.abi, + currentSigner + ); + vaults.setCurrentDAIVault(currentDAIVault); + + const currentWETHVaultRead = new Contract( + contracts.WETHVaultHandler.address, + toFragment(contracts.WETHVaultHandler.abi) + ); + vaults.setCurrentWETHVaultRead(currentWETHVaultRead); + const currentDAIVaultRead = new Contract( + contracts.DAIVaultHandler.address, + contracts.DAIVaultHandler.abi + ); + vaults.setCurrentDAIVaultRead(currentDAIVaultRead); + + // Set Tokens + const currentWETHToken = new ethers.Contract(wethAddress, ERC20.abi, currentSigner); + tokens.setCurrentWETHToken(currentWETHToken); + const currentDAIToken = new ethers.Contract(daiAddress, WETH.abi, currentSigner); + tokens.setCurrentDAIToken(currentDAIToken); + const currentTCAPToken = new ethers.Contract( + contracts.TCAP.address, + contracts.TCAP.abi, + currentSigner + ); + tokens.setCurrentTCAPToken(currentTCAPToken); + + const currentWETHTokenRead = new Contract(wethAddress, ERC20.abi); + tokens.setCurrentWETHTokenRead(currentWETHTokenRead); + const currentDAITokenRead = new Contract(daiAddress, WETH.abi); + tokens.setCurrentDAITokenRead(currentDAITokenRead); + const currentTCAPTokenRead = new Contract(contracts.TCAP.address, contracts.TCAP.abi); + tokens.setCurrentTCAPTokenRead(currentTCAPTokenRead); + + // Set Oracles + const currentWETHOracle = new ethers.Contract( + contracts.WETHOracle.address, + contracts.WETHOracle.abi, + currentSigner + ); + oracles.setCurrentWETHOracle(currentWETHOracle); + const currentDAIOracle = new ethers.Contract( + contracts.DAIOracle.address, + contracts.DAIOracle.abi, + currentSigner + ); + oracles.setCurrentDAIOracle(currentDAIOracle); + const currentTCAPOracle = new ethers.Contract( + contracts.TCAPOracle.address, + contracts.TCAPOracle.abi, + currentSigner + ); + oracles.setCurrentTCAPOracle(currentTCAPOracle); + + const currentWETHOracleRead = new Contract( + contracts.WETHOracle.address, + contracts.WETHOracle.abi + ); + oracles.setCurrentWETHOracleRead(currentWETHOracleRead); + const currentDAIOracleRead = new Contract(contracts.DAIOracle.address, contracts.DAIOracle.abi); + oracles.setCurrentDAIOracleRead(currentDAIOracleRead); + const currentTCAPOracleRead = new Contract( + contracts.TCAPOracle.address, + contracts.TCAPOracle.abi + ); + oracles.setCurrentTCAPOracleRead(currentTCAPOracleRead); + }; + const setOptimismContracts = async (currentSigner: ethers.Signer) => { const contracts = cryptexJson[10].optimism.contracts; @@ -653,7 +773,7 @@ const App = () => { daiAddress = NETWORKS.rinkeby.dai; linkAddress = contracts.LINK.address; break; - case 10: + case NETWORKS.optimism.chainId: contracts = cryptexJson[10].optimism.contracts; wethAddress = NETWORKS.optimism.weth; daiAddress = NETWORKS.optimism.dai; @@ -799,7 +919,9 @@ const App = () => { signer.setCurrentSigner(currentSigner); const ethcallProvider = new Provider(currentProvider); - if (isPolygon(network.chainId)) { + if (isArbitrum(network.chainId)) { + await setArbitrumContracts(network.chainId, currentSigner, ethcallProvider); + } else if (isPolygon(network.chainId)) { await setPolygonContracts(network.chainId, currentSigner, ethcallProvider); } else if (isGoerli(network.chainId)) { await setGoerliContracts(currentSigner, ethcallProvider); @@ -852,7 +974,9 @@ const App = () => { const provider = getDefaultProvider(parseInt(chainId), networkName); const randomSigner = ethers.Wallet.createRandom().connect(provider); const ethcallProvider = new Provider(randomSigner.provider); - if (isPolygon(parseInt(chainId))) { + if (isArbitrum(parseInt(chainId))) { + setArbitrumContracts(parseInt(chainId), randomSigner, ethcallProvider); + } else if (isPolygon(parseInt(chainId))) { setPolygonContracts(parseInt(chainId), randomSigner, ethcallProvider); } else if (isGoerli(parseInt(chainId))) { setGoerliContracts(randomSigner, ethcallProvider); diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 66351f4..63153d3 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -10,7 +10,14 @@ import { ethers } from "ethers"; import Davatar from "@davatar/react"; import NumberFormat from "react-number-format"; import { networkContext, signerContext, tokensContext, Web3ModalContext } from "../state"; -import { makeShortAddress, getENS, isInLayer1, isOptimism, isPolygon } from "../utils/utils"; +import { + makeShortAddress, + getENS, + isInLayer1, + isOptimism, + isPolygon, + isArbitrum, +} from "../utils/utils"; import { NETWORKS, FEATURES } from "../utils/constants"; import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; import { ReactComponent as ETHIcon } from "../assets/images/graph/weth.svg"; @@ -162,32 +169,31 @@ const Header = ({ signerAddress, isMobile }: props) => { // eslint-disable-next-line }, [signerAddress, currentNetwork.chainId]); - /* const changeLanguage = (lng: string) => { - i18n.changeLanguage(lng); - setLanguage(lng.toUpperCase()); - localStorage.setItem("language", lng); - }; */ - - /* const handleOnSelect = (eventKey: any, event: Object) => { - console.log(event); - changeLanguage(eventKey); - }; */ - - /* const LangDropDown = ({ className }: propsDD) => ( - - - {language} - + const showDropdown = (): boolean => !isMobile || (isMobile && !loading); - - English - French - 繁體中文 - - - ); */ + const ArbitrumToggle = () => { + <> + +
{process.env.REACT_APP_NETWORK_ID === "1" ? "Arbitrum" : "Goerli"}
+ ; + }; - const showDropdown = (): boolean => !isMobile || (isMobile && !loading); + const ArbitrumOpt = () => ( + + <>{ArbitrumToggle()} + + ); const EthereumToggle = () => ( <> @@ -281,14 +287,18 @@ const Header = ({ signerAddress, isMobile }: props) => { style={{ width: 200 }} >
- {isInLayer1(currentNetwork.chainId) && EthereumToggle()} - {isOptimism(currentNetwork.chainId) && OptimismToggle()} - {isPolygon(currentNetwork.chainId) && PolygonToggle()} + <> + {isInLayer1(currentNetwork.chainId) && EthereumToggle()} + {isOptimism(currentNetwork.chainId) && OptimismToggle()} + {isPolygon(currentNetwork.chainId) && PolygonToggle()} + {isArbitrum(currentNetwork.chainId) && ArbitrumToggle()} +
{EthereumOpt()} {OptimismOpt()} + {ArbitrumOpt()} {FEATURES.POLYGON && PolygonOpt()} diff --git a/src/components/Vault/Monitoring/Vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx index bde486d..a89f7fa 100644 --- a/src/components/Vault/Monitoring/Vaults.tsx +++ b/src/components/Vault/Monitoring/Vaults.tsx @@ -13,7 +13,7 @@ import { PaginationType, VaultsType } from "./types"; import { numberFormatStr } from "../../../utils/utils"; import { capitalize, - CollateralIcon, + TokenIcon, sortCollateralDesc, sortCollateralAsc, sortCollateralUsdDesc, @@ -258,7 +258,7 @@ export const Vaults = ({ >
{numberFormatStr(v.collateralValue, 4, 4)} - +
diff --git a/src/components/Vault/Monitoring/common.tsx b/src/components/Vault/Monitoring/common.tsx index 8f1ec76..abf3c8f 100644 --- a/src/components/Vault/Monitoring/common.tsx +++ b/src/components/Vault/Monitoring/common.tsx @@ -23,7 +23,7 @@ export const VAULT_STATUS = { export const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); -export const CollateralIcon = ({ name }: iconProps) => { +export const TokenIcon = ({ name }: iconProps) => { switch (name) { case "eth": return ; diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 678cd87..bfdb574 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -44,7 +44,7 @@ import { VaultsType, VaultsTotalsType, } from "./types"; -import { capitalize, CollateralIcon, VAULT_STATUS } from "./common"; +import { capitalize, TokenIcon, VAULT_STATUS } from "./common"; const pagDefault = { previous: 0, @@ -1021,7 +1021,7 @@ export const Monitoring = () => { className="text-left" >
- + {tokenSymbol.toUpperCase()}
diff --git a/src/components/Vaults/common.tsx b/src/components/Vaults/common.tsx index d46cbe4..a8f2ca3 100644 --- a/src/components/Vaults/common.tsx +++ b/src/components/Vaults/common.tsx @@ -1,4 +1,28 @@ -import { OraclePricesType, VaultsRatioType } from "./types"; +import React from "react"; +import { OraclePricesType, VaultsRatioType, VaultsType } from "./types"; +import { ReactComponent as WETHIcon } from "../../assets/images/graph/weth.svg"; +import { ReactComponent as DAIIcon } from "../../assets/images/graph/DAI.svg"; +import { ReactComponent as AAVEIcon } from "../../assets/images/graph/aave.svg"; +import { ReactComponent as LINKIcon } from "../../assets/images/graph/chainlink.svg"; +import { ReactComponent as UNIIcon } from "../../assets/images/graph/uni.svg"; +import { ReactComponent as SNXIcon } from "../../assets/images/graph/snx.svg"; +import { ReactComponent as MATICIcon } from "../../assets/images/graph/polygon.svg"; +import { ReactComponent as USDCIcon } from "../../assets/images/graph/usdc.svg"; +import { ReactComponent as WBTCIcon } from "../../assets/images/graph/wbtc.svg"; +import { ReactComponent as WETHIconSmall } from "../../assets/images/vault/eth.svg"; +import { ReactComponent as DAIIconSmall } from "../../assets/images/vault/dai.svg"; +import { ReactComponent as AAVEIconSmall } from "../../assets/images/vault/aave.svg"; +import { ReactComponent as LINKIconSmall } from "../../assets/images/vault/chainlink.svg"; +import { ReactComponent as UNIIconSmall } from "../../assets/images/vault/uni.svg"; +import { ReactComponent as SNXIconSmall } from "../../assets/images/vault/snx2.svg"; +import { ReactComponent as MATICIconSmall } from "../../assets/images/vault/polygon.svg"; +import { ReactComponent as WBTCIconSmall } from "../../assets/images/vault/bitcoin.svg"; +import { ReactComponent as USDCIconSmall } from "../../assets/images/vault/usdc.svg"; +import { ReactComponent as TCAPIcon } from "../../assets/images/tcap-coin.svg"; + +type iconProps = { + name: string; +}; export const getMinRatio = (ratios: VaultsRatioType, symbol: string, isHardVault: boolean) => { let minRatio = 200; @@ -85,3 +109,89 @@ export const VAULT_STATUS = { active: "active", liquidation: "liquidation", }; + +export const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); + +export const TokenIcon = ({ name }: iconProps) => { + switch (name) { + case "eth": + return ; + case "weth": + return ; + case "dai": + return ; + case "aave": + return ; + case "link": + return ; + case "uni": + return ; + case "snx": + return ; + case "matic": + return ; + case "wbtc": + return ; + case "tcap": + return ; + case "usdc": + return ; + default: + return <>; + } +}; + +export const TokenIconSmall = ({ name }: iconProps) => { + switch (name) { + case "eth": + return ; + case "weth": + return ; + case "dai": + return ; + case "aave": + return ; + case "link": + return ; + case "uni": + return ; + case "snx": + return ; + case "matic": + return ; + case "wbtc": + return ; + case "tcap": + return ; + case "usdc": + return ; + default: + return <>; + } +}; + +export const sortCollateralAsc = (a: VaultsType, b: VaultsType) => + parseFloat(a.collateralValue) - parseFloat(b.collateralValue); + +export const sortCollateralDesc = (a: VaultsType, b: VaultsType) => + parseFloat(b.collateralValue) - parseFloat(a.collateralValue); + +export const sortCollateralUsdAsc = (a: VaultsType, b: VaultsType) => + parseFloat(a.collateralUsd) - parseFloat(b.collateralUsd); + +export const sortCollateralUsdDesc = (a: VaultsType, b: VaultsType) => + parseFloat(b.collateralUsd) - parseFloat(a.collateralUsd); + +export const sortDebtAsc = (a: VaultsType, b: VaultsType) => + parseFloat(a.collateralValue) - parseFloat(b.collateralValue); + +export const sortDebtDesc = (a: VaultsType, b: VaultsType) => + parseFloat(b.debt) - parseFloat(a.debt); + +export const sortRatioAsc = (a: VaultsType, b: VaultsType) => a.ratio - b.ratio; + +export const sortRatioDesc = (a: VaultsType, b: VaultsType) => b.ratio - a.ratio; + +export const sortRewardAsc = (a: VaultsType, b: VaultsType) => a.netReward - b.netReward; + +export const sortRewardDesc = (a: VaultsType, b: VaultsType) => b.netReward - a.netReward; diff --git a/src/components/Vaults/index.tsx b/src/components/Vaults/index.tsx index dc5c48a..458d6c4 100644 --- a/src/components/Vaults/index.tsx +++ b/src/components/Vaults/index.tsx @@ -1,23 +1,57 @@ import React, { useContext, useEffect, useState } from "react"; - -import { signerContext } from "../../state/index"; import Monitoring from "./monitoring"; +import Vault2 from "./vault/Vault2"; +import { signerContext } from "../../state"; +import { VaultToUpdateType } from "./types"; const Vaults = () => { const signer = useContext(signerContext); - const [ownerAddress, setOwnerAddress] = useState(""); + const [currentAddress, setCurrentAddress] = useState(""); + const [isMinting, setMinting] = useState(false); + const [currrentVault, setCurrentVault] = useState({ + vaultId: "0", + assetSymbol: "", + collateralSymbol: "", + isHardVault: true, + }); + + const setVaultToUpdate = (vaultToUpdate: VaultToUpdateType) => { + setCurrentVault({ + vaultId: vaultToUpdate.vaultId, + assetSymbol: vaultToUpdate.assetSymbol, + collateralSymbol: vaultToUpdate.collateralSymbol, + isHardVault: vaultToUpdate.isHardVault, + }); + setMinting(true); + }; + + useEffect( + () => { + const load = async () => { + if (signer && signer.signer) { + const cAddress = await signer.signer.getAddress(); + setCurrentAddress(cAddress); + } + }; + load(); + }, + // eslint-disable-next-line + [signer.signer] + ); - useEffect(() => { - const load = async () => { - if (signer && signer.signer) { - const address = await signer.signer.getAddress(); - setOwnerAddress(address); - } - }; - load(); - }, [signer]); + if (isMinting) { + return ( + + ); + } - return ; + return ; }; export default Vaults; diff --git a/src/components/Vaults/monitoring.tsx b/src/components/Vaults/monitoring.tsx deleted file mode 100644 index ab9afe2..0000000 --- a/src/components/Vaults/monitoring.tsx +++ /dev/null @@ -1,208 +0,0 @@ -import React, { useContext, useRef, useState } from "react"; -import { Card, Row } from "react-bootstrap/esm"; -import Col from "react-bootstrap/Col"; -// import Spinner from "react-bootstrap/Spinner"; -import { useTranslation } from "react-i18next"; - -import { useRatios } from "./useRatios"; -import { usePrices } from "./usePrices"; -import { getMinRatio, getCollateralPrice, VAULT_STATUS } from "./common"; -import { DropdownItemType, PaginationType, VaultsTotalsType, VaultsType } from "./types"; - -const pagDefault = { - previous: 0, - current: 0, - next: 0, - pages: 0, - lastDataPage: 0, - itemsPerPage: 10, - itemsCount: 0, - lastId: "0", -}; - -const totalsDefault = { - vaults: 0, - collateral: "0", - collateralUSD: "0", - debt: "0", - debtUSD: "0", -}; - -type liqVaultsTempType = { - vaultId: string; - vaultType: string; - decimals: number; - hardVault: boolean; -}; - -const showAllVaults = true; - -type props = { - ownerAddress: string; -}; - -const Monitoring = ({ ownerAddress }: props) => { - const { t } = useTranslation(); - const prices = usePrices(); - const ratios = useRatios(); - const [skipQuery, setSkipQuery] = useState(false); - const [vaultsTotals, setVaultsTotals] = useState(totalsDefault); - const [vaultList, setVaultList] = useState>([]); - const [vaultGraphList, setVaultGraphList] = useState>([]); - const [pagination, setPagination] = useState(pagDefault); - const [loadMore, setLoadMore] = useState(false); - const [filteringRatios, setFilteringRatios] = useState(false); - const [radioValue, setRadioValue] = useState("2"); - const [tokenSymbol, setTokenSymbol] = useState("all"); - const [currentStatus, setCurrentStatus] = useState("all"); - const [vaultMode, setVaultMode] = useState("all"); - const [currentMinRatio, setCurrentMinRatio] = useState("0%"); - const [currentMaxRatio, setCurrentMaxRatio] = useState("2500%"); - const [renderTable, setRenderTable] = useState(false); - const ratioRangeDropdown = useRef(null); - const minRatioInput = useRef(null); - const maxRatioInput = useRef(null); - const radios = [ - { name: t("all-vaults"), value: "1" }, - { name: t("my-vaults"), value: "2" }, - ]; - const viewsList = [ - { key: "5", name: "5" }, - { key: "10", name: "10" }, - { key: "15", name: "15" }, - { key: "20", name: "20" }, - { key: "25", name: "25" }, - { key: "30", name: "30" }, - ]; - const statusList = [ - { key: "all", name: "All" }, - { key: VAULT_STATUS.empty, name: "Empty" }, - { key: VAULT_STATUS.ready, name: "Ready" }, - { key: VAULT_STATUS.active, name: "Active" }, - { key: VAULT_STATUS.liquidation, name: "Liquidation" }, - ]; - const modeList = [ - { key: "all", name: "All" }, - { key: "regular", name: "Regular" }, - { key: "hard", name: "Hard" }, - ]; - - const buildFilters = () => { - const weiLimit = "100000000"; - let filter = ""; - let ownerFilter = ""; - let vaultFilter = ""; - let statusFilter = ""; - let modeFilter = ""; - if (radioValue === "2" && ownerAddress !== "") { - ownerFilter = `, owner: "${ownerAddress}"`; - } - if (tokenSymbol !== "all") { - vaultFilter = `tokenSymbol: "${tokenSymbol.toUpperCase()}"`; - } - if (currentStatus !== "all") { - if (currentStatus === "empty") { - statusFilter = `collateral_lt: "${weiLimit}"`; - } - if (currentStatus === "ready") { - statusFilter = `collateral_gte: "${weiLimit}", debt_lt: "${weiLimit}"`; - } - } - if (vaultMode !== "all") { - const isHard = vaultMode === "hard" ? "true" : "false"; - modeFilter = "hardVault: ".concat(isHard); - } - - filter = ownerFilter; - if (vaultFilter !== "") { - filter = filter.concat(`, ${vaultFilter}`); - } - if (statusFilter !== "") { - filter = filter.concat(`, ${statusFilter}`); - } - if (modeFilter !== "") { - filter = filter.concat(`, ${modeFilter}`); - } - if (filter !== "") { - if (loadMore) { - filter = `, where: { blockTS_gt: "${pagination.lastId}" ${filter} }`; - } else { - filter = `, where: { blockTS_gt: "0" ${filter} }`; - } - } - return filter; - }; - - const str = - "query allVaults {" + - `vaults(first: 1000, orderBy: blockTS ${buildFilters()}) {` + - "id " + - "vaultId " + - "owner " + - "collateral " + - "debt " + - "currentRatio " + - "tokenSymbol " + - "hardVault " + - "blockTS " + - "underlyingProtocol { " + - "underlyingToken { " + - "decimals " + - "} " + - "}" + - "} " + - "}"; - - return ( -
- - - - -
- <>{t("totals")} -
-
- -
- -
- <>{t("vaults")} -
- - -
- <>{t("collateral")} (USD) -
- - -
-
- <>{t("debt")} -
-
- - -
- <>{t("debt")} (USD) -
- - - - - - -

{getMinRatio(ratios, "ETH", true).toString()}

-

{getMinRatio(ratios, "ETH", false).toString()}

-

{getMinRatio(ratios, "AAVE", true).toString()}

-

{getCollateralPrice(prices, "DAI")}

-

{getCollateralPrice(prices, "ETH")}

-
-
- - - - ); -}; - -export default Monitoring; diff --git a/src/components/Vaults/types.tsx b/src/components/Vaults/types.tsx index e4883a8..5005605 100644 --- a/src/components/Vaults/types.tsx +++ b/src/components/Vaults/types.tsx @@ -63,6 +63,13 @@ export type VaultsTotalsType = { debtUSD: string; }; +export type VaultToUpdateType = { + vaultId: string; + assetSymbol: string; + collateralSymbol: string; + isHardVault: boolean; +} + export type DropdownItemType = { key: string; name: string; diff --git a/src/components/Vaults/usePrices.tsx b/src/components/Vaults/usePrices.tsx index e0cfea5..22bfbc5 100644 --- a/src/components/Vaults/usePrices.tsx +++ b/src/components/Vaults/usePrices.tsx @@ -108,9 +108,13 @@ export const usePrices = (): OraclePricesType => { } }; - useEffect(() => { - loadPrices(); - }); + useEffect( + () => { + loadPrices(); + }, + // eslint-disable-next-line + [] + ); return oraclePrices; }; diff --git a/src/components/Vaults/useRatios.tsx b/src/components/Vaults/useRatios.tsx index 3f34adc..f53fb2f 100644 --- a/src/components/Vaults/useRatios.tsx +++ b/src/components/Vaults/useRatios.tsx @@ -107,9 +107,13 @@ export const useRatios = (): VaultsRatioType => { } }; - useEffect(() => { - loadRatios(); - }); + useEffect( + () => { + loadRatios(); + }, + // eslint-disable-next-line + [] + ); return vaultsRatio; }; diff --git a/src/components/Welcome/Protocol.tsx b/src/components/Welcome/Protocol.tsx index c4758fb..4b06bc6 100644 --- a/src/components/Welcome/Protocol.tsx +++ b/src/components/Welcome/Protocol.tsx @@ -18,6 +18,7 @@ import { ReactComponent as WBTCIcon } from "../../assets/images/graph/wbtc.svg"; import { ReactComponent as USDCIcon } from "../../assets/images/graph/usdc.svg"; import cryptexJson from "../../contracts/cryptex.json"; import { + isArbitrum, isInLayer1, isOptimism, isPolygon, @@ -98,6 +99,11 @@ const Protocol = ({ data }: props) => { const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); ethcalls.push(wbtcOraclePriceCall); } + if (isArbitrum(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + } + let daiOraclePrice; let currentTotalSupply; let wethOraclePrice; @@ -119,6 +125,12 @@ const Protocol = ({ data }: props) => { wbtcOraclePrice, usdcOraclePrice, ] = await signer.ethcallProvider?.all(ethcalls); + } else if (isArbitrum(currentNetwork.chainId)) { + console.log("Entra aqui"); + // @ts-ignore + [daiOraclePrice, currentTotalSupply, wethOraclePrice] = await signer.ethcallProvider?.all( + ethcalls + ); } else if (isOptimism(currentNetwork.chainId)) { // @ts-ignore [ @@ -136,6 +148,10 @@ const Protocol = ({ data }: props) => { ); } + console.log("DAI: ", daiOraclePrice.toString()); + console.log("wethOraclePrice: ", wethOraclePrice.toString()); + console.log("currentTotalSupply: ", currentTotalSupply.toString()); + let currentDAIStake = BigNumber.from(0); let currentWETHStake = BigNumber.from(0); let currentAAVEStake = BigNumber.from(0); @@ -165,6 +181,12 @@ const Protocol = ({ data }: props) => { case NETWORKS.polygon.chainId: contracts = cryptexJson[137].polygon.contracts; break; + case NETWORKS.arbitrum.chainId: + contracts = cryptexJson[42161].arbitrum.contracts; + break; + case NETWORKS.arbitrum_goerli.chainId: + contracts = cryptexJson[421613].arbitrum_goerli.contracts; + break; case NETWORKS.mumbai.chainId: contracts = cryptexJson[80001].mumbai.contracts; break; @@ -172,6 +194,7 @@ const Protocol = ({ data }: props) => { contracts = cryptexJson[4].rinkeby.contracts; break; } + await data.states.forEach((s: any) => { const cAddress = s.id.toLowerCase(); // @ts-ignore @@ -238,6 +261,15 @@ const Protocol = ({ data }: props) => { currentUNIStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); } } + + if (isArbitrum(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { + currentWETHStake = currentWETHStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); + } + } }); const formatDAI = ethers.utils.formatEther(currentDAIStake); @@ -275,6 +307,9 @@ const Protocol = ({ data }: props) => { wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); usdcUSD = ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)); } + if (isArbitrum(currentNetwork.chainId)) { + ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + } if (isOptimism(currentNetwork.chainId)) { ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); diff --git a/src/components/Welcome/Summary.tsx b/src/components/Welcome/Summary.tsx index a6a34ac..8de1565 100644 --- a/src/components/Welcome/Summary.tsx +++ b/src/components/Welcome/Summary.tsx @@ -202,13 +202,6 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { )} -
diff --git a/src/components/Welcome/index.tsx b/src/components/Welcome/index.tsx index 459a73b..ce86665 100644 --- a/src/components/Welcome/index.tsx +++ b/src/components/Welcome/index.tsx @@ -31,6 +31,12 @@ const WelcomeWrapper = ({ signerAddress, loadingContracts }: props) => { case NETWORKS.rinkeby.chainId: setApolloClient(clientOracle(GRAPHQL_ENDPOINT.rinkeby)); break; + case NETWORKS.arbitrum.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum)); + break; + case NETWORKS.arbitrum_goerli.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum_goerli)); + break; case NETWORKS.optimism.chainId: setApolloClient(clientOracle(GRAPHQL_ENDPOINT.optimism)); break; diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index 413ab47..88c58df 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -80406,6 +80406,9256 @@ } } }, + "42161": { + "arbitrum": { + "name": "arbitrum-one", + "chainId": "42161", + "contracts": { + "DAI": { + "address": "0x17aC26AB292660126d2baF16e5304DcbEc54340C", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "DAIOracle": { + "address": "0x435D960a2Dcfb04f9099F13A6B5d09AD8849AD6A", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "DAIVaultHandler": { + "address": "0xCEcB53DDa8C14796966a3797351E62cC72a98beE", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "_function", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bool", + "name": "_isDisabled", + "type": "bool" + } + ], + "name": "FunctionToggled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "NewMinimumTCAP", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "", + "type": "uint8" + } + ], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "_function", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "_isDisabled", + "type": "bool" + } + ], + "name": "toggleFunction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "TCAP": { + "address": "0x35B33115D3bf7DCE5380B9728e778393F00C3666", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + }, + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "NewCap", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "NewCapEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_tokenHandler", + "type": "address" + } + ], + "name": "VaultHandlerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_tokenHandler", + "type": "address" + } + ], + "name": "VaultHandlerRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vaultHandler", + "type": "address" + } + ], + "name": "addVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "capEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "enableCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vaultHandler", + "type": "address" + } + ], + "name": "removeVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + } + ], + "name": "setCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "vaultHandlers", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "TCAPOracle": { + "address": "0xEf0809527ce67fB95aAdbfcfB2e1345313389a6c", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "WETH": { + "address": "0x85f85C12FADEec638c63850117203f098386e6b9", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "WETHOracle": { + "address": "0x7E398fD108f81D7074c8512bd307270F936b19d3", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "WETHVaultHandler": { + "address": "0x94BD0Ea4f4497F877aFeeDb7b1242b286f94D621", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "_function", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bool", + "name": "_isDisabled", + "type": "bool" + } + ], + "name": "FunctionToggled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "NewMinimumTCAP", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "addCollateralETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "", + "type": "uint8" + } + ], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateralETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "_function", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "_isDisabled", + "type": "bool" + } + ], + "name": "toggleFunction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + } + } + } + }, + "421613": { + "arbitrum_goerli": { + "name": "arbitrum-goerli", + "chainId": "421613", + "contracts": { + "DAI": { + "address": "0x17aC26AB292660126d2baF16e5304DcbEc54340C", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "DAIOracle": { + "address": "0x435D960a2Dcfb04f9099F13A6B5d09AD8849AD6A", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "DAIVaultHandler": { + "address": "0xCEcB53DDa8C14796966a3797351E62cC72a98beE", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "_function", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bool", + "name": "_isDisabled", + "type": "bool" + } + ], + "name": "FunctionToggled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "NewMinimumTCAP", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "", + "type": "uint8" + } + ], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "_function", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "_isDisabled", + "type": "bool" + } + ], + "name": "toggleFunction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "TCAP": { + "address": "0x35B33115D3bf7DCE5380B9728e778393F00C3666", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + }, + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "NewCap", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "NewCapEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_tokenHandler", + "type": "address" + } + ], + "name": "VaultHandlerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_tokenHandler", + "type": "address" + } + ], + "name": "VaultHandlerRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vaultHandler", + "type": "address" + } + ], + "name": "addVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "capEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "enableCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vaultHandler", + "type": "address" + } + ], + "name": "removeVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + } + ], + "name": "setCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "vaultHandlers", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "TCAPOracle": { + "address": "0xEf0809527ce67fB95aAdbfcfB2e1345313389a6c", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "WETH": { + "address": "0x85f85C12FADEec638c63850117203f098386e6b9", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "WETHOracle": { + "address": "0x7E398fD108f81D7074c8512bd307270F936b19d3", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + } + ], + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "WETHVaultHandler": { + "address": "0x94BD0Ea4f4497F877aFeeDb7b1242b286f94D621", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "_function", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bool", + "name": "_isDisabled", + "type": "bool" + } + ], + "name": "FunctionToggled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "NewMinimumTCAP", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "addCollateralETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "", + "type": "uint8" + } + ], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateralETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "_function", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "_isDisabled", + "type": "bool" + } + ], + "name": "toggleFunction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "vaults", + "outputs": [ + { + "internalType": "uint256", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + } + } + } + }, "80001": { "mumbai": { "name": "mumbai", diff --git a/src/styles/mint.scss b/src/styles/mint.scss index 4baf3b1..e4a8aae 100644 --- a/src/styles/mint.scss +++ b/src/styles/mint.scss @@ -2,38 +2,16 @@ @import "./fonts"; .vault { + display: flex; + justify-content: center; + width: 100%; padding-bottom: 0px; - margin-bottom: 3rem; - - .lightning{ - position: fixed; - height: 100%; - width: 100%; - z-index: 1; - - -webkit-animation: flash ease-out 7s infinite; - -moz-animation: flash ease-out 7s infinite; - animation: flash ease-out 7s infinite; - animation-delay: 2s; - @-webkit-keyframes flash { - from { opacity: 0; } - 92% { opacity: 0; } - 93% { opacity: 0.6; } - 94% { opacity: 0.2; } - 96% { opacity: 0.9; } - to { opacity: 0; } - } - - @keyframes flash { - from { opacity: 0; } - 92% { opacity: 0; } - 93% { opacity: 0.6; } - 94% { opacity: 0.2; } - 96% { opacity: 1; } - to { opacity: 0; } - } - /*End! is that simple! */ + + &-container { + height: 30rem; + width: 80%; } + // Small devices (landscape phones, 576px and up) @media (min-width: 576px) { padding: 1rem 3rem; @@ -46,7 +24,7 @@ // Large devices (small laptos) @media (min-width: 1300px) { - padding: 3rem 3rem; + padding: 3rem; } .loading-container { @@ -312,6 +290,97 @@ } } + .asset-container { + display: flex; + flex-direction: column; + justify-content: space-between; + + .card { + min-height: 11rem; + } + + .eth { + filter: drop-shadow(0px 0px 15px rgba(111, 19, 202, 1)); + } + + .ratio { + display: none; + width: 1.9375rem; + filter: drop-shadow(0px 0px 15px rgba(15, 217, 255, 0.53)); + } + + .info-data { + display: flex; + flex-direction: column; + } + + .info { + margin-top: 1.7rem; + + .btn { + margin-top: 0.7rem; + height: 40px; + } + + p, + h4 { + padding-bottom: 0; + margin-bottom: 0; + } + + .amount h4 { + margin-bottom: 0.5rem; + } + } + + svg.small { + vertical-align: top; + margin-top: -5px; + width: 0.8rem; + + &.btc.small { + margin-top: -5px; + width: 1.8rem; + } + + &.dai.small { + margin-top: 0px; + width: 1.2rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.aave.small { + margin-top: -5px; + width: 1.7rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.link.small { + margin-top: 0px; + width: 1.7rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.uni.small { + margin-top: -5px; + width: 1.7rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.snx.small { + margin-top: -3px; + width: 1.5rem; + filter: drop-shadow(0px 0px 5px $highlight); + } + + &.usdc.small { + margin-top: -5px; + width: 1.7rem; + } + } + } + + .actions-container { margin-top: 1rem; column-gap: 2rem; @@ -329,22 +398,23 @@ padding: 0rem; } - .info { - display: flex; - align-items: top; - div { - width: 100%; - } - p { - text-align: right; + .btn-group { + margin: 0.35rem; + background-color: #281e31; + border: 1px solid #dfd1ea; + border-radius: 5px; + padding-left: 1px; + .btn-check { + display: none; } - .collateral-balance { - flex-direction: column; + .btn-secondary { + margin-bottom: 0rem; + background-color: #281e31; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; } - .amount { - display: flex; - flex-direction: row; - justify-content: flex-end; + .btn-check:checked+.btn { + background-color: $neon-highlight; } } @@ -597,7 +667,7 @@ } // Small devices (landscape phones, 576px and up) - @media (min-width: 576px) { + /* @media (min-width: 576px) { .actions-container { display: grid; grid-template-columns: auto; @@ -618,7 +688,7 @@ @media (min-width: 992px) { .actions-container { display: grid; - grid-template-columns: auto 33% 33%; + grid-template-columns: 40% 40%; margin-bottom: 0rem; } .balance { @@ -745,5 +815,5 @@ margin-bottom: 2rem; } } - } + } */ } \ No newline at end of file diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 655acef..e29a47d 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -151,13 +151,16 @@ .btn-group { border: 1px solid #dfd1ea; border-radius: 5px; + padding-left: 1px; margin-bottom: 0rem !important; .btn-secondary { margin-bottom: 0rem; font-size: 0.8rem; background-color: #281e31; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; } - .btn-secondary.active { + .btn-check:checked + .btn { background-color: $neon-highlight; } } @@ -337,6 +340,9 @@ color: $off-white; background-color: $darker; border: 1px solid $highlight; + .visually-hidden { + display: none; + } } .page-link:hover { background-color: $primary; @@ -385,6 +391,17 @@ .card-body { padding: 1.25rem 0rem; } + + .btn-update-vault { + background-color: transparent; + border: none; + span { + font-size: 1rem; + font-family: "Space Mono"; + text-decoration: underline; + } + } + @media (max-width: 800px) { .row { display: flex; diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 91a8c37..064595a 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -45,6 +45,22 @@ export const NETWORKS = { process.env.REACT_APP_FORTMATIC_INFURA_ID || "" ), }, + arbitrum: { + chainId: 42161, + hexChainId: "0xA4B1", + name: "Arbitrum One", + eth: "0x85f85C12FADEec638c63850117203f098386e6b9", + weth: "0x85f85C12FADEec638c63850117203f098386e6b9", + dai: "0x17aC26AB292660126d2baF16e5304DcbEc54340C", + }, + arbitrum_goerli: { + chainId: 421613, + hexChainId: "0x66EED", + name: "Arbitrum Goerli", + eth: "0x85f85C12FADEec638c63850117203f098386e6b9", + weth: "0x85f85C12FADEec638c63850117203f098386e6b9", + dai: "0x17aC26AB292660126d2baF16e5304DcbEc54340C", + }, optimism: { chainId: 10, hexChainId: "0xA", @@ -91,6 +107,8 @@ export const API_ENDPOINT = "https://api.cryptex.finance"; export const GRAPHQL_ENDPOINT = { mainnet: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-graph", rinkeby: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-rinkeby-two", + arbitrum: "https://api.thegraph.com/subgraphs/name/jdestephen/arbitrum-goerli-demo", + arbitrum_goerli: "https://api.thegraph.com/subgraphs/name/jdestephen/arbitrum-goerli-demo", optimism: "https://api.thegraph.com/subgraphs/name/cryptexfinance/cryptex-optimism", okovan: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo", polygon: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-polygon", diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 81a5914..9ac936e 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -273,12 +273,14 @@ export const isValidNetwork = (chainId: number) => { if (name.toLowerCase() === "mainnet") { return ( chainId === NETWORKS.mainnet.chainId || + chainId === NETWORKS.arbitrum.chainId || (FEATURES.OPTIMISM && chainId === NETWORKS.optimism.chainId) || (FEATURES.POLYGON && chainId === NETWORKS.polygon.chainId) ); } return ( chainId === NETWORKS.rinkeby.chainId || + chainId === NETWORKS.arbitrum_goerli.chainId || (FEATURES.OPTIMISM && chainId === NETWORKS.okovan.chainId) || (FEATURES.POLYGON && chainId === NETWORKS.mumbai.chainId) ); @@ -295,6 +297,13 @@ export const isInLayer1 = (chainId: number | undefined) => { return false; }; +export const isArbitrum = (chainId: number | undefined) => { + if (!isUndefined(chainId)) { + return chainId === NETWORKS.arbitrum.chainId || chainId === NETWORKS.arbitrum_goerli.chainId; + } + return false; +}; + export const isOptimism = (chainId: number | undefined) => { if (!isUndefined(chainId)) { return chainId === NETWORKS.optimism.chainId || chainId === NETWORKS.okovan.chainId; From ac446d20edda6defbebbb13fc5407947b64204d7 Mon Sep 17 00:00:00 2001 From: Jorge Destephen Lavaire Date: Fri, 18 Nov 2022 09:27:29 -0600 Subject: [PATCH 176/278] Update univ3.tsx --- src/utils/univ3.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx index 44a41ea..7ecf184 100644 --- a/src/utils/univ3.tsx +++ b/src/utils/univ3.tsx @@ -8,6 +8,13 @@ export const UNIV3 = { id: "0x11456b3750E991383bB8943118ed79C1afdEE192", feeTier: 3000, incentives: [ + { + rewardToken: "0x321C2fE4446C7c963dc41Dd58879AF648838f98D", + pool: "0x11456b3750E991383bB8943118ed79C1afdEE192", + startTime: 1668783166, + endTime: 1676518601, + refundee: "0xa70b638B70154EdfCbb8DbbBd04900F328F32c35", + }, { rewardToken: "0x321C2fE4446C7c963dc41Dd58879AF648838f98D", pool: "0x11456b3750E991383bB8943118ed79C1afdEE192", From abb004f2283565abd7db855d70392df7c28b58e7 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 18 Nov 2022 10:03:42 -0600 Subject: [PATCH 177/278] ts updates --- src/components/MushroomNft/Sewagefruit.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MushroomNft/Sewagefruit.tsx b/src/components/MushroomNft/Sewagefruit.tsx index 494456e..0aee10c 100644 --- a/src/components/MushroomNft/Sewagefruit.tsx +++ b/src/components/MushroomNft/Sewagefruit.tsx @@ -360,7 +360,7 @@ const SewageFruit = () => { Connect your wallet to see if you are eligible to mint a Sewage Fruit. If you aren’t eligible, public mint will be available on {mintPeriodEnd.toLocaleDateString()}.

- )} + )} From 99c5624d1e8e9569f53878fbf5a80916ac7c6087 Mon Sep 17 00:00:00 2001 From: Jorge Destephen Lavaire Date: Fri, 18 Nov 2022 12:45:13 -0600 Subject: [PATCH 178/278] Uptadet univ3 rewards start and end time --- src/utils/univ3.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx index 7ecf184..c05b2c8 100644 --- a/src/utils/univ3.tsx +++ b/src/utils/univ3.tsx @@ -11,8 +11,8 @@ export const UNIV3 = { { rewardToken: "0x321C2fE4446C7c963dc41Dd58879AF648838f98D", pool: "0x11456b3750E991383bB8943118ed79C1afdEE192", - startTime: 1668783166, - endTime: 1676518601, + startTime: 1668805867, + endTime: 1676754667, refundee: "0xa70b638B70154EdfCbb8DbbBd04900F328F32c35", }, { From fa260870c67296e7d88e1167e79c05aab33c1c7c Mon Sep 17 00:00:00 2001 From: Jorge Destephen Lavaire Date: Fri, 18 Nov 2022 13:12:19 -0600 Subject: [PATCH 179/278] Update Apr.tsx --- src/components/Farm/UniV3Rewards/Apr.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Farm/UniV3Rewards/Apr.tsx b/src/components/Farm/UniV3Rewards/Apr.tsx index 47951d4..3b5ce28 100644 --- a/src/components/Farm/UniV3Rewards/Apr.tsx +++ b/src/components/Farm/UniV3Rewards/Apr.tsx @@ -28,7 +28,7 @@ const Apr = ({ incentive, stakerContractRead }: props) => { totalAmount0 totalAmount1 } - positions(where: { staked: true, stakedBlockNumber_gt: 15361736 }) { + positions(where: { staked: true, stakedBlockNumber_gt: 15998870 }) { id } } From 54d6ebdbd41c8ea19b72f0ec84a2661b5c0943ed Mon Sep 17 00:00:00 2001 From: Jorge Destephen Lavaire Date: Fri, 18 Nov 2022 16:45:22 -0600 Subject: [PATCH 180/278] update apr subgraph id --- src/components/Farm/UniV3Rewards/Apr.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Farm/UniV3Rewards/Apr.tsx b/src/components/Farm/UniV3Rewards/Apr.tsx index 3b5ce28..f5fd20f 100644 --- a/src/components/Farm/UniV3Rewards/Apr.tsx +++ b/src/components/Farm/UniV3Rewards/Apr.tsx @@ -23,7 +23,7 @@ const Apr = ({ incentive, stakerContractRead }: props) => { const TVL = gql` query aprs { - apr(id: "1") { + apr(id: "2") { id totalAmount0 totalAmount1 From d7f03627d4ffc77ad0dcb0eededa48b1b78ab5c2 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 28 Nov 2022 09:29:23 -0600 Subject: [PATCH 181/278] updated --- public/locales/en/translation.json | 4 +- src/App.tsx | 2 +- src/components/Vaults/common.tsx | 4 +- src/components/Vaults/index.tsx | 13 +- .../Vaults/monitoring/Liquidate.tsx | 350 +++++ .../Vaults/monitoring/Pagination.tsx | 95 ++ src/components/Vaults/monitoring/Vaults.tsx | 361 +++++ src/components/Vaults/monitoring/index.tsx | 865 ++++++++++++ src/components/Vaults/vault/Vault2.tsx | 202 +++ src/components/Vaults/vault/VaultForm.tsx | 1159 ++++++++++++++++ src/components/Vaults/vault/index.tsx | 1199 +++++++++++++++++ src/hooks/index.tsx | 6 + .../Vaults => hooks}/usePrices.tsx | 7 +- .../Vaults => hooks}/useRatios.tsx | 6 +- src/hooks/useVault.tsx | 186 +++ src/styles/_colors.scss | 3 +- src/styles/app.scss | 98 +- src/styles/mint2.scss | 543 ++++++++ src/styles/mintindex.scss | 546 ++++++++ src/styles/modal.scss | 2 +- src/styles/vault-monitoring.scss | 9 +- 21 files changed, 5640 insertions(+), 20 deletions(-) create mode 100644 src/components/Vaults/monitoring/Liquidate.tsx create mode 100644 src/components/Vaults/monitoring/Pagination.tsx create mode 100644 src/components/Vaults/monitoring/Vaults.tsx create mode 100644 src/components/Vaults/monitoring/index.tsx create mode 100644 src/components/Vaults/vault/Vault2.tsx create mode 100644 src/components/Vaults/vault/VaultForm.tsx create mode 100644 src/components/Vaults/vault/index.tsx rename src/{components/Vaults => hooks}/usePrices.tsx (97%) rename src/{components/Vaults => hooks}/useRatios.tsx (96%) create mode 100644 src/hooks/useVault.tsx create mode 100644 src/styles/mint2.scss create mode 100644 src/styles/mintindex.scss diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 8fcf727..f7be31c 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -94,9 +94,9 @@ "subtitle1": "Select your Collateral", "no-connected": "No wallet connected. Please Connect your wallet to Create a Vault and approve your collateral to start minting TCAP tokens.", "approve": "Approve Vault", - "approve-text": "Vault not approved. Please approve your collateral to start minting TCAP tokens.", + "approve-text": "Vault not approved. Please approve your collateral to start minting {{asset}} tokens.", "create": "Create Vault", - "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting TCAP tokens.", + "create-text": "No vault Created. Please Create a Vault and approve your collateral to start minting {{asset}} tokens.", "balance-title": "{{vault}} Balance", "ratio-title": "Vault Ratio", "ratio-warning": "Ratio must be > {{minRatio}}% or you will be liquidated.", diff --git a/src/App.tsx b/src/App.tsx index d973e5a..e8bdfdb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -990,7 +990,7 @@ const App = () => { // Execute the created function directly loadProvider(); // eslint-disable-next-line - }, [web3Modal]); + }, []); const handlers = useSwipeable({ onSwipedLeft: () => setShowSidebar(true), diff --git a/src/components/Vaults/common.tsx b/src/components/Vaults/common.tsx index a8f2ca3..e87614a 100644 --- a/src/components/Vaults/common.tsx +++ b/src/components/Vaults/common.tsx @@ -113,7 +113,7 @@ export const VAULT_STATUS = { export const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); export const TokenIcon = ({ name }: iconProps) => { - switch (name) { + switch (name.toLowerCase()) { case "eth": return ; case "weth": @@ -135,7 +135,7 @@ export const TokenIcon = ({ name }: iconProps) => { case "tcap": return ; case "usdc": - return ; + return ; default: return <>; } diff --git a/src/components/Vaults/index.tsx b/src/components/Vaults/index.tsx index 458d6c4..a110e86 100644 --- a/src/components/Vaults/index.tsx +++ b/src/components/Vaults/index.tsx @@ -1,5 +1,6 @@ import React, { useContext, useEffect, useState } from "react"; import Monitoring from "./monitoring"; +import Vault from "./vault"; import Vault2 from "./vault/Vault2"; import { signerContext } from "../../state"; import { VaultToUpdateType } from "./types"; @@ -43,15 +44,17 @@ const Vaults = () => { return ( setMinting(false)} /> ); } - return ; + return ( + <> + + + ); }; export default Vaults; diff --git a/src/components/Vaults/monitoring/Liquidate.tsx b/src/components/Vaults/monitoring/Liquidate.tsx new file mode 100644 index 0000000..326534d --- /dev/null +++ b/src/components/Vaults/monitoring/Liquidate.tsx @@ -0,0 +1,350 @@ +import React, { useContext, useEffect, useState } from "react"; +import { Button, Form } from "react-bootstrap"; +import Table from "react-bootstrap/Table"; +import { ethers, BigNumber } from "ethers"; +import InputGroup from "react-bootstrap/esm/InputGroup"; +import Modal from "react-bootstrap/esm/Modal"; +import NumberFormat from "react-number-format"; +import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; +import Tooltip from "react-bootstrap/esm/Tooltip"; +import { useTranslation } from "react-i18next"; +import "../../../styles/modal.scss"; +import { networkContext, oraclesContext, signerContext } from "../../../state"; +import { VaultsType } from "../types"; +import { useVault } from "../../../hooks"; +import { + errorNotification, + isPolygon, + notifyUser, + numberFormatStr, + toUSD, +} from "../../../utils/utils"; + +type props = { + show: boolean; + currentAddress: string; + liqVault: VaultsType | null; + onHide: () => void; + refresh: (collateral: ethers.BigNumberish, debt: ethers.BigNumberish) => void; +}; + +const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) => { + const { t } = useTranslation(); + const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); + const oracles = useContext(oraclesContext); + const { + currentVault, + currentAssetRead, + currentVaultRead, + currentCollateralOracleRead, + currentAssetOracleRead, + } = useVault( + "TCAP", + liqVault ? liqVault?.collateralSymbol : "WETH", + liqVault ? liqVault.isHardVault : true + ); + + const [assetBalance, setAssetBalance] = useState("0"); + const [assetPrice, setAssetPrice] = useState("0"); + const [requiredTcap, setRequiredTcap] = useState("0"); + const [maxTcap, setMaxTcap] = useState("0"); + const [maxTcapUSD, setMaxTcapUSD] = useState("0"); + const [reward, setReward] = useState("0"); + const [rewardUSD, setRewardUSD] = useState("0"); + const [burnFee, setBurnFee] = useState("0"); + const [burnFeeUsd, setBurnFeeUsd] = useState("0"); + const [canLiquidate, setCanLiquidate] = useState(true); + const [valuesUpdated, setValuesUpdated] = useState(false); + + useEffect(() => { + async function load() { + if ( + currentAddress !== "" && + liqVault !== null && + currentAssetOracleRead !== null && + currentVault !== null + ) { + if (liqVault.id !== "") { + try { + const assetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + const assetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); + const reqTcapCall = await currentVaultRead?.requiredLiquidationTCAP( + BigNumber.from(liqVault.id) + ); + const liqRewardCall = await currentVaultRead?.liquidationReward( + BigNumber.from(liqVault.id) + ); + const oraclePriceCall = await currentCollateralOracleRead?.getLatestAnswer(); + const ethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [balance, assetOraclePrice, reqTcap, liqReward, collateralPrice, ethPrice] = + await signer.ethcallProvider?.all([ + assetBalanceCall, + assetPriceCall, + reqTcapCall, + liqRewardCall, + oraclePriceCall, + ethOraclePriceCall, + ]); + const assetBalanceText = ethers.utils.formatEther(balance); + const assetPriceText = ethers.utils.formatEther(assetOraclePrice); + const reqTcapText = ethers.utils.formatEther(reqTcap); + const liqRewardText = ethers.utils.formatUnits(liqReward, liqVault.decimals); + const priceText = ethers.utils.formatEther(collateralPrice.mul(10000000000)); + const ethPriceText = ethers.utils.formatEther(ethPrice.mul(10000000000)); + const currentLiqFee = await currentVault?.getFee(reqTcap); + const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + + console.log("ASSE: ", currentVaultRead); + console.log("REQ: ", reqTcapText); + + setAssetBalance(assetBalanceText); + setAssetPrice(assetPriceText); + setRequiredTcap(reqTcapText); + setMaxTcap(reqTcapText); + setMaxTcapUSD(toUSD(reqTcapText, assetPriceText).toFixed(2)); + setReward(liqRewardText); + setRewardUSD(toUSD(liqRewardText, priceText).toFixed(2)); + setBurnFee(ethFee); + setBurnFeeUsd(toUSD(ethFee, ethPriceText).toFixed(2)); + setValuesUpdated(!valuesUpdated); + } catch (error) { + // Error happens when trying to calculate reward on a not liquidable vault + if (error.code !== "UNPREDICTABLE_GAS_LIMIT") { + console.log(error); + } + } + } + } + } + load(); + // eslint-disable-next-line + }, [currentAddress, liqVault, currentVaultRead, currentAssetOracleRead]); + + const onChangeMaxTcap = (event: React.ChangeEvent) => { + setMaxTcap(event.target.value); + setMaxTcapUSD(toUSD(event.target.value, assetPrice).toFixed(2)); + }; + + const minTcap = async (e: React.MouseEvent) => { + e.preventDefault(); + setMaxTcap(requiredTcap); + setMaxTcapUSD(toUSD(requiredTcap, assetPrice).toFixed(2)); + }; + + const loadVaultData = async () => { + if (liqVault) { + const [, collateral, , debt] = await currentVault?.getVault(BigNumber.from(liqVault.id)); + refresh(collateral, debt); + } + }; + + const liquidate = async (event: React.MouseEvent) => { + event.preventDefault(); + if (currentAddress && liqVault !== null && canLiquidate && currentVault) { + setCanLiquidate(false); + const maxAmountTcap = parseFloat(maxTcap); + if (maxTcap && maxAmountTcap > 0) { + if (maxAmountTcap >= parseFloat(requiredTcap)) { + if (maxAmountTcap <= parseFloat(assetBalance)) { + try { + const currentLiqFee = await currentVault?.getFee( + ethers.utils.parseEther(requiredTcap) + ); + const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee); + const tx = await currentVault.liquidateVault( + BigNumber.from(liqVault.id), + ethers.utils.parseEther(maxTcap), + { value: increasedFee } + ); + notifyUser(tx, loadVaultData); + await loadVaultData(); + setMaxTcap(""); + onHide(); + } catch (error) { + errorNotification("Burn fee less than required."); + } + } else { + errorNotification(t("errors.no-tcap")); + } + } else { + errorNotification(t("errors.less-tcap")); + } + } else { + errorNotification(t("errors.empty")); + } + setCanLiquidate(true); + } + }; + + const netReward = parseFloat(rewardUSD) - parseFloat(maxTcapUSD) - parseFloat(burnFeeUsd); + + const getTokeSymbol = () => { + if (liqVault !== null) { + if (liqVault.collateralSymbol === "WETH") { + return "ETH"; + } + return liqVault.collateralSymbol; + } + return ""; + }; + + const rewardHelp = () => ( + + <>{t("monitoring.reward-info")} + + ); + + const tcapAmountHelp = () => ( + + <>{t("monitoring.tcap-amount-info")} + + ); + + const netRewardHelp = () => ( + + <> + {t("monitoring.net-reward-info1")}:
+ {t("monitoring.net-reward-info2")} + +
+ ); + + const helpToolTip = (column: number) => { + let help = rewardHelp(); + if (column === 1) { + help = tcapAmountHelp(); + } else if (column === 3) { + help = netRewardHelp(); + } + return ( + + + + ); + }; + + return ( + { + setMaxTcap("0"); + setMaxTcapUSD("0"); + onHide(); + }} + > + + + <>{t("monitoring.liquidate-vault")} + + + +
+
+ + <> + + <>{t("amount-tcap")} + + + + MIN REQUIRED + + + + + + + + +
+ +
+ <>{t("monitoring.reward")}: + {" "} + {getTokeSymbol()} +
+
+ +
+ Burn Fee:{" "} + {" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} +
+
+
+ +
+ +
Vault Id Status + {numberFormatStr(v.id, 0, 0)}
{statusTag(index, v)} diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index 74d0a62..b3750e0 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -1,12 +1,15 @@ -import React, { useContext, useEffect, useState } from "react"; +import React, { useContext, useEffect, useRef, useState } from "react"; import { ethers, BigNumber } from "ethers"; +import Button from "react-bootstrap/esm/Button"; import ButtonGroup from "react-bootstrap/esm/ButtonGroup"; import Card from "react-bootstrap/esm/Card"; import Col from "react-bootstrap/Col"; import Dropdown from "react-bootstrap/Dropdown"; +import { FaArrowsAltH } from "react-icons/fa"; +import Form from "react-bootstrap/Form"; import Row from "react-bootstrap/esm/Row"; -import ToggleButton from "react-bootstrap/esm/ToggleButton"; import Spinner from "react-bootstrap/Spinner"; +import ToggleButton from "react-bootstrap/esm/ToggleButton"; import "../../../styles/vault-monitoring.scss"; import { useQuery, gql } from "@apollo/client"; import { useLocation } from "react-router-dom"; @@ -80,9 +83,11 @@ export const Monitoring = () => { const [vaultsRatio, setVaultsRatio] = useState(); const [vaultsTotals, setVaultsTotals] = useState(totalsDefault); const [vaultList, setVaultList] = useState>([]); + const [vaultGraphList, setVaultGraphList] = useState>([]); const [pagination, setPagination] = useState(pagDefault); const [loadMore, setLoadMore] = useState(false); const [pricesUpdated, setPricesUpdated] = useState(false); + const [filteringRatios, setFilteringRatios] = useState(false); // @ts-ignore const [ownerAddress, setOwnerAddress] = useState(state && state.address ? state.address : ""); // @ts-ignore @@ -90,7 +95,14 @@ export const Monitoring = () => { const [tokenSymbol, setTokenSymbol] = useState("all"); const [currentStatus, setCurrentStatus] = useState("all"); const [vaultMode, setVaultMode] = useState("all"); + const [currentMinRatio, setCurrentMinRatio] = useState("0%"); + const [currentMaxRatio, setCurrentMaxRatio] = useState("2500%"); + // const [minFilterRatio, setMinFilterRatio] = useState("0"); + // const [maxFilterRatio, setMaxFilterRatio] = useState("1500"); const [renderTable, setRenderTable] = useState(false); + const ratioRangeDropdown = useRef(null); + const minRatioInput = useRef(null); + const maxRatioInput = useRef(null); const radios = [ { name: "All Vaults", value: "1" }, { name: "My Vaults", value: "2" }, @@ -597,13 +609,46 @@ export const Monitoring = () => { return { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status }; }; + const isValidRatio = (value: string) => { + let valid = false; + if (!Number.isNaN(value)) { + valid = Number.parseFloat(value) >= 0; + } + return valid; + }; + + const getMinRangeRatio = (): number => { + if (minRatioInput && minRatioInput.current) { + // @ts-ignore + const minRatio = minRatioInput.current.value; + if (isValidRatio(minRatio)) { + return parseFloat(minRatio); + } + } + return 0; + }; + + const getMaxRangeRatio = (): number => { + if (maxRatioInput && maxRatioInput.current) { + // @ts-ignore + const maxRatio = maxRatioInput.current.value; + if (isValidRatio(maxRatio)) { + return parseFloat(maxRatio); + } + } + return 3000; + }; + const loadVaults = async (vaultsData: any) => { const vData = new Array(); const vLiquidables = new Array(); const totals = { ...totalsDefault }; + const minFilterRatio = getMinRangeRatio(); + const maxFilterRatio = getMaxRangeRatio(); setSkipQuery(true); setLoadMore(false); + setFilteringRatios(true); // setLiqLoaded(currentStatus !== VAULT_STATUS.liquidation); // @ts-ignore vaultsData.vaults.forEach((v) => { @@ -615,6 +660,11 @@ export const Monitoring = () => { if (currentStatus === VAULT_STATUS.active || currentStatus === VAULT_STATUS.liquidation) { addVault = currentStatus === status; } + // filter ratio + if (currentStatus !== VAULT_STATUS.empty && currentStatus !== VAULT_STATUS.ready) { + addVault = addVault && ratio >= minFilterRatio && ratio <= maxFilterRatio; + } + if (!showAllVaults) { addVault = v.tokenSymbol === "WETH" || v.tokenSymbol === "DAI"; } @@ -677,6 +727,7 @@ export const Monitoring = () => { } // Set pagination data confPagination(vData, pagination.itemsPerPage); + setFilteringRatios(false); }; const { loading, data, error } = useQuery(vaultsQuery, { @@ -688,6 +739,7 @@ export const Monitoring = () => { }, onCompleted: () => { if (pricesUpdated) { + setVaultGraphList(data); loadVaults(data); } }, @@ -763,6 +815,33 @@ export const Monitoring = () => { setVaultMode(newMode); }; + /* const onChangeMinFilterRatio = async (event: React.ChangeEvent) => { + setMinFilterRatio(event.target.value); + }; + + const onChangeMaxFilterRatio = async (event: React.ChangeEvent) => { + setMaxFilterRatio(event.target.value); + }; */ + + const onFilterRatioClick = () => { + if (minRatioInput && maxRatioInput) { + // @ts-ignore + const minRatio = minRatioInput.current.value; + // @ts-ignore + const maxRatio = maxRatioInput.current.value; + if (isValidRatio(minRatio) && isValidRatio(maxRatio)) { + setCurrentMinRatio(minRatio.concat("%")); + setCurrentMaxRatio(maxRatio.concat("%")); + // @ts-ignore + loadVaults(vaultGraphList); + if (ratioRangeDropdown !== null) { + // @ts-ignore + ratioRangeDropdown.current.click(); + } + } + } + }; + const onPageSelected = (pageNumber: number) => { const nextPage = pageNumber === pagination.pages ? 0 : pageNumber + 1; const newPagination = { @@ -883,7 +962,7 @@ export const Monitoring = () => {
<> + + Position + { - if (loadingLiq) { - console.log("ntra aqui"); - setRenderReward(!renderReward); - } - // eslint-disable-next-line - }, [loadingLiq]); */ - const liquidateVault = (index: number, lVault: VaultsType) => { setVaultIndex(index); setLiqVault(lVault); diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 0d0422b..ffcca0f 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -329,9 +329,13 @@ } .btn { width: 7rem; + margin-left: 1.5rem; } .btn.small { width: 5rem; + @media (max-width: 1550px) { + width: 7rem !important; + } } .btn.claim { background-color: #281e31; @@ -341,6 +345,11 @@ margin-right: 1rem; padding: 0.1rem 1rem; } + .btn.position-url { + border-width: 1px; + border-color: $green; + word-wrap: wrap; + } .number { font-size: 1rem; color: $white; From 06e97bce0b56a851ca143b5f55e67feb5f0f2258 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 22 Jun 2022 21:44:05 +0200 Subject: [PATCH 124/278] added claim reward button when user doesn't have positions --- src/components/Farm/UniV3Rewards/Rewards.tsx | 311 ++++++++++--------- src/styles/farm.scss | 10 +- 2 files changed, 180 insertions(+), 141 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 43ad113..f822af4 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -105,14 +105,23 @@ const Rewards = ({ // Read pool price const poolObserveCall = await poolContractRead?.observe([0, 10]); + // Read available to claim reward + const availableRewardCall = await stakerContractRead?.rewards( + ethTcapPool.incentives[0].rewardToken, + ownerAddress + ); + // @ts-ignore - const [observations] = await signer.ethcallProvider?.all([poolObserveCall]); + const [observations, availableRewardWei] = await signer.ethcallProvider?.all([ + poolObserveCall, + availableRewardCall, + ]); const tickCumulative0 = observations.tickCumulatives[0]; const tickCumulative1 = observations.tickCumulatives[1]; const currentCumPrice = calculateCumulativePrice(tickCumulative0, tickCumulative1, 10); setCumulativePrice(currentCumPrice); - + setAvailableReward(parseFloat(ethers.utils.formatEther(availableRewardWei))); positionsData.positions.forEach(async (p: any) => { if (p.poolAddress === ethTcapPool.id.toLowerCase()) { const position = { ...positionDefaultValues }; @@ -131,19 +140,12 @@ const Rewards = ({ const nfpCall = await nfpmContractRead?.getApproved(p.id); const lpDepositsCall = await stakerContractRead?.deposits(p.id); const lpStakesCall = await stakerContractRead?.stakes(p.id, incentiveId); - const availableRewardCall = await stakerContractRead?.rewards( - ethTcapPool.incentives[0].rewardToken, - ownerAddress - ); // @ts-ignore - const [nfpAddress, depositsEth, stakesEth, availableRewardWei] = - await signer.ethcallProvider?.all([ - nfpCall, - lpDepositsCall, - lpStakesCall, - availableRewardCall, - ]); - setAvailableReward(parseFloat(ethers.utils.formatEther(availableRewardWei))); + const [nfpAddress, depositsEth, stakesEth] = await signer.ethcallProvider?.all([ + nfpCall, + lpDepositsCall, + lpStakesCall, + ]); if ( depositsEth.owner === ownerAddress && depositsEth.tickLower === position.tickLower && @@ -265,136 +267,146 @@ const Rewards = ({ const sortPositions = (p1: PositionType, p2: PositionType) => p1.lpTokenId - p2.lpTokenId; - const RenderRewards = () => ( - <> -
-
-
-
Fee tier:
- -
-
-
TCAP/WETH Price:
- -
-
-
APR:
- -
+ const RenderHeader = (): React.ReactElement => ( +
+
+
+
Fee tier:
+
-
-
- Available to Claim - - In order to claim rewards, you need to unstake your token. - - } - > - - - : -
-
- - -
-
- -
+
+
TCAP/WETH Price:
+ +
+
+
APR:
+
- - - - - + + + + - + + + + + ); + + const RenderRewards = () => ( + <> + +
- - Position - - Position Min and Max price represents TCAP per WETH.
- - } - > - -
-
- Status - - Pending: LP token needs to be - approved in order to be staked.
- Unstaked: LP token hasn't been staked - or deposited.
- Deposited: LP token needs to be - stake to earn rewards.
- Staked: LP token is staked and earning - rewards.
- Out of range: You aren't earning - rewards because the price is out of your position range. - - } - > - -
-
-
-
Current Reward
-
- - Amount of CTX that it's been earn while the LP token is staked. You must - unstake the LP token in order to claim the reward. - - } - > - - -
+
+
+ Available to Claim + + In order to claim rewards, you need to unstake your token. + + } + > + + + : +
+
+ + +
+
+ +
+
+
+ ); + + const RenderTableHeader = () => ( +
+ + Position + + Position Min and Max price represents TCAP per WETH.
+ + } + > + +
+
+ Status + + Pending: LP token needs to be + approved in order to be staked.
+ Unstaked: LP token hasn't been staked or + deposited.
+ Deposited: LP token needs to be stake + to earn rewards.
+ Staked: LP token is staked and earning + rewards.
+ Out of range: You aren't earning + rewards because the price is out of your position range. + + } + > + +
+
+
+
Current Reward
+
+ + Amount of CTX that it's been earn while the LP token is staked. You must unstake + the LP token in order to claim the reward. + + } + > + +
-
-
+
+ {ethTcapPositions.sort(sortPositions).map((position, index) => ( @@ -502,6 +514,25 @@ const Rewards = ({

Uniswap V3 Liquidity Rewards

+ {availableReward > 0.001 && ( +
+
Unclaimed Reward:
+
+ + +
+
+ +
+
+ )}
{ownerAddress !== "" ? ( diff --git a/src/styles/farm.scss b/src/styles/farm.scss index ffcca0f..1a21549 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -299,7 +299,10 @@ } &.univ3 { .card-header { - padding-left: 0rem; + display: flex; + justify-content: space-between; + align-items: baseline; + padding-left: 0rem; } .card-body { padding: 1rem 0rem; @@ -345,6 +348,11 @@ margin-right: 1rem; padding: 0.1rem 1rem; } + .claim-button2 { + .btn.claim { + margin-right: 0rem; + } + } .btn.position-url { border-width: 1px; border-color: $green; From a2b651fdbf6689b22db0cc75af70f4e7d4f25129 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 27 Jun 2022 22:23:48 +0200 Subject: [PATCH 125/278] fixed show claim button twice --- src/components/Farm/UniV3Rewards/Rewards.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index f822af4..0fbb120 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -514,7 +514,7 @@ const Rewards = ({

Uniswap V3 Liquidity Rewards

- {availableReward > 0.001 && ( + {availableReward > 0.001 && ethTcapPositions.length === 0 && (
Unclaimed Reward:
From 837628bb018502be1b8282654c673c6c4db9a1e4 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sun, 10 Jul 2022 12:32:31 -0600 Subject: [PATCH 126/278] remove helmeet libraries --- public/index.html | 1 - src/components/Welcome/Summary.tsx | 7 ++++++ yarn.lock | 38 ++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index 2096bfe..133801a 100644 --- a/public/index.html +++ b/public/index.html @@ -73,7 +73,6 @@ gtag("config", "G-WKTME4J30E"); - TCAP - By Cryptex Finance diff --git a/src/components/Welcome/Summary.tsx b/src/components/Welcome/Summary.tsx index b90638b..a5e19b5 100644 --- a/src/components/Welcome/Summary.tsx +++ b/src/components/Welcome/Summary.tsx @@ -190,6 +190,13 @@ const Summary = ({ signerAddress, loadingContracts }: props) => {

CTX Price:

)} +
diff --git a/yarn.lock b/yarn.lock index cf79d89..8616715 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2365,6 +2365,13 @@ dependencies: "@types/react" "^16" +"@types/react-helmet@^6.1.5": + version "6.1.5" + resolved "https://registry.yarnpkg.com/@types/react-helmet/-/react-helmet-6.1.5.tgz#35f89a6b1646ee2bc342a33a9a6c8777933f9083" + integrity sha512-/ICuy7OHZxR0YCAZLNg9r7I9aijWUWvxaPR6uTuyxe8tAj5RL4Sw1+R6NhXUtOsarkGYPmaHdBDvuXh2DIN/uA== + dependencies: + "@types/react" "*" + "@types/react-router-dom@^5.1.6": version "5.3.2" resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.2.tgz#ebd8e145cf056db5c66eb1dac63c72f52e8542ee" @@ -12668,6 +12675,32 @@ react-error-overlay@^6.0.9: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.10.tgz#0fe26db4fa85d9dbb8624729580e90e7159a59a6" integrity sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA== +react-fast-compare@^3.1.1, react-fast-compare@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-helmet-async@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" + integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== + dependencies: + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" + +react-helmet@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" + integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== + dependencies: + object-assign "^4.1.1" + prop-types "^15.7.2" + react-fast-compare "^3.1.1" + react-side-effect "^2.1.0" + react-i18next@^11.15.3: version "11.15.3" resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.15.3.tgz#7608fb3cacc02ac75a62fc2d68b579f140b198dd" @@ -12817,6 +12850,11 @@ react-scripts@4.0.0: optionalDependencies: fsevents "^2.1.3" +react-side-effect@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.2.tgz#dc6345b9e8f9906dc2eeb68700b615e0b4fe752a" + integrity sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw== + react-swipeable@^6.1.0: version "6.2.0" resolved "https://registry.yarnpkg.com/react-swipeable/-/react-swipeable-6.2.0.tgz#057271cb7a6fb4af9d2a3f6d80ccdf33e2f64d47" From b41868e9fd0ba9567ff0d3e187b269feb0878103 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 29 Jul 2022 11:57:49 -0600 Subject: [PATCH 127/278] disable sushi eht/tcap reward --- src/components/Farm/index.tsx | 56 ++--------------------------------- 1 file changed, 2 insertions(+), 54 deletions(-) diff --git a/src/components/Farm/index.tsx b/src/components/Farm/index.tsx index 8e1687b..1bc124b 100644 --- a/src/components/Farm/index.tsx +++ b/src/components/Farm/index.tsx @@ -61,7 +61,7 @@ const Farm = () => { // APY const [, setEthVaultAPY] = useState("0"); const [, setDaiVaultAPY] = useState("0"); - const [ethPoolAPY, setEthPoolAPY] = useState("0"); + // const [ethPoolAPY, setEthPoolAPY] = useState("0"); const [ctxPoolAPY, setCtxPoolAPY] = useState("0"); const oneYear = 60 * 60 * 24 * 365; @@ -127,10 +127,6 @@ const Farm = () => { const rateWethCall = await rewards.wethRewardRead?.rewardRate(); const totalTcapDebtDaihCall = await rewards.daiRewardRead?.totalSupply(); const rateDaiCall = await rewards.daiRewardRead?.rewardRate(); - const reservesEthPoolCall = await tokens.wethPoolTokenRead?.getReserves(); - const totalSupplyEthPoolCall = await tokens.wethPoolTokenRead?.totalSupply(); - const rateEthPoolCall = await rewards.wethPoolRewardRead?.rewardRate(); - const LPsStakedCall = await rewards.wethPoolRewardRead?.totalSupply(); const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); const totalSupplyCtxPoolCall = await tokens.ctxPoolTokenRead?.totalSupply(); const rateCtxPoolCall = await rewards.ctxPoolRewardRead?.rewardRate(); @@ -146,10 +142,6 @@ const Farm = () => { rateWeth, totalTcapDebtDai, rateDai, - reservesEthPool, - totalSupplyEthPool, - rateEthPool, - LPsStaked, reservesCtxPool, totalSupplyCtxPool, rateCtxPool, @@ -163,10 +155,6 @@ const Farm = () => { rateWethCall, totalTcapDebtDaihCall, rateDaiCall, - reservesEthPoolCall, - totalSupplyEthPoolCall, - rateEthPoolCall, - LPsStakedCall, reservesCtxPoolCall, totalSupplyCtxPoolCall, rateCtxPoolCall, @@ -204,18 +192,6 @@ const Farm = () => { ) ); - // ETH Pool APY - setEthPoolAPY( - await getAPYFromLPRewards( - rateEthPool, - LPsStaked, - reservesEthPool, - totalSupplyEthPool, - currentPriceCTX, - parseFloat(currentPriceETH) - ) - ); - // CTX Pool APY setCtxPoolAPY( await getAPYFromLPRewards( @@ -549,24 +525,11 @@ const Farm = () => { + @@ -139,6 +145,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro + - -
-
-
{info && info.name}
- {isSigner && FEATURES.KEEPERS_API && ( - - )} -
- - {ethNameFormat()} - + +
+ + +
+ +
+
+
{info && info.name}
+ {isSigner && FEATURES.KEEPERS_API && ( + + )}
- -
-
- {shortAddress && ( - <> - {tokenOwnerStake && ( - - - - {round2(parseFloat(tokenOwnerStake.stake))} {t("staked")} - - - )} - - - - tally logo - - {t("history")} - + + {ethNameFormat()} + +
+ +
+
+ {shortAddress && ( + <> + {tokenOwnerStake && ( + + + + {round2(parseFloat(tokenOwnerStake.stake))} {t("staked")} + - - ethereum logo - - {t("contract")} + )} + + + + tally logo + + {t("history")} + + + + ethereum logo + + {t("contract")} + + + + )} +
+ {info.discord && ( + {t("click-copy")}} + > + + discord logo + + {info.discord} - + )} -
- {info.discord && ( - {t("click-copy")}} + {info.twitter && ( + + twitter logo + - - discord logo - - {info.discord} - - - - )} - {info.twitter && ( - - twitter logo - - {info.twitter} - - - )} -
-
-
-
-
-
{t("governance.why-me")}
+ {info.twitter} + + + )}
- - {whyHtml(info.why)} - - } - > -

- {whyBrief()} - {info.why.length > briefLength && ...} -

-
-
-
-
-
{t("governance.expertise")}
-

{info?.expertise}

-
- + +
+
+
{t("governance.why-me")}
- - - - {signer.signer && ( -
- {isTokenOwner() && ( -
- - - )} - - +
+
{t("governance.expertise")}
+

{info?.expertise}

+
+ + + + + + {signer.signer && ( +
+ {isTokenOwner() && ( +
+ - - )} - - - + )} + + + + + )} + + ); }; diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 03767da..532f7ff 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -109,7 +109,9 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro diff --git a/src/components/Governance/common.tsx b/src/components/Governance/common.tsx index 06f5662..6e28293 100644 --- a/src/components/Governance/common.tsx +++ b/src/components/Governance/common.tsx @@ -23,7 +23,7 @@ const etherscanUrl = () => { }; export const VoteBadge = ({ address, amount, label }: badgeProps) => ( - + ethereum logo {amount} {label} diff --git a/src/components/Graph.tsx b/src/components/Graph.tsx deleted file mode 100644 index 26c7375..0000000 --- a/src/components/Graph.tsx +++ /dev/null @@ -1,497 +0,0 @@ -import React, { useContext, useEffect, useState } from "react"; -import "../styles/graph.scss"; -import Card from "react-bootstrap/esm/Card"; -import { BigNumber, ethers } from "ethers"; -import { useTranslation } from "react-i18next"; -import NumberFormat from "react-number-format"; -import { useQuery, gql } from "@apollo/client"; -import NetworkContext from "../state/NetworkContext"; -import TokensContext from "../state/TokensContext"; -import SignerContext from "../state/SignerContext"; -import OraclesContext from "../state/OraclesContext"; -import { ReactComponent as StakeIcon } from "../assets/images/graph/stake.svg"; -import { ReactComponent as H24Icon } from "../assets/images/graph/24h.svg"; -import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; -import { ReactComponent as WETHIcon } from "../assets/images/graph/weth.svg"; -import { ReactComponent as POLYGONIcon } from "../assets/images/graph/polygon3.svg"; -import { ReactComponent as DAIIcon } from "../assets/images/graph/DAI.svg"; -import { ReactComponent as AAVEIcon } from "../assets/images/graph/aave.svg"; -import { ReactComponent as LINKIcon } from "../assets/images/graph/chainlink.svg"; -import { ReactComponent as UNIIcon } from "../assets/images/graph/uni.svg"; -import { ReactComponent as SNXIcon } from "../assets/images/graph/snx.svg"; -import { ReactComponent as WBTCIcon } from "../assets/images/graph/usdc.svg"; -import { ReactComponent as CtxIcon } from "../assets/images/ctx-coin.svg"; -import cryptexJson from "../contracts/cryptex.json"; -import { - getPriceInUSDFromPair, - isInLayer1, - isOptimism, - isPolygon, - isUndefined, - toUSD, - validOracles, -} from "../utils/utils"; -import { NETWORKS, FEATURES } from "../utils/constants"; -import Loading from "./Loading"; - -const Graph = () => { - const { t } = useTranslation(); - const currentNetwork = useContext(NetworkContext); - const tokens = useContext(TokensContext); - const signer = useContext(SignerContext); - const oracles = useContext(OraclesContext); - const [tcapPrice, setTcapPrice] = useState("0.0"); - const [ctxPrice, setCtxPrice] = useState("0.0"); - const [ETHStake, setETHStake] = useState("0"); - const [DAIStake, setDAIStake] = useState("0"); - const [MATICStake, setMATICStake] = useState("0"); - const [aaveStake, setAaveStake] = useState("0"); - const [linkStake, setLinkStake] = useState("0"); - const [snxStake, setSNXStake] = useState("0"); - const [uniStake, setUNIStake] = useState("0"); - const [wbtcStake, setWBTCStake] = useState("0"); - const [TotalStake, setTotalStake] = useState("0"); - const [totalSupply, setTotalSupply] = useState("0.0"); - const [loading, setLoading] = useState(true); - - const VAULTS_STATE = gql` - { - states { - amountStaked - id - } - } - `; - - const { data } = useQuery(VAULTS_STATE, { - notifyOnNetworkStatusChange: true, - pollInterval: 5000, - fetchPolicy: "no-cache", - }); - - const getMaticUSD = async () => { - const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); - // @ts-ignore - const [maticOraclePrice] = await signer.ethcallProvider?.all([maticOraclePriceCall]); - const maticUSD = ethers.utils.formatEther(maticOraclePrice.mul(10000000000)); - return maticUSD; - }; - - useEffect(() => { - const load = async () => { - if ( - oracles && - tokens && - data && - signer && - !isUndefined(tokens.tcapTokenRead) && - validOracles(currentNetwork.chainId || 1, oracles) - ) { - const currentTotalPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); - const currentTotalSupplyCall = await tokens.tcapTokenRead?.totalSupply(); - const ethcalls = [currentTotalPriceCall, daiOraclePriceCall, currentTotalSupplyCall]; - - if (isInLayer1(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(aaveOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(wbtcOraclePriceCall); - ethcalls.push(reservesCtxPoolCall); - } - if (isOptimism(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); - const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(snxOraclePriceCall); - ethcalls.push(uniOraclePriceCall); - } - if (isPolygon(currentNetwork.chainId)) { - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - ethcalls.push(wbtcOraclePriceCall); - } - let currentTotalPrice; - let daiOraclePrice; - let currentTotalSupply; - let wethOraclePrice; - let aaveOraclePrice; - let linkOraclePrice; - let snxOraclePrice; - let uniOraclePrice; - let wbtcOraclePrice; - let reservesCtxPool; - - if (isInLayer1(currentNetwork.chainId)) { - // @ts-ignore - [ - currentTotalPrice, - daiOraclePrice, - currentTotalSupply, - wethOraclePrice, - aaveOraclePrice, - linkOraclePrice, - wbtcOraclePrice, - reservesCtxPool, - ] = await signer.ethcallProvider?.all(ethcalls); - } else if (isOptimism(currentNetwork.chainId)) { - // @ts-ignore - [ - currentTotalPrice, - daiOraclePrice, - currentTotalSupply, - wethOraclePrice, - linkOraclePrice, - snxOraclePrice, - uniOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); - } else { - // @ts-ignore - [currentTotalPrice, daiOraclePrice, currentTotalSupply, wbtcOraclePrice] = - await signer.ethcallProvider?.all(ethcalls); - } - - const TotalTcapPrice = currentTotalPrice.mul(10000000000); - setTcapPrice(ethers.utils.formatEther(TotalTcapPrice.div(10000000000))); - let currentDAIStake = BigNumber.from(0); - let currentWETHStake = BigNumber.from(0); - let currentAAVEStake = BigNumber.from(0); - let currentLINKStake = BigNumber.from(0); - let currentSNXStake = BigNumber.from(0); - let currentUNIStake = BigNumber.from(0); - let currentMATICStake = BigNumber.from(0); - let currentWBTCStake = BigNumber.from(0); - - const networkId = currentNetwork.chainId; - // @ts-ignore - let contracts; - switch (networkId) { - case NETWORKS.mainnet.chainId: - contracts = cryptexJson[1].mainnet.contracts; - break; - case NETWORKS.rinkeby.chainId: - contracts = cryptexJson[4].rinkeby.contracts; - break; - case NETWORKS.optimism.chainId: - contracts = cryptexJson[10].optimism.contracts; - break; - case NETWORKS.okovan.chainId: - contracts = cryptexJson[69].okovan.contracts; - break; - case NETWORKS.polygon.chainId: - contracts = cryptexJson[137].polygon.contracts; - break; - case NETWORKS.mumbai.chainId: - contracts = cryptexJson[80001].mumbai.contracts; - break; - default: - contracts = cryptexJson[4].rinkeby.contracts; - break; - } - await data.states.forEach((s: any) => { - const cAddress = s.id.toLowerCase(); - // @ts-ignore - if (cAddress === contracts.DAIVaultHandler.address.toLowerCase()) { - currentDAIStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - - if (isPolygon(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.MATICVaultHandler.address.toLowerCase()) { - currentMATICStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - } else if (isInLayer1(currentNetwork.chainId) || isPolygon(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.WBTCVaultHandler.address.toLowerCase()) { - currentWBTCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - } else { - // @ts-ignore - if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { - currentWETHStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - // @ts-ignore - if (cAddress === contracts.LinkVaultHandler.address.toLowerCase()) { - currentLINKStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - } - - if ( - isInLayer1(currentNetwork.chainId) && - // @ts-ignore - cAddress === contracts.AaveVaultHandler.address.toLowerCase() - ) { - currentAAVEStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - if (isOptimism(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.SNXVaultHandler.address.toLowerCase()) { - currentSNXStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - // @ts-ignore - if (cAddress === contracts.UNIVaultHandler.address.toLowerCase()) { - currentUNIStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - } - }); - - const formatDAI = ethers.utils.formatEther(currentDAIStake); - setDAIStake(formatDAI); - const formatETH = ethers.utils.formatEther(currentWETHStake); - setETHStake(formatETH); - const formatAAVE = ethers.utils.formatEther(currentAAVEStake); - setAaveStake(formatAAVE); - const formatLINK = ethers.utils.formatEther(currentLINKStake); - setLinkStake(formatLINK); - const formatSNX = ethers.utils.formatEther(currentSNXStake); - setSNXStake(formatSNX); - const formatUNI = ethers.utils.formatEther(currentUNIStake); - setUNIStake(formatUNI); - const formatMATIC = ethers.utils.formatEther(currentMATICStake); - setMATICStake(formatMATIC); - const formatWBTC = ethers.utils.formatUnits(currentWBTCStake, 8); - setWBTCStake(formatWBTC); - - const daiUSD = ethers.utils.formatEther(daiOraclePrice.mul(10000000000)); - let ethUSD = "0"; - let aaveUSD = "0"; - let linkUSD = "0"; - let snxUSD = "0"; - let uniUSD = "0"; - let maticUSD = "0"; - let wbtcUSD = "0"; - if (isInLayer1(currentNetwork.chainId)) { - ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - aaveUSD = ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)); - linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); - wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); - } - if (isOptimism(currentNetwork.chainId)) { - ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); - snxUSD = ethers.utils.formatEther(snxOraclePrice.mul(10000000000)); - uniUSD = ethers.utils.formatEther(uniOraclePrice.mul(10000000000)); - } - if (isPolygon(currentNetwork.chainId)) { - maticUSD = await getMaticUSD(); - wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); - } - - const totalUSD = - toUSD(ethUSD, formatETH) + - toUSD(daiUSD, formatDAI) + - toUSD(aaveUSD, formatAAVE) + - toUSD(linkUSD, formatLINK) + - toUSD(snxUSD, formatSNX) + - toUSD(uniUSD, formatUNI) + - toUSD(maticUSD, formatMATIC) + - toUSD(wbtcUSD, formatWBTC); - setTotalStake(totalUSD.toString()); - setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); - if (signer && isInLayer1(currentNetwork.chainId)) { - const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - const currentPriceCTX = getPriceInUSDFromPair( - reservesCtxPool[0], - reservesCtxPool[1], - parseFloat(currentPriceETH) - ); - setCtxPrice(currentPriceCTX.toString()); - } - } - setLoading(false); - }; - load(); - // eslint-disable-next-line - }, [data]); - - if (loading) { - return ; - } - - return ( -
-
- - -

{t("graph.staked-usd")}

-
- -
-
- - -

{t("graph.total-supply")}

-
- {" "} - TCAP -
-
- - -

{t("graph.tcap-price")}

-
- -
-
- {!isPolygon(currentNetwork.chainId) && ( - - -

{t("graph.staked-eth")}

-
- {" "} - ETH -
-
- )} - - -

{t("graph.staked-dai")}

-
- {" "} - DAI -
-
- {isInLayer1(currentNetwork.chainId) && ( - <> - - -

{t("graph.ctx-price")}

-
- {" "} -
-
- {FEATURES.NEW_VAULTS && ( - - -

Total Staked in AAVE

-
- {" "} - AAVE -
-
- )} - - )} - {!isPolygon(currentNetwork.chainId) && FEATURES.NEW_VAULTS && ( - <> - - -

Total Staked in LINK

-
- {" "} - LINK -
-
- - )} - {isOptimism(currentNetwork.chainId) && FEATURES.NEW_VAULTS && ( - <> - - -

Total Staked in UNI

-
- {" "} - UNI -
-
- - -

Total Staked in SNX

-
- {" "} - SNX -
-
- - )} - {isPolygon(currentNetwork.chainId) && ( - - -

{t("graph.staked-matic")}

-
- {" "} - MATIC -
-
- )} - {!isOptimism(currentNetwork.chainId) && ( - - -

Total Staked in WBTC

-
- {" "} - WBTC -
-
- )} -
-
- ); -}; - -export default Graph; diff --git a/src/components/Header.tsx b/src/components/Header.tsx index a7b3017..e4c38be 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -333,7 +333,7 @@ const Header = ({ signerAddress, isMobile }: props) => { web3Modal.toggleModal(); }} > - {t("connect")} + <>{t("connect")} {/* */} diff --git a/src/components/Pool.tsx b/src/components/Pool.tsx deleted file mode 100644 index 8afc570..0000000 --- a/src/components/Pool.tsx +++ /dev/null @@ -1,293 +0,0 @@ -import React, { useContext, useEffect, useState } from "react"; -import Card from "react-bootstrap/esm/Card"; -import Button from "react-bootstrap/esm/Button"; -import Row from "react-bootstrap/esm/Row"; -import Table from "react-bootstrap/esm/Table"; -import { ethers } from "ethers"; -import { useTranslation } from "react-i18next"; -import NumberFormat from "react-number-format"; -import SignerContext from "../state/SignerContext"; -import TokensContext from "../state/TokensContext"; -import OraclesContext from "../state/OraclesContext"; -import GovernanceContext from "../state/GovernanceContext"; -import NetworkContext from "../state/NetworkContext"; -import { toUSD } from "../utils/utils"; -import { NETWORKS } from "../utils/constants"; -import "../styles/farm.scss"; -import { ReactComponent as CtxIcon } from "../assets/images/ctx-coin.svg"; -import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; -import { ReactComponent as WETHIcon } from "../assets/images/graph/weth.svg"; -import { ReactComponent as FarmIcon } from "../assets/images/welcome/farm.svg"; -import Loading from "./Loading"; - -const Farm = () => { - const { t } = useTranslation(); - const [isLoading, setIsLoading] = useState(true); - const [ethLiquidity, setEthLiquidity] = useState("0"); - const [ethLiquidityUNI, setEthLiquidityUNI] = useState("0"); - const [ctxLiquidity, setCtxLiquidity] = useState("0"); - const currentNetwork = useContext(NetworkContext); - const signer = useContext(SignerContext); - const tokens = useContext(TokensContext); - const oracles = useContext(OraclesContext); - const governance = useContext(GovernanceContext); - - const lpURL = NETWORKS.mainnet.lpUrl; - const lpUniURL = "https://app.uniswap.org"; - const visionURL = "https://analytics.sushi.com/pairs"; - const uniVisionURL = "https://info.uniswap.org/pair"; - - const one = ethers.utils.parseEther("1"); - - async function getPriceInUSDFromPair( - reserves0: ethers.BigNumber, - reservesWETH: ethers.BigNumber, - ethPrice: number - ) { - // if ((await pair.token1()) != WETH) { - // throw "UniswapV2Pair must be paired with WETH"; // Being lazy for now. - // } - - // const reserves0 = resp[0]; - // const reservesWETH = resp[1]; - - // amount of token0 required to by 1 WETH - const amt = parseFloat(ethers.utils.formatEther(one.mul(reserves0).div(reservesWETH))); - return ethPrice / amt; - } - - useEffect(() => { - const loadAddress = async () => { - if ( - signer && - tokens.tcapToken && - tokens.ctxToken && - oracles.tcapOracle && - governance.governorAlpha && - governance.timelock && - tokens.ctxTokenRead - ) { - let ethPoolAddress = NETWORKS.mainnet.ethPool; - let ethUniPoolAddress = NETWORKS.mainnet.ethUniPool; - let ethCtxAddress = NETWORKS.mainnet.ctxPool; - if (currentNetwork.chainId === NETWORKS.rinkeby.chainId) { - ethPoolAddress = NETWORKS.rinkeby.ethPool; - ethUniPoolAddress = NETWORKS.rinkeby.ethUniPool; - ethCtxAddress = NETWORKS.rinkeby.ctxPool; - } - - const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const tcapOraclePriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const currentPoolWethCall = await tokens.wethTokenRead?.balanceOf(ethPoolAddress); - const currentWethTCAPCall = await tokens.tcapTokenRead?.balanceOf(ethPoolAddress); - const currentPoolWethCtxCall = await tokens.wethTokenRead?.balanceOf(ethCtxAddress); - const currentPoolCtxCall = await tokens.ctxTokenRead?.balanceOf(ethCtxAddress); - const currentPoolWethUNICall = await tokens.wethTokenRead?.balanceOf(ethUniPoolAddress); - const currentWethTCAPUNICall = await tokens.tcapTokenRead?.balanceOf(ethUniPoolAddress); - - // @ts-ignore - const [ - reservesCtxPool, - wethOraclePrice, - tcapOraclePrice, - currentPoolWeth, - currentWethTCAP, - currentPoolWethCtx, - currentPoolCtx, - currentPoolWethUNI, - currentWethTCAPUNI, - ] = await signer.ethcallProvider?.all([ - reservesCtxPoolCall, - wethOraclePriceCall, - tcapOraclePriceCall, - currentPoolWethCall, - currentWethTCAPCall, - currentPoolWethCtxCall, - currentPoolCtxCall, - currentPoolWethUNICall, - currentWethTCAPUNICall, - ]); - - const ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - - const currentPriceCTX = await getPriceInUSDFromPair( - reservesCtxPool[0], - reservesCtxPool[1], - parseFloat(ethUSD) - ); - - const tcapUSD = ethers.utils.formatEther(tcapOraclePrice); - let formatPair1 = ethers.utils.formatEther(currentPoolWeth); - let formatPair2 = ethers.utils.formatEther(currentWethTCAP); - let totalUSD = toUSD(formatPair1, ethUSD) + toUSD(formatPair2, tcapUSD); - setEthLiquidity(totalUSD.toString()); - - formatPair1 = ethers.utils.formatEther(currentPoolWethCtx); - formatPair2 = ethers.utils.formatEther(currentPoolCtx); - totalUSD = toUSD(formatPair1, ethUSD) + toUSD(formatPair2, currentPriceCTX.toString()); - setCtxLiquidity(totalUSD.toString()); - - formatPair1 = ethers.utils.formatEther(currentPoolWethUNI); - formatPair2 = ethers.utils.formatEther(currentWethTCAPUNI); - - totalUSD = toUSD(formatPair1, ethUSD) + toUSD(formatPair2, tcapUSD); - setEthLiquidityUNI(totalUSD.toString()); - } - setIsLoading(false); - }; - - loadAddress(); - // eslint-disable-next-line - }, [tokens]); - - if (isLoading) { - return ; - } - - return ( -
-
-

{t("pools.pools")}

{" "} - - <> - -

{t("pools.enabled")}

-
- - - % - + Expired {address === "" ? ( <> - @@ -576,21 +539,6 @@ const Farm = () => { ) : ( <> - {ethVestAmount.eq(0) ? ( - - )} - - {loadingMode ? ( -
- -
- ) : ( - <> - {isApproved ? ( - <> -
-
- - - - - -
-

{t("vault.balance-title", { vault: selectedVault })}

- -
-
-
- - -
-

{t("vault.ratio-title")}

{" "} - - {t("vault.ratio-warning", { minRatio })} - - } - > - - -
-
-

- -

-
-

{vaultStatus.toUpperCase()}

-
-
-
-
-
-
-
-
-

{t("vault.collateral.title")}

-
-
- {(() => { - switch (selectedVault) { - case "DAI": - return ; - case "AAVE": - return ; - case "LINK": - return ; - case "SNX": - return ; - case "UNI": - return ; - case "MATIC": - return ; - case "WBTC": - return ; - case "USDC": - return ; - default: - return ; - } - })()} -

- -

-
-

- 1000 ? 0 : 2} - /> -

-
-
- - - - Add Collateral - - - {t("max")} - - - - - - - - - - - - - - Remove Collateral - - - {t("max-safe")} - - - - - - - - - - - - - - -
-
-
-

{t("vault.debt.title")}

-
-
- -

- -

-
-

- 1000 ? 0 : 2} - /> -

-
-
- -
- - {t("vault.debt.mint")} - - - {t("max-safe")} - - - - - - - - - - - - - - {t("vault.debt.burn")} - - - {t("max")} - - - - - - - - - - - - - {t("vault.debt.fee")}:{" "} - {" "} - {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} - - -
-
-
-
-
-
- - ) : ( -
- - - - - - -
{title}
-

{text}

- -
-
-
- )} - - )} - - ); -}; - -export default Mint2; diff --git a/src/components/Vault/Vault.tsx b/src/components/Vault/Vault.tsx index 978fb78..1f7b314 100644 --- a/src/components/Vault/Vault.tsx +++ b/src/components/Vault/Vault.tsx @@ -44,7 +44,7 @@ export const Vault = () => {
{t("connect")}

{t("vault.no-connected")}

+ + )} + + )} + + +

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor + incididunt ut labore. Ut enim ad minim veniam, quis nostrud exercitation ullamco + laboris. +

+
    +
  • Duis aute irure dolor in reprehenderit in voluptate velit.
  • +
  • Excepteur sint occaecat cupidatat non proident.
  • +
  • Sunt in culpa qui officia deserunt mollit anim id est laborum.
  • +
  • + Sunt in culpa qui officia deserunt mollit anim id est laborum in voluptate velit. +
  • +
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

+
+
+ + + ); +}; + +export default MushroomNft; diff --git a/src/components/MushroomNft/whitelist.tsx b/src/components/MushroomNft/whitelist.tsx new file mode 100644 index 0000000..914276d --- /dev/null +++ b/src/components/MushroomNft/whitelist.tsx @@ -0,0 +1,1161 @@ +export const whitelist = [ + "0xA0E2c637B6a865ef258E4404d90d3Fec78aD34F5", + "0x54c375c481f95ba43e2cEcd6Ef30631f55518f57", + "0x23e28b775ab9fb982d60d4c9475b696a5a97b45b", + "0x6bfd13c44efb8a72d8c6457d620d9352d8ada621", + "0xa1336a90b288715cce8bc4d5624c9526e0751b42", + "0xd6F8cD019Dc78E8CA33139b26da3447394eb12C7", + "0xa3d5691d67873a2f77138c02e9178ff2e91dd35a", + "0x3c57f6239CF0202436E253170A6E69D54731ad12", + "0x3954a503bf87f49443af1e37a23393b77ffaf1cd", + "0xd84e11bee5d555ccd905817cb8cbbd5b6e6c4f0d", + "0x4e0414be95c0ed8acd6928b6bdec2bfda719335d", + "0xb3bf95aa39c4eb5772923c61693f35fc39e35fe0", + "0xc04bc1996320f27c0a6018cb370c9469a9dd3a4c", + "0xcdff4efe95d497834595e85ccaa6c4e07503c4d1", + "0x20c18421cfdd70d451b2887a50846fef78c23e65", + "0xf923b5cbbd47ea6778fa9c025dd6238c26464b30", + "0x4AdA1B9D9fe28aBd9585f58cfEeD2169A39e1c6b", + "0x20705521636f874837e21689bddf003a54e9b555", + "0xb89d08e9159d746f93a31ed41aa9a4d3c62e8390", + "0x3da9d70305b83db1f545a5d50b19208b93cd0c21", + "0x8ba2bbf4e6b12921da48888da9c0508e0301081d", + "0x6d12765D14a44E64c60dFe778c2eA8593A75373E", + "0x05CEdD3FdaA8997f9300526Ff6A354B8654Ad0a9", + "0x0056D1fd2ca3c0F3A7B6ed6CDd1F1F104B4BF9A9", + "0x8a9d46d28003673cd4fe7a56ecfcfa2be6372e64", + "0xA6e1c5b55b6BE38DF3c96473974D135cd280e3E9", + "0x34cc54f3c65e6e6cfd1f05e2ad0540624a5eff24", + "0x6b0f87051ad03397868e9b52abac55c55acaf7c7", + "0x313d535a3FC31E897fcDCF66f3c382Fbd634bC16", + "0xbb57a3ff7a31582c2988e12bab244c526e3869b9", + "0x8b168eeca29a5ab4fbcb68653d3cfff3f41f96c6", + "0xf92d29Ab6f4fc6fC615E53f9787C986731eEc496", + "0xEE1093DFa78540e5294fbBB73AA1108cdDe56AC7", + "0xa7195291d9758b738e18d708eb5d4b7a1bb8b942", + "0xd1d0d74d94f291e8d82024b1a74d785ba57bb555", + "0xfa912046abb0eb3511be6443738e4899acf335f8", + "0xc8c29b1e95fd332b1729509df2d8871cc8eb139b", + "0x0f9f99c219d501a1aac3d4d1cfed5205602075d6", + "0xee2a1695c264b88a20f8e2efb27e3f054384c4fb", + "0xe3e3bc5896092baf5cd46507342911514e945148", + "0x383efb5836051fa6b9b319bae8f5886a21167c98", + "0xdc319a6cf62ce6afa30b9bcf5bfc9cff92b8ec8a", + "0x9709173ed6f194a953a77204359dbfd0e88a54d0", + "0xE4aC8a1bE6c373B300F46Fab9e360865E65ffda5", + "0xb17a16a37673e99323f3d05a92b9b7ecc21b1b84", + "0xf6ef125721fe2c429d1722624f196ba4e04c48ee", + "0xf8e2dc6435ba1d6d2cfdd8001d505a85545e8fe3", + "0x0279e9366d3eb3eb8720117fc901211386114f6c", + "0x1081d3833eaf0e68a2cd0d18ff69d8d1da72b50a", + "0xc326f07a4af1f78022ab7cf5bbf5c36c0db4f586", + "0xf5a228295fbfbd2bed744ff354dbabbf20938e89", + "0x4b12c77a4be728ad21cd1328e45443802232bee3", + "0xC70f26184fc556bBbA9c3078ee35411e42E7B1ac", + "0x3235a9d04dae99ceaeb82784e654dbdfc5c8e916", + "0x18e4a567e36451d514bfe024726131f9557f4156", + "0x57a290fe30fb61b6f9743fae660f3748eeee4d88", + "0x602fA030c301C97734970db71bd0C8437AD179D8", + "0x78704a9Ddb658Fa225F78e719D1503702609DA5d", + "0x4380d6e5477bc2e601d465cdadf9b8a9e3702d58", + "0x7e1789c0d2a88a7ca022a6ad5f51f860c45be84c", + "0x197A78Fe1bD3BBb64c1325c027bdE8F67Bac1770", + "0x6265cade2b6d84e9b1c198200451ed8358c6c9f9", + "0xab0004ac87541f54d4bf3ddc577ea59a5b400646", + "0x4ced7cf98c5c588c160ed27676c9bc2d00332403", + "0x26c0a53b1531263c3b3a2c56f266616b5791ec78", + "0x90D061e6cC636F700bd578dB01CdcF5d464EB1a8", + "0xe27E7c50773Ca859875107ef7dB5E22Aa2e248fD", + "0xa69c9BE0f0a515Ddc8Ac57350cdd40a36A93E914", + "0xdd4db6de516da7391745a9017f2a231a5a38dfe0", + "0xcf3e2ee2b0cd1194ba33cd1c7d9614dc635a1714", + "0x4eb428b14bf2dda8c947896f1d33caad9bdcac85", + "0x28f5e4c9d45d16d8364ed42dc6e11423c7f745ba", + "0xeed85ddd6828b8c714141d34a12d0c07f7553182", + "0x082bc09347362d8a9ac03efb372ea891f4e1ef2a", + "0x2fc80bd59ad459e2151c78e191533e947656e71e", + "0x581b3d2cdcd3911d9bbf503550c3f6c1f3c997b1", + "0xc51447ad3b831dfc5603b92bfa46a06637250851", + "0x52e081bdb1a9e975fe6e6d0549228e6f23506839", + "0x41381649b2231cafc8293f501bb3df422aeba5e4", + "0xF068d38f341F04E58210fD2CF3790530edfd4f86", + "0x60E95F7b9e3783906Cfb6101F2b6073175D078a8", + "0x94EE08f03e6D61F30175403190266F4703a94D18", + "0xc63b0d887ed0335699354db687c5fa0b37cb0d96", + "0xA4C83C3053376E9Ce06C05032c6a758c235A5d1A", + "0x7d45858853Cec6F4Bc15202aEc46c25549d4D9a1", + "0xca98043835fa23f2ec98a404c293d5ff547a19f0", + "0x88145dd75e933e9ac89cd8f6dbb0c8f0186c836a", + "0xB62cE87B2e18a3c85666Da2a7970032f433D843F", + "0x6a9dc4bc6d13f51be5a7d2b02f35f1519a22e0f7", + "0xdC822485f112d3A4339c05694AaD9c381c9AF2c1", + "0xEdE040A7E37C6eAa3a6E0Dbf4b60a4b729b84741", + "0xB4B04564f56f4795EA4e14d566aF78dA54a99980", + "0x3fb95b3e51927ba7b15cb56cea014dd4c16b3de7", + "0x7Cd7bcAe383BC3f676cc213b57f9110702Ac7234", + "0xe6f1f2f9201f2460d188435992ab5349868b6c71", + "0x075e72a5edf65f0a5f44699c7654c1a76941ddc8", + "0x53C765C75ab37587EA3d2a6b0BD23D66d39394E7", + "0x559739f8706957c7da3770b95c84caae9b138f1e", + "0x4821c31842bb7cb5a4980411f7e03bcd0bbda539", + "0x918052Be73127df51C822d4E857e84Ea7Cb4C8b6", + "0x3Cf1a1512149B5e6dd0e29aafFe5400f0848f5D6", + "0xd60E5738C23183739357B37f4E60f9D10B19E62F", + "0x0c7AE63DcC322eA3B580a4b3B378861f26ccfB87", + "0x75438097fca6eb4dc0355b23e6b597ae4868e722", + "0x1027b7aa689ea0c4b48b17d85b2a5093ee8f051e", + "0x8C25045cD7849C85bF034E08Eb206948D39e60C2", + "0xd9ea180ccbe02a7a1e40703fc01e6a86b46b4416", + "0x3d5dfe8b4a6b9e6206ba6343e87bfda1f4dc48cb", + "0x11ededebf63bef0ea2d2d071bdf88f71543ec6fb", + "0x15DB696b8827983f9f83626062a17d9e6a3161BA", + "0x4e926f4580a5221d32e8d27d59c0c88f160b620b", + "0x23272896f6f5a00a1e6238db600c8ffaedf9d948", + "0x79d18ad92231a1efedcd36e10997f7a7b3bc22f1", + "0x9d576ac210F3d07A3302D1EaF171663AD8fc8ee2", + "0x2fe8E10633eAe71b503C60180C4190710a132237", + "0x5D3d94dDC4bfE72019C0750dC4a55B175A8777fB", + "0x91f445b30C707E9B2D151dd6fD24Da098e78c8Ae", + "0xf1080a6365123ef783f3ebb4981f9d220402213b", + "0xf161e1ad51fccd598e5c44a536f6659f33d6e0f4", + "0x9cd217aba9774bac83c0b4dc104b39955cbfea45", + "0xdD9f24EfC84D93deeF3c8745c837ab63E80Abd27", + "0xde79a3d11e7d31fd9952fdd078c28547dd86fbf7", + "0xa4392347602c9eb1ea91a1492459812cb5dd3a58", + "0x70e819f313a62f31825c2b112e3a9246fdf8e400", + "0x15086a450dd14cbdb5bb4688e2295b1a817dd96c", + "0x2a0059610c92842dc2ef84af76b244c28687e647", + "0x4322aa46ffed67809862da613725728e2fb8eae3", + "0x1300b31adfafb54d340541dd8edf852bfa49d9af", + "0x1c4c46b64ff12a6afd91d8b52db95d2fb45c9ff5", + "0xce801bc537cb24ae7fac4aac75d0a1e18d642c83", + "0xc36176c1B0316CdA0711F522c6AF3428f744f7bc", + "0x8cBa29DbeC29c2458f29f50C1e2b9A909846f52C", + "0x3aef8c8c3bcfb75708a69aa9219917030e302cce", + "0x47113e4b6477acaff6700841b80b9b65c7bd13d7", + "0x405Ec040e3753677d1Dcf62Ef2750C29C45b21a4", + "0xd57419e256f2e9050c2fb224de66600534dc2e73", + "0x7D90cc30d013B5a87BC9a8145628E900210d7028", + "0xa113381bb2cf0849ec63c053d16b3f6956d6d680", + "0xAa2f7D0ede7d326C69A339e46406CCfFCb725Ddc", + "0xb2d436ebaca07dcd5a226e737671859a6794d7a0", + "0xbc6a734f367846c557eb1c8419a9e5aa31b614ae", + "0xf0e9aad71740cc39ba113c45c9d3482dbb9c05fd", + "0xc0c2387bc5ef8cd1e5ca3897ffeb26e664632ecd", + "0x4498c72ca32564a41d2f9f136f447cd77f6afbfc", + "0x7b867A8220043c142356695434E09E12F0F191c2", + "0x46276503dde4608d8e99f7fcee1fddf3b7c0e476", + "0x14288773c9df9a1b669de2324187f678d7C1aB4B", + "0xc62780f9b05038726d0c8dbbf0d3e9aba5a7289e", + "0x5ea81D079E26F14731e0E430D6a4FA959b48Ece2", + "0x253fb3eba7fefa5d018b3aaa6f7be27bab93fcce", + "0xcfbc091f167bba962790e23ee2dda557938b8baf", + "0x3ec6732676db7996c1b34e64b0503f941025cb63", + "0x43764aeE49dA3d3a877E3326A83BC182A5e0019C", + "0x28f164f27cb7d8829cd390086efa65db1feaa5bb", + "0xe49506ff4ed3e22645f2bd8b8f15cf83db44dff2", + "0xF0a5293B7282C0407B04fCf15b5D64DB0ff3d2f3", + "0x2447807136Dc8224e3Dd865680B837820D14229E", + "0x51fc91dcb9fcc0f01d1aa4e659a3748688cc0730", + "0xfa9ab3bde88463ce8f3bbe6596924fe3ceed5510", + "0xD6ac395afB603ee7f952AaF340c37C63F2988A4a", + "0x61f81e08d7b20989544af009a3148aed79319196", + "0x7556831cde1e9cc65557074c3a3f5f46f7d171b8", + "0xc6085484f780c075a2188542594db5e6ff3ec36c", + "0xca73ba1c197bc5e263b81650fb6511a97f501ec8", + "0xDa223731DC769f3D704063C6104bFD7372DEA5A7", + "0x602fa030c301c97734970db71bd0c8437ad179d8", + "0x8540F80Fab2AFCAe8d8FD6b1557B1Cf943A0999b", + "0x7fbdabb2db96465c821a7e546e81294082d633e1", + "0x9be3a81988ee07a5a54a24cd2767ca9309878f66", + "0x4ab491e11db7138a005eabf0b0ca248431d5889e", + "0x16f5be82a44c150e8efeb7941c4baf0d43ccf01f", + "0x38d33a5be320c9b9fb99d9ba5745775b8c54f2cd", + "0xe1DF6bbD7D7a26b586c601ac17d4173b629A476d", + "0xb23bb3bad506180046d060ff77dfe0185b6a032b", + "0xc1e35b955d8e956c0c9b7dfee7ca8ee8861402e5", + "0xc3d461ae8e3b29a1dca37729c4575e0d309e620d", + "0x2a009Ff3Fae39b035F2368d077fE485e7761341E", + "0x1cef359009f0d12ca26bf2e4f9506dc12f13ec55", + "0x6516F67345e46F2C1A69d0aE8C8Dcb8F245d5daE", + "0x9835D114Cd3A7f567e7C046e59b46a6846874282", + "0x9e9c5a1a731192e51fdfdbbab5383d031f07db71", + "0xee5a82516dc71ba3cb0cc2056095e41fb894ae2d", + "0x6873aeC9B7CE47c0d32205C1f132f66b29635BB2", + "0x146db7e5d6d25b1302292e0603e3154904163e07", + "0x71e2e53cd5aac14e3acb563d5a1b20108d0b967b", + "0xed3907d129edaf90f5b2e821416019452314b650", + "0x64792ea7c648eccc079494764db42398c0251d12", + "0xb4f888f064042a8a1c72e1b605d0aaae40009603", + "0x252B99F1873fb67cC07c092ff7E772C608180F13", + "0x10f7c77fab0acbfb5629807aaf35344dc1207142", + "0xA808Ba63710fB2f052871EDdD6ac7F453Df609aE", + "0xEB4BD5231274aA4C2B97a4fA06bAD9eCFCdad5E0", + "0x7B520906313690f9b93E86Bfb0E380eBb862C268", + "0xC6C7E6B7e463F6b4F5849D0e6Ecd95194b8A85EC", + "0x9567963A5439cb8740dD2F20bCDD5eeD288beB7f", + "0x0aC4C291fbB28a640d9d8896AB043803FE367Cf2", + "0xe00f3c3277dbde8ae2aa546bdd5998f0a2a0dbf5", + "0x27381d11b3e12d44ddd652d69ab4a9cfcd8c54f1", + "0x4493bb7375442430afccd32733d24ac722595ae6", + "0x11114fedd4408bbe4ea79e2dda913919cf67829c", + "0xeB5060f8a749926872Bd2cC5AFc549F20Fe9bfd3", + "0x0E624Ef9C461E9b7C5bFaD5D608C11B6C315E77d", + "0x005ebe6ac77c3d8a6b166f6def485d3e3f10e6fb", + "0x188502B2C3cF130B46cA18F9e35147c16685e9d2", + "0xef8b8f123711d35dc4b7924b3461e00d38c8a2d6", + "0x342E2741626E114a2171744206403F4Ce432e74c", + "0xd2ab1a62d2435d90775aee5b5643b1cbb4e7badd", + "0x41381649B2231caFc8293F501Bb3dF422aeBA5E4", + "0x32ae635F5136AdB181A442Cc890be39263bC13c8", + "0xeb32693454a578ed678fa08d7dd7ec494b3db97a", + "0x3D6E381035Ab5995e06a5B1661Ee58E92bE755a9", + "0xd39a47b55d7b51d8533f763176b47adb86e896e3", + "0xde334424169796f928ace6e13066ffeebf1a622d", + "0xcdd164ed67987AC6d00292F1903D836BB514d084", + "0x1900Eb03efBC633d9ab2F23bad0aCB7109415d6e", + "0x4a11167b3ccbc6e0da04fbed42b55e79aeaeac2e", + "0x4632d39cb2b64acdbf1df5be19daa1b77158cbfb", + "0x722d357338fd91cb8c2f92c0a768f5a20e40896d", + "0xefa51c4e7f3f8a97b5507d6c89767f2ff44ca8ab", + "0x754c29780ee17a7250457e3523f0720b256e92e2", + "0xbd25fb9b5f4005be6a92d60e8c87bb266bd44cb1", + "0x00493aa44bcfd6f0c2ecc7f8b154e4fb352d1c81", + "0x68575571e75d2cfa4222e0f8e7053f056eb91d6c", + "0xd60af91bfdb5daada1b3788fdd1c86d6d5259331", + "0x1D955A33594E54eB50C9b35B3efEcd4bC74d6D5B", + "0x0a9435a5919933e643620c25ffe80b742daae9c7", + "0xa36bab9f9e2392c00a2251caf382f5559c00f4de", + "0x5da5f4c020f856abdb168fd35c957d6006ba2ede", + "0x000115381cc9c35060f9300da231f54782671bd2", + "0x7c224beeb6064d7ca376dc66a8d1245ad5926aa6", + "0x5eD06523f9195bB6E69aE22040E85ae006915e7f", + "0x7bb1ca29b883c99184e3c1c534f0e42e3e267dd5", + "0x73ca72175401d86a6015b4797937bb0009091d13", + "0xc4Ed448E7D7bdD954e943954459017BE63584F69", + "0xc21d934f57a7511b9c1d34240cb35c8ef3cba6b8", + "0x564BcA365D62BCC22dB53d032F8dbD35439C9206", + "0x63e6717826f680f4e50d9824bab93f95d8d46fe7", + "0x9bdb2651e53adde0a79b030f6dd87c52296476db", + "0x9b6eaead2c50aa55932865dd9ca9ddbecff047b5", + "0x888888e4af0b9124c2519a27e57bda4c4f062ecd", + "0x4D928359E8556197f161F4927a928DFDE9c3d1a8", + "0xbA12Ff309847676e2dDC0239633B7A082339d7eD", + "0x04f4bdc7e478e94e6e334b2b09c867e255e9c1ca", + "0x6392d61b9e60cd9c0198054f44f00be03f8d2a5f", + "0xF76ac368666e9EF0327Ba70DfB730b247C24a431", + "0x427f2de3579131f8c81e3cde10374e3f9760ff02", + "0xec49ff898172a72212988740669f596e81246411", + "0x58320a62fae62c5dc45b9919d583d4b0f955eb3a", + "0x44A07B71398423e12bC6a9Dc9e3B71D878d42517", + "0x1597a8339579033d2398630e2f370c8205e42ff3", + "0x624dcde294c4239fbd1c0895a24fb9dd49471138", + "0x17E50EFC7Fdba2065e8dD3FD36F90c90930c0872", + "0x660508082e2e15b6660044f414c42d36e1e846fc", + "0xfad763da9051953fea58c2304395719a3b6ba361", + "0x7b542649be9307660d5a1cf757d64a189c071870", + "0xec6d3046bf57fb18899e78d4ea4d2df1e0a864d2", + "0xa0e2c637b6a865ef258e4404d90d3fec78ad34f5", + "0x997ba4Cc40BB6A463E21AdCb9981FCdF64EC2e3D", + "0xc1b55a0ebbc527a03b52541d5c38c14571b04cfa", + "0x90aBCf1598ed3077861bCFb3B11EFcd1D7277223", + "0x93D5078a85CDB34e42b0365EADc1e7bA0c32dE61", + "0xfb3d39f3314cdc4b0993b6e9023d741db7b75e5e", + "0x85e9a235F911Cd1593cc1F3e837cA5B005D5891f", + "0xe08487309e3105411b2520ee80cc74ca760f7a6f", + "0x3c3556d4c53eAcD293C354beD43016dFB606026d", + "0xd04c7d9c28e3b35f2866e1b681f4d13102c1be46", + "0x35e4ec20f42924b945db48c1e1b11cbc04957c76", + "0x4DCe05A53E15EDB22729f585F2A8f0EA199408b9", + "0x79b786d1a98eaeab375ae6dab606cc3125aed13c", + "0x3c3556d4c53eacd293c354bed43016dfb606026d", + "0xd38C197B862DaCD0aB6b1e18c9fc8CDf8a8731e1", + "0xae770616364a7a2d91a987db1ac11be21e3473e3", + "0xc5fa796bc0e6a6e78a736a6c878b8a941146c3b5", + "0x19323A6C0AA8C6F420E7b3F68A83F4BE5d8afAAA", + "0x4d3877abc39d131a39ce21dd0675ad3c1e3f3f32", + "0x91c3a85d1aa494eed31e70c0b4005719afdd6bf3", + "0xde0634a1f956df8580f18c955b3e9ee957e552c6", + "0xdFc364b7024E48C6DE6b30c6b703DE0BC2e391B8", + "0x3f11495ac8be907e7Bb6891C43e4FcfAC162bc4a", + "0xbc65d4c8a841dfb701be13c4054b9521e5778342", + "0xabd138543acca939a4ba18cb5b0d3e575eb62fc3", + "0xd8f9a1c16aaad3cf3c5de43379941d98302b314a", + "0xd51b5e6256b34ce3a13d8600d05478bf8b87d2ce", + "0x2289D6FD181F9Af14F201c8DC81BecCb3E05a7e7", + "0xE3017d50Df837058991010361a714ff95F2AE9A0", + "0xcb1222f00019f4b5c1ecd7f07fc2fac88adb9fae", + "0xcc0a036bf25f67478750b20f825b90a811e3e217", + "0x883Ab2aE1BDDa0531078b27dd45600193aba1F34", + "0x5480b68025edda9c03ea4c9165fb64e0a1f2c1e4", + "0xb6767A89b0EFF73874987EcC502F0e664d5d544b", + "0xa9d9cf65cc076348fa89fd076f0006a57681a767", + "0xEE9A0ef4CE0aB1b11d8ce00f0E4520b9F5A116D6", + "0xdcd31f2167d3da86304c046725016676215066c2", + "0x24046f8fa6b91dadbd468ab5d5ad574a54e43793", + "0x9134f2236793333841595309f80a0cb58032e757", + "0x09670585fb16cd64f25c025a48c19aa034ca1298", + "0x0f6686a7a49f5055e69d7b1cae7d8f19843bc15e", + "0x88a76452288266480e120eb10d8739148db85159", + "0x5a519f6239C496CeB7F76399A96CB5E850e69645", + "0x39bb99c99715ec6252f5c2713d949e7bb44c9214", + "0x7ec938b7f8848c45f2ff5024c8f84e93968fa05e", + "0x7C224beeb6064D7ca376Dc66A8D1245ad5926aa6", + "0x6E420a95b4546858e8D3237D7Af5977b57340503", + "0x203ace9d16df2fe9658296c97193661a809c3e02", + "0xe4e83194ba5cd16f6e3c81833a0c0dc904718de5", + "0x94479f0e32c3397f9be5521184cacad1bc0fc0f3", + "0x1c42f2fcc9c7f4a30dc15acf9c047ddecf39de06", + "0x5867a5e7E59339C58191334BE6C32E6885b6fCa6", + "0x6fcc2b221922a1d4753899af1b38c95cdf8c6d6a", + "0xac33bfd55edc07b49d9082a29fd18e28123eb1dd", + "0xd778555AFA02aF57F077bD48b1204C5405d28887", + "0x08d1d02a037e93b8584f927a27f7f6277ee2de30", + "0xf9b77855bddfccaea266413a589345f34368a8f2", + "0xc3552007f946cee7b87e542011f20016feb8cbd4", + "0x1b212FF5b739C009b3eBaF3e681E3889b52C839D", + "0xf89c2Db21e00b80BB2d0699Ef99c464A391bCF52", + "0x0289E441bAfE0c1eF096eb2799dd97B351499978", + "0x5d62f5f89c6a945ee3f86abbcddb16c325718091", + "0x0f11F3CB8FCFC784374d435aeB4C637b3c2e4a22", + "0x62721087a6082c5336a36b7caae7ae416ee2cff1", + "0x4c4e7c040896d1e09bfe29da02b0591ae2f244b9", + "0x7B0d20c3738bff1F9a9Ee6f5239623C4953DE51F", + "0xcbcf63c193866ad82ae05db88ac51047ab2b64cf", + "0xccec0e34d80106687b654313acd1b6d0185b1cdf", + "0xda147543503bff1ed4bb737d97a00e3f9de6ab62", + "0xfa95a23d38f162efa06f7e84618bba4b99a08cf4", + "0x2Da80Ff7e1008a386Dd3A77846500089A05ADd0c", + "0x757d7bdba0c5c73255779c16f80eafc12ddea576", + "0x3e62e286485352ff5d356fb5c69e2bb54a9fad28", + "0xcfcfee2c6845a39dfc9d5403413b53b6ff5d585c", + "0xf128177634f2A9E74658dbfe74d9Ddb0f2D24F3D", + "0xe8342F3F61E8fDB281061A79506Ba4F39ad32c0B", + "0x3436d87664964DF8A1825F826f127deC13117B0b", + "0xd4fa23307a181b9ca567886eb5bcd5c8f8f8bb3e", + "0xc2D496215e4261c0dA0b437063CF15E3528BC545", + "0x979d23be1b72641decb830398659994b93d4b897", + "0x5d9606ee1a677bdec13fa4d62989076b943a6ebd", + "0x3704941276c3049a740214f6df50a0fcef1a1be1", + "0xC04Bc1996320f27c0A6018cB370c9469a9Dd3a4C", + "0xeBF442A15094289f7483C1a9D12367Fc1531c4F6", + "0x7849f7f35ebdd8b42ba37d9df9a24de0fe19d5e4", + "0x76927e2ccab0084bd19cee74f78b63134b9d181e", + "0x70BeAeC43A24cB0587e03Fe396728F5A2A140f2A", + "0x6367bf1269db8ce122d282c9a932ba69a6c59c02", + "0x1fe93add99a5492aadb8210bd8bf7f2756265536", + "0xc784aa191b4562d4ae860b851461d7fac80acf33", + "0x881622798f53EAD0743170de035C64EE03f3F172", + "0x492eb92ba16fe2c875c39e96f97aeab192f66594", + "0xfca8cf85cf7915127fcc190235b5e46756872fc4", + "0x6eF3f0fF397C3de367C6cA2Cc3e6B6955E7993A5", + "0x09eF0D98Eb6359bC1A2a1a7bFa49BCEc76FB3F99", + "0x3ae4a45ab246c90b9811e3147efc830a701a735d", + "0x9634445e293a87ab77ca3cf5b43da94aabc544b6", + "0x57ee25eafb8a18baf347f792d86c26550bd45c43", + "0xCD04183A0220E28A6197dfcC78081Dc2E0815AC7", + "0xEBED693576DbC1EE2692a414e2Fc37d1117fC40C", + "0xf532d25600012d78c14b3f7bfdf6688096d8753a", + "0x53c4bdf99890d71b6ad8a00f343f408e10dc7a16", + "0xb37d882730ecc495a1faa4937ef3645790b00e89", + "0xe781549d8DD50FAbe211d2298370FabAB87d6e56", + "0x857Be2b9Ccf18fa3445047e53BE9B3212518E7A0", + "0x458766ad6da34fd6a309febe57885dab16224193", + "0xb45ce332b0b464aab34b68a8fc6bb7fa453fe93e", + "0x4dd227258ead37cc097770915852bfe96b083c57", + "0x5fa7aabfaf1a7104559508958d4ab4a70926625e", + "0xea7d443ecb40e2189d674256dff3cc32b35c1430", + "0x98c11a4edb5c9d4caf127aec82afdc57d93f2011", + "0xe9404Dc46cb03e1Ce11252e2B3e6c0efb98A34D6", + "0x0076a7a180308486f70117ae53a75df5988d60ac", + "0x7dd52be395abf2109e42c715425168d3c4d6e7c8", + "0xf75b0e97bbdf16c69ac06f527835be671d34a124", + "0xb67Ed406fB511cCA5763Dd02F9B11CBAd8991c17", + "0xe299da75b9d1dab6a5eed3b32112a13b0cc3c0d5", + "0xdbccc870cdcb2077ae8a62d1cae9c6e7f2cac4cf", + "0x77908f9a959F0A311c8408b447bDc17B296E1Ea2", + "0x7e7bc2de2598db1197d86c6f404abef6775d9930", + "0xcf8f6c3c6856cb3b13704f7a0c509a6b7fa03f09", + "0xbdf1b202cc44bc45b472ef2e0dfea0dc0147254e", + "0x29ebcd4acfd3ff9aa028377a8b1330d452694fc1", + "0xf31098aea34f7c94997dccd3a1880c8c9389f2e6", + "0x4730F5dDE6dAAd4B9381F261c9f6f76CE6A9B4d3", + "0x735bb9aae8c9417d87799a10ac9a97708fcbd242", + "0xaAcEcD1130acA21F14118a78E75A47756b79B602", + "0x46f8b8d97aa29ed884cc3e51b5878e8f8d15ac07", + "0x2564df404f696abd2a52d811307c54196a1f75c2", + "0xd5d6242177279596b2672b9110c0771ed2e941e6", + "0x1fec79a7c67a1b8f659853c64124e67ee9d06686", + "0x9Ec162Ea326F93C81FB3790Eafb2f049AF800b4d", + "0x5a9952D56f0F4bd32e53478fd3e56D91B9545FAE", + "0x29e663b6c1f24c3d17eeb8d39d222af865943b1f", + "0x3427fe04fcbfdfc0d5e3d4bb28e5d17c7d05dadc", + "0xe5964efe4e250c677f1f474509de728a82d4bd37", + "0x6718f2430cc9299328c10deabf78cf22b4c32225", + "0x9dabb8374d0c9bf5a925eeEd7a519Dcc6B41D8FE", + "0xEb5B6185b4E5BC9B3A1190BE8FfdAE7475e76e89", + "0x176ac51621057eab1f563e42016336e16f7a75a1", + "0xcf3c6c6196883498d15f7d59c41dc6c844eefbf4", + "0x86c703e247ddcd6780ecc8edac0cd4f32940db8e", + "0x4717f20F534C1732a2F987a126181eeF5413Cad3", + "0x1444dcBe80760DBa40033ba16644BA4Fe3022D56", + "0xdf018ac6efc4e9e39515c0fa67e5ba66d5e366d0", + "0xcba1a275e2d858ecffaf7a87f606f74b719a8a93", + "0xf188ccdd5107fc2c04ede0ec04afbbf45dae275d", + "0x7a0ef482134aa53468850a7b117eca38a6a3003d", + "0xd7fcd7c92d184c2c3d84721df201f9bc95b32f4e", + "0x235666094aef43816978aaf56b9802b5fc19de2e", + "0xE140a89CA6c074975d045613674eCC978F5AA4f8", + "0xb0cadc95f1b0f6791e190cbc3c54826ca1fdeed5", + "0xC3F2bdc871B9d2aFd5Bf22d4a6397a637F94DA29", + "0x975a171033dd940CFd165d1AB361552F2B985014", + "0x106fd74d4cfcabc4a2b70983d48ddb6420f2a185", + "0xf2b49bb95af806eea00ba6caafc76a77853f8ba6", + "0xc1377e2312cc6cf1b7cfb99337bdf7d82c501f6c", + "0xdae3b357b18854ebeecfe94199ab4ba21dc1c3a1", + "0x5e2d9c534870a686cF7d1dbb10f2B8b9a384BF29", + "0x77158DAB6bAceE69a66218FDd295C8fD3D78d79F", + "0x0af3d96fa1c43d9000a99b03551c0a8f7320e922", + "0x1337794a4361674953b53ed6cdc88357097aa5c7", + "0x74ee6af6e98a640ca94ac9d27a9472ec125215e9", + "0xe358A4Dc52B306b7C7261EaD577B9E140239f2d3", + "0x31bab9b137cac23a08d67048ae6c21e5fba7029a", + "0xbBe844467051fE04CCE050efB42cF824431d1e52", + "0x1ca00bc58f90509c41baa84b77eb0d63a579a639", + "0x529Ed027942aDA5d0a71d8e1e0006F123eAaa472", + "0x6b407f20a5fd127b3ba85adec219380e6a74524b", + "0x2510eB2aB631bfc2156bFc12f991d2C0FFc711d5", + "0x9d2203cd3e400d84f9973fe3c04689b6c8d36b6e", + "0xbfdd5a28b6a717959304e25953b4bdbd84c5fe1b", + "0x72ad60856935f7f1605481444a0886e99eb2fb2e", + "0x9943bf0a358ac35acea7a6b311a36e894d05c92c", + "0x8b6a8804d284c8d9bcf1465250e00621092d35ce", + "0x59aed46e47ef7a88862eb1d5f0b2342d8c6ebe93", + "0x0FDc77a3432fCDD187b19A820AafD5225915eDCA", + "0x691a283b546864875EFBcAC16eCD4fc7BB945581", + "0x0dec6d4f8806fd465da765511a1020e4b5583f9f", + "0xb6b9ac35e6201aecf28fc277bbb46a200ec9ab47", + "0xb0e95a31c073be2388720686f6ca4cd77b991ef7", + "0xc763a82f81a0c5d525b1af74a23e996751735307", + "0xF0bB3B93552edF481a54B9e3937ad8eBcde892f1", + "0x533261d362cf14eb4ccd95d2faa0c11bd07e115b", + "0xa785e5bD1cd918a6F4CFC2DF48e675716F84d9EF", + "0x6024ba5de8424837577a77f258d65c629acf8447", + "0x277d9b33e774560f4d391c148c9e4e24cfb77f8f", + "0x1c4ab7a8d9a41d8d3ff39ed4fcdcb66a11e9011d", + "0xb297D1f48a52a2532CBAfFcEC1850B949f71e1e1", + "0x929a5753c41eaed288f946bcbfe4a954ad341797", + "0xa2ddf8e0847f91e91265947a52a96a09541c7603", + "0x27f9579727c7f7827b531b0f11ad2e21e3ca812a", + "0x1aa6cc699152ef516b165f2a682347f5ecd4f74e", + "0x4a77676f96e90b4e3bc113d90cf958fef2d0b8e7", + "0x00c32d28d7529ec4cbb7514229c8b80f404aeb52", + "0x6166d5F406745CFE2Ff0a80310480a328Bf726F8", + "0x99cfd045a577b2e256979c322e4f56735db09d9c", + "0x5aed268d7fb15c435a3c27a34c3a7394d8f8c814", + "0xB7E3Fb83555089b5a33ba7cf5a1110cB40F8310A", + "0x1cbbfdd079139c8922248acbcc62174e6b08ef52", + "0xea4bfbbf972e681b7d373672820c4f81377a89f9", + "0x08c07a9f134931a2f826f631329f71d392466879", + "0x0BD1454fa01dD11bF6646BF8bc17a3E48Fda3734", + "0xcf68483ad0e14162937c6d32245610d3891c630b", + "0x0848F011d99C5aA0abf0E8a43c72d8b573383f2B", + "0xad13238a3e9eda25f9af105fc297cbd7301db76e", + "0x5B5aC4512400cF1798c23926B0cC73bBeaCbA35A", + "0x9ba7ec4c0d21974c6d5582d3b58a81b9102f2bcc", + "0x5eB2b16e1De28E6A8f8291cCbF9B9AE1b1384654", + "0xe7203e9a54e8384cc341311eff209e7f6d53b015", + "0x68c81d07ed36dc168cf073aa668d6d2dde8f11ef", + "0x04bb9e05dc0e749878439315f7933e4c9f7a3ee1", + "0x1128cDB6DF17E282cE448e7770d0f02CE1299e1a", + "0xb97ce27b123b05d8a52a633af7f1d183c093603c", + "0x9be96a6e861d2e5aff1fe0738bed664b6f0b543e", + "0x136A27249af210fE3dB926aa707Eb8B837e6c25e", + "0x8f894791d6122012818520ce95c92d1b6ef1d3ea", + "0x37cc28f835ea2337dd49f22d2d982dc9b6b4df55", + "0x10fd5111c1c03119e891f4704c411cfd2715af87", + "0x93c6b693c14155da0971c4ce5a41bbf9a72b85a6", + "0x3255B0780e34215fcbAE5b7433a21389d2e9f327", + "0xc95397def63f9d141be35dda9335263745e28340", + "0x4fc70107d2b3edd22c6df9067d711a93ad4c3b77", + "0xCCa15a0c3bAFfa318C25bC001065008B62682491", + "0x5ad6211cd3fde39a9cecb5df6f380b8263d1e277", + "0x42703d57290c883d30ccfba2fd95cfdd6ad43389", + "0xbd5975d969a5590b663c329490add6030c28A9aE", + "0x9008D19f58AAbD9eD0D60971565AA8510560ab41", + "0x5357c45df0cb13ad1ee75091b870e7f2c5b12f78", + "0x58eb02f60b99489d76b6ea63a916591404c2036c", + "0xaf07579793d3acf89afd719ccbcaf4317b9a94c3", + "0x8da1674d16fa5e5c8f4efbc4540888ba9f1fda4e", + "0xe1e7c13abd171ed127834c3f73d0e2dab4d35692", + "0xadaaf294a870ff2a89ebb08e7e155813150c386a", + "0x81ac0B00F02B7df66f3800D0dFd8622c74d78E62", + "0x961986481f76e94195f66191efc73b3d6fdeb31d", + "0xcf7dbe8e50620c0b5f466fef79ac8c17feb022d5", + "0x3E7D9f4edDAa08D6c12E0E95BDF86e6Eb58a858C", + "0x681120E861BDDa1032f0Ac978b1D9b8e294bF408", + "0x68224861d426eb0418cA9589a96A80b0084e5318", + "0x7d9ae024734b83e2e07e4f3494359b728bb790b5", + "0xb2f6129b4B2fa2061BBf6d136BEE016A66D821Fb", + "0x3f106b32a9b26c07aa6e44923510909fc1b030b9", + "0x8F895DAA3aaF44F00b57ba60b366EFE481e50De1", + "0x209b9eeb1336cb5ffedd8d4e474840e553e812bd", + "0x74d85b145A1a1531fb527aDd04d41018E12df746", + "0x0fa0911F3323126Db7c897A54bcaC983E6075266", + "0x905382d7bf939eb13e34eaaa31ffc6c4e51bbaa0", + "0x6de3e46cce02a39d74e55eb8d23e5b175cab882a", + "0xd38c197b862dacd0ab6b1e18c9fc8cdf8a8731e1", + "0xe692fbf20924dded9da3798855095740b39c9291", + "0x9eed5fcbb5384c98af8413d31c4a716ab5387f8e", + "0xabe2cd0e03ff6abe8ba46d5ea2ad13497eb46edc", + "0x6af31ab2538753eb2900b9b57358d742bc6cf178", + "0xb01941a667a9f2a7c5900ed5a922321ef9f19275", + "0xfa50671b1e38945774f0a5224160b45c8b545f29", + "0x40e8960e0fc7d7876b997f18d0303a8ac7b233ab", + "0x09592a83d3bf5900e0b784eedceb8e91baa56c90", + "0xfc0d0ecc018a8df10843c0c996140e212cbd7a1e", + "0x3A79C7eB98d9CED2e7d7292aCAf526C3880D83F9", + "0x588b6bc07ca1d3d882d73b2393e692e42553cd12", + "0x0cb961e87f6b7a7ce4e92d1ba653e2a2b5b1d9b9", + "0x9709173Ed6F194a953a77204359DbFD0e88a54D0", + "0x2900e0ec5ea04c69b5f80f58b48fca5c44a92e34", + "0xa70b638B70154EdfCbb8DbbBd04900F328F32c35", + "0x9db1c5a0f6519c4c694b35fab580fd875c424573", + "0xD08BD78cA3369A45E3D23bed18bDAf5E3B8c98BA", + "0x34da75d6f52608c168eb4172a903e3f721080f01", + "0x8fb4a947f0bf71951b9d3e0c667629a5802ffe14", + "0x8b6A8804d284c8D9bCf1465250E00621092D35ce", + "0x8a9D46d28003673Cd4FE7a56EcFCFA2BE6372e64", + "0x622A13daC538a0505BBdCCb4f634A3aCb949ac6E", + "0xc1b55a0EBbc527A03b52541d5c38c14571b04Cfa", + "0xf7A834B3Ca5Dfb1684792446C30dBF619E553eA3", + "0xb7b9916e59cee95a98d07ec560a93b46d39a9135", + "0xe3346ddc3d4d64e16fbbda1cd82466d2bd7570d9", + "0xf5e72997437415d42273f664826822f0453b2e5e", + "0xe6c207cdf316233fa9aa4b79dd98e07f1a256f7e", + "0xa87E2c5D5964955242989B954474ff2EB08Dd2f5", + "0x59a99FC6a39Fd944c9e70b2dB4138b58d1954EDb", + "0x9cf6e56c72aa9db3a811d84e8c05aa454e561ff7", + "0xECBe274B81146E5065982bEac5c76f2F27EB2418", + "0x3b89b260d0884363d8cad623d3554fa3e211f0b3", + "0x78522630b279949fd9c5f375c2387e4d75292acf", + "0xdEffc2c48d3b476c51E0b6eF84B02a3D6060ffC2", + "0x0e192bc356fc8a94aff4dcec7d96f7502eb239fb", + "0xcaa8fe71d6d97cc8eaf2e83ff9974d2a579177a1", + "0x33277e03921216b414e2dbf735bbac307122e71e", + "0x73C0481d5EaCDFC453aE9b2300490DC6Abb078C9", + "0x8d802d950916e44a846128b938f393c15e1d7eb8", + "0x4779c6a1cB190221Fc152AF4B6adB2eA5c5DBd88", + "0x3aE4a45aB246c90b9811E3147EFc830A701a735d", + "0x57cc54493f60f2f821610c82d0f4f7beef7777c1", + "0xa1a5f57d568aea5573d5ea70dc603fcd80370a01", + "0xf55c5df700de999d461c6547634253d5e9710c0a", + "0xc877418547fd558f713215a5b0f1ccb11442436c", + "0xe7afe9d6b50d684176ba7225a8668f29d17a1486", + "0x293d9eAb4a6b6DCD263d71e74C1bD7d83Fef5063", + "0x854622ffffe9ddd587316d7bf3ef280e14af218b", + "0x3de2ee1a6f7397653c8c7981ca7473487de30c39", + "0x2da80ff7e1008a386dd3a77846500089a05add0c", + "0x0817963eaa830f1c9b276c7a4401d66a8dd3f6f3", + "0x9Eb61591e9BE76c4175fBa2358A54da75b5dd40C", + "0xDc51DB13FC0c4546965ac28fADd062A23092F32C", + "0xbc0ddd3e509ca30bf45f6202183064075cc53071", + "0xe80c8a0d7bb5889831aa9f1b92bf57ac4d72f90e", + "0xeda3de89c760ad664e985bdc2661ee7e2f71d25b", + "0x2a53c87a0887fd3251a42828fbdc45844a6ffbef", + "0x4b066a1703af1c4410743ef81df6fed359a9d32a", + "0x6cc8dcbca746a6e4fdefb98e1d0df903b107fd21", + "0xD93B43B3345FE73039fbEf789B0D32beD046b352", + "0xcbae730ca53ebae199488f880efabe96bfb439f0", + "0xacfc319b29d15c6d0af85ef84347a50131c0e547", + "0x1ffb0334c86d69dcc0bcbf78538956097fa9c550", + "0x204df3850ffc4dabc99e32eaa66806e1886ae758", + "0x42c503f0f57a7235937c493e4455559cb13b6e68", + "0xd7f97adac7b0ac5b2855dd814263a894f356e5e0", + "0xC2554Fd4E06826460998F9cB7f10dc10e2450F22", + "0x71083690c37E75cCCa9229e99D79E3ec35b5C643", + "0x6386288a0045f652fd3733bb8ddd7fb0fb3e4b33", + "0x21112be375d4046f7b1a4ce6f5ed10c74dde1058", + "0xbfd869c62815b8063a2e4fdfbf437ee4891da031", + "0x673743bba95f6960f0b51918e091ebb8f5e9a00e", + "0x426A04b46e1052712b021213A63Fe40e5376F8Cf", + "0x239EeC9EC218f71cEf5CC14D88b142ed4fF44110", + "0x74052fb4D5dF7b18C3da6e529ECeC84eE7cBa8c6", + "0x3ed335cFaE1fb9F439B55B837f70aa031C0b6A14", + "0x3d5a749bd9e701ef6f046306ca713b4537e4ecfe", + "0x53118829b1cbb004c1975178ec763b2737253472", + "0xf7d422dc96c31de6d10f2957b14a7d888ba3820a", + "0x382fFCe2287252F930E1C8DC9328dac5BF282bA1", + "0x0015a636bf58a20de1193995c1c4d42b7f68f525", + "0x5f066d7a7a8d0ba68a2d38718aaf2a45953f160f", + "0x0311e2d31b39c8889a56a252760828d54c5092dd", + "0x3f4C6350a1002a90a3e9cC77936f84c0BB889d96", + "0x3d316b25363a04e870fbfba989416767274a6f7d", + "0x77566db619bc48ab58404ae495910bff9380cb9c", + "0x9f444eb9da99aea41e8800b694821dee9a986568", + "0x9f2c46a6F95ec4E62e5619407C789F127f8982C3", + "0xe24F5c68074BfA08ED8a26636Ee76da928296adb", + "0x0bd5f1a9cfd8bc9e059490234611fb5ea760518e", + "0x8860bA33913573Ef24fDa8a860C3727319B6D7A3", + "0x4e38789d10f009e8b80a514acd90191af8675e20", + "0x97b9B29552317867368A9F0234DC768fb6a27fd9", + "0xad575e50c162ce12d6bd4da878a066238e005398", + "0x98C11a4edB5C9D4caf127aEC82aFdC57D93F2011", + "0x97e261255b95ad980f597714ba28a11facb207f3", + "0x8286f706f194fba0413ad13a7c3962a1fe0df191", + "0x9309a24bf08ab2f5327d2b488982e8318717e92c", + "0x4a8e2e8cafd4dc0563803868cd362edbdc8e68a3", + "0x8471578e189eac49d866e43c81bb240e52fc2650", + "0xb3a2186359ae7c6ba09daa80ad5e0bed3456ee78", + "0xc36176c1b0316cda0711f522c6af3428f744f7bc", + "0x677ad574799e5d71151f8dffdf8da69ba51d6311", + "0xb67ed406fb511cca5763dd02f9b11cbad8991c17", + "0x5AD4178Fb0BF0E9ca1D2ceFd6D7d7F9636897dC6", + "0x8E26A3428B5A881AC0A1dE376C7e08B04314DF93", + "0x4e00c74831bd2dddf1856426cd6fdf97d20c332e", + "0xe590f02553b7e140ef191dce5101d802bbd0b22f", + "0x2458f163c231BeaA673C903894060430cCA101be", + "0x11eDedebF63bef0ea2d2D071bdF88F71543ec6fB", + "0x534a6b31078ae68c1c4fa2a3547cd8b3520255eb", + "0xb550fbcfae4d99136337eea3accaa6038e838dbd", + "0xc0a4352241F4eFBad1A919398Ad1F77Bd591c5de", + "0x33ee1FA9eD670001D1740419192142931e088e79", + "0xc835ae05691ca5357bf6b4d3fddae4c3339e0c83", + "0x9324bc6728fabfc7c789050a08af1bc8f2a8d0e7", + "0x1090e8096681ecb96389c40e8ab00d5c88997985", + "0x9ffd0a5b5438b95861167422e745d34d151bcc3b", + "0xf4c2cf15cf3930ba586a8d729bdb4e15a3ba0371", + "0xc087168e843ac55c492d44ccbb0f0355d0c3aa06", + "0x01954251da19711c354f144db0d0add3d37121be", + "0xcb53dc69f0f435dd29b49af2db8a32f7abc1e9c7", + "0x6eb98a84dd1556d98b9a8cc7ac146057c5dc7685", + "0xdaacd0d4ad7306618e05a0dff4bcc9a3af8c48b6", + "0x849fd5fff945b0fb552bf123243c00eedf476c2f", + "0x2b7798a793ed99d06767945954226c73da2553ac", + "0x5C5Af069B848fe904A14DC8Ed70f3d0DCA6dcA60", + "0x1c914539a754a2def114239dc1b1f3d15e9d5723", + "0xc3b787e6be77a72d01dbc0b7ceb9688c58e5a776", + "0xac170cac4025043621178f9d2b5436cd96f0579f", + "0x767D222a509D107522e50161CA17FfCF0e5AA3dE", + "0x54c6ac745d042bcba90674e0a378f266ae12e8f1", + "0x80333801feb4e0d92c1b0643054cb0341b35d232", + "0x72866E0FB4a66BC5e15e15E763b447b77AC30D59", + "0x3235A9D04DAE99CEaEB82784E654DBdFc5C8E916", + "0x8c3360b0f8692b212762c45c3dee9a61cf0ea93a", + "0x5564e4fbd35f37d889973eb1af427a6a555e8ebc", + "0x2fb787b4539abba0db651cdfdc74a5379857c8fa", + "0xb891b774b82417e9d17af3cdf4ea9b6512521966", + "0x06dd29F9115500c16F8060638b6197E20492f69d", + "0x97889e94368f11a82e536dc4ba3aaeff17145e55", + "0x609932ae0365219c05069232d38a4015c26e9f0e", + "0xa357Cb3CE710a4f90fB9d56979C2C3634E3965bA", + "0xdbf187c53b650ee2123212952721beb40b5831a3", + "0x23efc62a60bfe4f0186cf19a57116780f86f1aa9", + "0xFDF469a0260032eCC5Be420A4fBb057E80D4ba5c", + "0xc21AB17BE2bAb6D8456EeE72439e9B3d569c7C5d", + "0xb13C38dDCf7AFB7B60Cb5Ce7D1208E4B32d8057d", + "0x3f6121301D1E82F52285f601C3720Ca6514090a1", + "0x9fcf8af7b438ca64027aeeee2100227b6b16a223", + "0x0bdb7a4862dfe5e50b55c0496f60c5fad75146a4", + "0x9c979b94c398f559002e70ed626c9cbae16e8078", + "0xe31ce47F1A20388a47E75F064a58864CD2Fb8E9B", + "0x40BCB1ABdF0927D0730F4D446638F3716e7b78d0", + "0x651D5A6eEEF435250F3bd8c02B3c6Ef18f4BBF62", + "0x4858ce44be65a79811f32417801b832b423de0b5", + "0x5b5bC1Cc56508eE85353E2483B496746fB3fC2b0", + "0x54c375c481f95ba43e2cecd6ef30631f55518f57", + "0x3c922da1d136b7c247788274fa822afc4cabf1c7", + "0xf183d7fb6d86f60c1d6794ed29ce9cb3919efeaf", + "0xc172e6Cd78B3745f7DA7805ec44E2428a4d504c0", + "0x7a0EF482134aa53468850A7b117EcA38A6a3003D", + "0x127bbc2904dbb53cf601782fc12fa4fd633394e4", + "0xe3B0f7AaBA333929d6c76d4602ee11D88D61f40F", + "0x16ed0fe6952dab8bb1f1c1dd132a24d15b094419", + "0xc47b507e2a1ec30241b81fa34f884f2905ebd636", + "0x7e6f711e46aa8a02980831b7efac0fac5a5317dd", + "0x6ca0c13222ea09a54119564028b702faed716b8e", + "0x10276ee2d57bb73d8cc5cc39eda1a4a37e820250", + "0x49c87bbe3eb97d398b5e77ea5b0944b79ab78e8f", + "0x32c6B5db05b98907A29BAeb7d09C79c95498B17a", + "0xc3c49f73499160a3b31d91f0f4c5a0774e4635a6", + "0xa39413d7129e9377a54399b39b7f37f04119b904", + "0x6f83d7e5c7fee67775e8a77643a98f584ee3fc61", + "0x82140b0f9716e16f2c10bf4f31bc73a46b69ac04", + "0xE2e4F2A725E42D0F0EF6291F46c430F963482001", + "0x0ED04A0ce758BCfd3FbEd18Eff24ABD9d6DEF44f", + "0xed83a6d734627d1229e08db5e7b8c0687d2ae3d3", + "0x0C5a2C72C009252f0E7312f5a1Ab87de02be6FBE", + "0xfA6C4eF9E978Bbb3a8C7ea39eB9AE83E138B2161", + "0x1921DB674F1368fE9F66610897bE5bDa1E7Bf903", + "0xe088AF7f0d5097C155096559950f1D4087608ceF", + "0xb6798c96e14c379c79fc19d37cde013be25d0d15", + "0x60991340ed005009611eE30daF82ba6E894d5616", + "0x446386c4152618254286bd3b6fee38f18b1fe537", + "0x50a4a104Da74B1B8C77a671f2ac90b2062687173", + "0x4c37f89682c04e0f657063b4163d9a5c8e903984", + "0xF0177F327dcA75588B96c96b4418064894Ee234F", + "0x8e32b9eee4307634a62f3a0ef756641c8aabad10", + "0x516ed1228d4b85a3710fdce71c7fbdaac05cab4b", + "0xF3FE121f304Fe3E56dc93eFD1645B48056FeE914", + "0x022079E00421b117B3A99A857019A2B1271C1501", + "0xb95a62bfc6347e808751354653c95780550771fe", + "0xe8205e04a86d11856cdaf51375c251c1badfb60b", + "0xBbB1C9a4ea0c16069364948e4002D3A7361358D5", + "0x2b2bcbb92f195a44268531178aa5d2d077f01400", + "0x02fd85e93f38660623f0e3228a319a0dafab8901", + "0xa5da33624882a27cfba77cdbd764d1f112deafc1", + "0x0154d25120Ed20A516fE43991702e7463c5A6F6e", + "0xfe1a00487dd9eb84a7363a1c827a6f045fb121e4", + "0xfeE5f64C87eEC05E83DE4Ca73534484066f9c5c7", + "0x10271D0D0E9b1f3b79aD0DFd1612190fba1A1c38", + "0x0DC6794F2eC9DC2E9B23aB2B1aeD26D48BEB78B9", + "0x59F44e629FFfCd2517162bB618E36c89DECfFDef", + "0xc8b50f9faa79b1be1de6c8714309050229e0a691", + "0x04bb958eabd3eb9ca4b9dcec8be858175bf9a4c8", + "0x575478a33cba6c3c99d7f534fc450c2a8ecce756", + "0xe8be88ee7baf938ce05aff2af45a1bc013c14d0e", + "0xce53a0bda1979b451df4b85954d8762cbc881bd8", + "0x66056f248583a0a6df5b52ff0e2e268c5196db0c", + "0x94ee23c8316fe744a7568b2ab145728b633cd60d", + "0x3250A2576611f3bFbdeAd0005b9E3A2a1F6FAf50", + "0xCf83D441D8838acb8C4d77f7Dbc661aD9aAea7Da", + "0x93cE3113649003952DF881248e84964283770B80", + "0xdfa3955344b1ada04a218129b08fbf70823b1801", + "0x49aad95Fb8dD95bfc47a16675755184A1bDf433c", + "0x8652fd2e74d2276f58c30ad232dbee5467abce4e", + "0xaeecaede7f29b4dc35571cbe63573d3d5ca24865", + "0xb090f0b407dd6a88a7fbf72a994a7c1d29ecdeda", + "0x8f531ee3190c32467f19a693a3222ba8a9d7d165", + "0xed67023222687f6412697f11e24c036da35859ed", + "0x3941bd5327276732c231f7cde8dbaf458f33b918", + "0x2bba0f7ef4837af2b02bcd81c55c88d8c26a2c60", + "0x89956d7c94447adfc0e9f8bdb51cd400e0dfd9f5", + "0x8ae6422631292c31aeeb2efe154d6326f703f46b", + "0xF55A646dc8302cd5cac290eBEfEc97853f88967d", + "0x1fdd5814d3d23fbf93849b530c825ead5f83d63f", + "0x6B7A4166a06B988E90042F4259741B48870e1647", + "0xbf891e7efcc98a8239385d3172ba10ad593c7886", + "0x935e1408c083d2885536737d4c4ccdf97ba017f5", + "0xf957e8bb6ac674901549be7761327da602ebec5a", + "0x308bff328370fc4a9683ab9fcd79a21be6dc5ee4", + "0x7C51640BB61607F1d43969573491fD4f5e243779", + "0xaf1fd55ea07caf8ade7549b21e34b838cdf4cd65", + "0xf41fa837908c0318a9a2b739c8fb990bfd4ac8a7", + "0xd187cb06753b747688960c7926d5de8f16f0545b", + "0xea99bf156f30bdc748d452d8a4e178fbe762762d", + "0xa09ce3af7c2dd44088855734eccecffdcc79b6e7", + "0x8d8629128c6f801a1d873012bab63c0198a5bf0b", + "0x1CEB9Ed30ACe1aeED4c85b7cBddF161fF1D5B4aB", + "0xff0092b5f8cc4fe7d86cc779ccef6ca449e12596", + "0xe9096ec0c19cd0345d8474de9e26c166cd08cfb4", + "0x3ec7db0c256127b80abb725827de4cf596f34d1a", + "0x0704e9724dBc2e8Bc519dDf6EC2946E9b03B5a03", + "0x43f85176a75d72e5318d7fbc139bb2fb281bb050", + "0x9Ac1Ed9517c7a24C745C2B7E7FaE95595Fa2f7eC", + "0xb75e6A898F4D7dD32EfEA8D27094432b0f90618D", + "0x7b68f600f6c75b7a3f639cabb53e4d2450b65779", + "0xe147307b9a973acc16701d56b6bc83bf20623b0e", + "0x506e229770622b1749be688ac093e98f18bcdd96", + "0x6bCbC6Fa460241AC1dfa7588160B51ff94f88733", + "0x23b37371d63945e817455630e2861d010c8fb350", + "0x87df884d84cfefe7b12c579e86b16e819f8e6abd", + "0x065c85dcbeada4da3f4a389fcfc9665dffa1d490", + "0x1b3853443592283daa3801f07c1c6f71bf66561e", + "0x79B786d1A98eaEab375AE6DAb606cC3125AeD13C", + "0xf4068204dc08aa0aa4615ca1f2e2ad506fb3a669", + "0x9272a47d977ae2196412e93fc1d9926b34b6f8c6", + "0x18f299021e83d4016435e53b30bb328a326d6a14", + "0x20c70d385535127a71a35d34712fdc0ef63cb818", + "0xf639fFF07E0ef4e885B9Cb298CC5E25D0D7A09b6", + "0xd8bbb01d0137187d726d073d1b2560901ef20b8f", + "0x48c856f10d5930dae3cf338173247ab8da94d308", + "0xcD229d3B59Ee4beBe9a09c528857BEE35B2999b9", + "0x049808d5eaa90a2665b9703d2246dded34f1eb73", + "0x0b14bbd67612e1e06e55f0492b26998b4e7f355d", + "0x11456b3750E991383bB8943118ed79C1afdEE192", + "0x56f293b529de0aa91b5a90882946dd78aaa1dd04", + "0xdd3f3f81521dd910d9eb1fbec40a1713a67643b9", + "0x1fd1de7e6bd35950a05db410f871ae6e4736c3b3", + "0xf948a0520674a9b28e54fcbbaff82efea0cc7403", + "0xfd3e41d48e3b87469c15eb4f0af30a8f297a335d", + "0x4a15bf39c18c8812b6d19fc76540798247aaf2af", + "0xfd1c0251c29a81748662d553904ca9aa9ba66510", + "0x2961768cc229226e7d83c0141c133789487ba763", + "0xfBF75933e01B75B154Ef0669076BE87F62DffAE1", + "0x3f6fda73bd15a8c410aeb84c893888bde4877f9f", + "0x4ada43db92c99b2fc721bfad4163c21e86cc1bde", + "0x12b52e25bc0a78269a37dad59d672702f324c3c6", + "0x97b93fa9a692467619db12cb4860e6a5b12bc0ac", + "0x5685bfda07c502bb85cebe507b9b9481c6409c4e", + "0x23cf923e6587977ddaf1c9b61f032fb91b3c4262", + "0x7e8d9704a750caac505d4a7d8f5d5782c909735c", + "0xb74e5e06f50fa9e4eF645eFDAD9d996D33cc2d9D", + "0x484851ab627539f443ca8eb7fb7e0e06decbb0bb", + "0xb0896bfe1a8c45e032f401392aa7822cde89e296", + "0xf71e9c766cdf169edfbe2749490943c1dc6b8a55", + "0x9f6c7ee09db4c6bd5d3a52cef903184a5d1b94ab", + "0x1a316a779cec8af3be9888c9f7d6c800fc713381", + "0x46ebB553C048150Fb8AC25749e0e521cf27b1bDd", + "0x4e65175f05B4140a0747c29cce997CD4BB7190d4", + "0xf0f54fcb2f7fd9ce39b8e258ff22a0b1faab5f1a", + "0xe4bb6f84e5353ce688955d1a17a6a3e3f4cc1106", + "0x4e8a511f117c80b97db153fd0adf77986078e175", + "0x7251e81e85b41b561ff1b67f09969fcde566a343", + "0x42703d57290C883d30CCFBA2fD95cfDD6Ad43389", + "0x4c0afbc4851e8f519ace8cbfe69960ea72fa2bdc", + "0x52e081BdB1a9e975fe6e6d0549228E6F23506839", + "0x40bcb1abdf0927d0730f4d446638f3716e7b78d0", + "0xd8950d147acf919305ad1c50c4a010348d844aec", + "0x33277E03921216b414e2DBf735bbAc307122e71e", + "0x29A469d0f973A91085AE5a589731439c40cb0273", + "0x66613f90c76fecc8d8e8d9bba49c146c48ccbec7", + "0xff59f3a717debc1baa57ed7fe643979e0349490c", + "0x0a75b714dc3c51770e715b78e637bfe53de3602a", + "0x1adC376b6d299BE2312D8E4915151F2b17942e83", + "0x064c2725b6e3450d7b3aad53230a34eb1342327a", + "0xc46bf9ceeb7e691dd38e6c19921292d95ae63df4", + "0xe93fd4e3661a7ea54cd7810150670a803d5a48ca", + "0x6689B9D1642bb413C74c35EeBA13165F755f26FE", + "0x91b9a8e151a6dedc98a986e4a38d815e2664d385", + "0x71f0e51cd819a94bb7277559f8a9c8bf3955b720", + "0xb7b2050e12dea380cb9dd238b663627fb00edaed", + "0x1bc6955e458927B30eEeb6daCe42887798E69B3b", + "0x0deb845de6dd1399cd704ac10e07e8baa8b80472", + "0xde7ef44ee1016821Cb3E5bB16Bf0555a24D5318F", + "0x263F1Fce39438e46d2fdCBf9AbBb27D4861C3C78", + "0x3821f061f9ba3d4a18213d89820a894f24eef861", + "0xc2d3cdf331cc047c4264e536346492c6e47ad5da", + "0x44662200446ace5e18422e4f87f93159ee3476d0", + "0xaf1fd82b52490810280e20906433ee7f720b7879", + "0x386aa438255692ead400a2f41311a2ff558c1638", + "0x68039e09cfebc8eb057a0014c1290531475a94a2", + "0x1bd11a33f17deb442612ef4fd3cd1632e5c553b5", + "0x343ac8eed9b30265cbce4606bda2a6f13ecd2f37", + "0x692d82e74cbff5ba5ed08b36b4334136fa1af035", + "0xdef158db79ea76beca386334f76aab897a31a059", + "0xCe1DAce77636B2F24E16D4B10631e61f42003622", + "0xb8b713e162c5a923e35430ad2e4279d19699285e", + "0x38500b07e5da793a80754495d65a3ac798d994f4", + "0xc70CDA39AE512Bf08f83Ded8Bc4Eb143B5169A0c", + "0xa668ac5abef2c9cc7fd786250c9baeacec8d31d5", + "0x8b865742d0ee022696a4bcb00fd13aaba8b9e9d3", + "0xb45E2B252969394a48E46616378f19B1F1f32BdD", + "0x746dff22206ce4e3da6d7eb4d537398be8f236d6", + "0x2c7f8156a82c4a8040dbdcd96ba025b25ddbf9fa", + "0x664dd5bcf28bBB3518fF532a384849830f2154ea", + "0xfd3241f1707286f8aa6287acd3a79db68823f1b9", + "0xc65d0b3e71b436a16cfb44b8d18385e1ccce8b05", + "0xc1f3ebe56fe3a32adac585e7379882cf0e5a6d87", + "0xea32cf979bdaf8d3bb4121d58515d4623a27f3e0", + "0x9dabb8374d0c9bf5a925eeed7a519dcc6b41d8fe", + "0x2287b42b2f1c24b09309a6344ca931524e5bf3c6", + "0x88bbC65ce4703f6E44B7C308851c1D636B9d5568", + "0x0fbad79c4468a074ac0972bed4e6fbfc85fe73a4", + "0xa9925a2ca46cfba3323a7df03a85acf3a13d2504", + "0x121b7935d05638b7e61dccb597778c4398c77c52", + "0x3Df53E90B28c00021F751a560017Bf9f62642634", + "0x5F6e8cF2da87a8B2241BA20eBBc00086422C577D", + "0x3954A503BF87f49443Af1e37a23393B77ffaF1Cd", + "0x896c801dd263806ba8f0b72c4ab4332fddb15bbd", + "0xea492e5c2a980d004680c543a57cb6ba3d88d890", + "0x615a838accede19e85703b105cb7d021550bd824", + "0x0056d1fd2ca3c0f3a7b6ed6cdd1f1f104b4bf9a9", + "0x87921997ffa6cd9cfe582444e21184cba1baf068", + "0xcd478940097c87892b3d5fbef262be453fd8c621", + "0xffb08b3fc542b2389df5b387f236650ebbb8de2c", + "0xca365c6868c9d1ee41f331fcdd7da197343bdeb7", + "0x0be4c5fcca0d670f63c4eaa3119caf30832551ee", + "0xb5565f9e0ff5fe4b911779ded17a70766591a00b", + "0x655e7B3E2De362FdF8bBa51d7707a839F56a7D87", + "0x40323700111f1ca44f6d1cc151b6c37034325415", + "0x66f5922f6e0d799f45111d8ea6bc673aae628718", + "0x6a342b28fea0f96238364e580a5f9783a690bbd1", + "0x96B8a02dad59E319fA44Ca634228f9e4Cc7B9A75", + "0xa1ff30a2448536712c68fea0d74198ac13f7d290", + "0x6e44d9950d4e7004f78685d77005fff66dd63b97", + "0xb388ff93e354bf385808a2896424495203fc79b9", + "0xb86046290df993def99bb1c132f53fa47bc6cc8c", + "0xb833e7294a4dbac2c784d7b529c388918d6588af", + "0x6b5516e2c614fced1f54f6fe3083657c8b95ad93", + "0x74a64c78657f0b753035cae35cbca76ac029827e", + "0xfb8e4dd7fda377bddfd08401616d997502564214", + "0xa5a846f077a6134a38a532ee3e6d0bde30713554", + "0x62afc3c3d85a16cf30eca5eb8467f997767ab019", + "0xeF13101C5bbD737cFb2bF00Bbd38c626AD6952F7", + "0x61406c9fd8d96c31484d9b3e60fed285dbe88d00", + "0x05A1ff0a32bc24265BCB39499d0c5D9A6cb2011c", + "0x0bae7d98e1d67741bfcba5d90b17a9856b1bf82e", + "0x39BAaA8cF7ad06E7e0c5A0A2BdcBCFA2B0879FCe", + "0x1c0f24c98b35181fe6610da44252e8ba8e18ff88", + "0x46761f1d443531afc94080e9f93d7aad7c75ae87", + "0xd30e0c2c3B5CEB878b70052EEd2B28A61cE84374", + "0xb3942710dc30161B69B9ebB11B6F3aDa0E211DA9", + "0xee620a0991d57f464aad452789a4564ba51245e8", + "0x382ffce2287252f930e1c8dc9328dac5bf282ba1", + "0x96a64786a31993ab07d3dd628b21a296874057b5", + "0x1E5139c78050D014f05968Dc5c0755dAe958481B", + "0xf50af7bf2604d09b4c81bd16177de6d8ca0b5614", + "0xb77e77dfb8f0f27379b1bdc5d17da612e2854d19", + "0xef03d86c04eec601ea63d084b6340202d3bf60ef", + "0xa2db3cb712158e489481b734b25a9f7d49888ff3", + "0x0f46540678c7e6d2ef983b382cc07fa815ab148c", + "0xe35a7cC9EEC709790d27255d3b12dAefA3346806", + "0x89778fdb388a0cc83b19b51f0b50e78100540b43", + "0xA93cf81692Bc895A3d1F2198F2617ebdED589cC1", + "0xcF7Dbe8e50620C0b5f466FeF79ac8C17feb022D5", + "0xccd4c202ab2cd6de8fa3158553f1c679559ca65e", + "0xd565ed001af98ad11a055802b71754063e92f7d2", + "0x6a1eb61ef517a717b6edc1a9e130c9090bef3067", + "0x395c21e566FBca61074fA0304C21C5729FF4D5FB", + "0x0fef682990c99003acf47cb9cd872b43544547c9", + "0xa02789210589674e72a5f780635cd7788e190810", + "0x62b3364ea3558c3a7d1597c5c5cc4d0d584c6ea0", + "0xd783947ce4924147f35b319BD247eE628E7fB0BE", + "0x15d37a2C7E4a88aDb0ef5a6C85866a54D261201D", + "0x77bc51c7dd3dddac29f865541f7f54bf2cba5536", + "0x71fba518ca86d6defec196d1b15a7e1600f178b5", + "0xf810a0afe1a5047b59dee4d150be354918a03ee6", + "0x51d79f656f5107c852027adadfa7bda8670d754a", + "0x30eeb48d670900ac1995ac70f0fb638892103538", + "0x7731f1e4cf3367f462e1fa20d356061a5c4ec169", + "0x8f10b2ce0868965f47b74ac9950af395ce976168", + "0xdcc40e2c3bc2a449edd30c4c2074b9129a0eaff8", + "0x91Cd02F918B53B813cDfde9B006187ab864BF4da", + "0x37b699d7eeAD58433d352D1c77b2dB1391F11Ce5", + "0xD27e8256196d6f794c4329644C225b7b81a260f7", + "0x6323f49d0497e66370675eae765cca42125cf60c", + "0x1a22dfd1efbcfc1ad64048a74cead55eb5893db8", + "0x543dc1ee988931db4fa3badee217a1194775ad47", + "0x321F602B63338C674B63239821f17A83eF63e5C6", + "0x29c25cee4e390ba6ea51161aabe814c9a2b0a8f4", + "0xc57919a187cc4393c84af22a049fa6ec61baa7b3", + "0xef14db00cd66cb91c9304377b58c258c56a8885f", + "0xF4DDf881f1F2a98A33791cCae1D0A9dE9D583490", + "0x1311c89f7b461403714fdd12e9b9a5d845220e9e", + "0xf8a3d3462a3893c809f62f8cd7c30daac58d7391", + "0xa6e8321fd36a5ce212d9fdb75c6167dd934ac64d", + "0xf05f8e1a75c854d6faf26230378ea73c630ea1c2", + "0x8af1ab22ef2c0d681eb29b5d7a9b107be564648b", + "0xabec103490266045706b44f83cfaf73bc6532150", + "0xdf09357b015e130070c95716e427ac2345268882", + "0xb90bb40397eece494a08de9118b32dcf2b37346d", + "0xd438519711b9aae3e15e33c33387ec2f0aeb5fa7", + "0xb3e1b74963301d2ebd72eceae539007c3aff3424", + "0x68224861d426eb0418ca9589a96a80b0084e5318", + "0xe0a531054d5d7c292fecf01aba92f6ad96fd6866", + "0x4a35dd01b9e259902996f7c436f379c2ce77e047", + "0x58e52c2f983d78cff50861c59eed1273c83b327c", + "0xa85291bcafb061e61edac9b234ccb27864d6c6a5", + "0xdE654740ec9d0AD6D9fC85EBf813A77A7A7719B5", + "0xcbaf0ce12be328b14a65482305536e0eeee4d6c2", + "0xfd6a9CFa6775E6F13C390ac76d5952eda61c8a9F", + "0x2f3a1f7668a9f8b640dd498a6a6392c6a0e851c0", + "0x6a42f3f399e7e001fc8277a11ce009593397ef9e", + "0xbDfA4f4492dD7b7Cf211209C4791AF8d52BF5c50", + "0xA2A4f8D679C4cC7f2A05997549eFAcf629BD96b6", + "0x5B10c77f716cc369FB29d28F04e96c9D340db198", + "0xdd70fc7959a24335b8ee1a072c3d9b0ddad07540", + "0xf0754756e71aac7ad2b6497e7006f5e44d68d592", + "0xc7c377c11ad9825b17c072fc2e17e9b9f319af7b", + "0x89808C49F858b86E80B892506CF11606Fb25fCDC", + "0xe3BB6C25E7962338De3c4566125005a1eCEc688D", + "0x2cad6658ae641a6cee952739323f52eea0a0b730", + "0x9ba5C3e4f8f841588DBfD3303cd96987f1a8EDbb", + "0x0611bf5a24c05264a940da19e98235c3b873ebaa", + "0xA23D00D0d4DE689FB872cE4A514ADF58dcE2cdF0", + "0xb7c02b1559761ff327ba7068566110e63bea3fa8", + "0xe9f56631c86539e232ecb8c957343795600f1a33", + "0x4c4ecf6973b8ae95f4189053955d0fc8938aec37", + "0x346827dd9e3090b6d43b38cad98fa0633eada622", + "0xe2a835ca86dcfea83c93a6c636192a730c0b5651", + "0x3c5a11717e263f0e7caecde34cee12c0230ba4e5", + "0x33413d420ff4bb2496fe3327a70f84c14ee9f92a", + "0xfe568475cfc25563b5a5e9769f56b61df85e7dec", + "0xbfd87b843962115b5249a4272dd577c412e7cc30", + "0x1c03523f40ec2a7e1b1ccb7d3a3cb719c3a86bed", + "0x934A3231e52875AE84fB3e6c6c42F8849Bca3530", + "0xd08cd15d59fe43371e9bc74713227c7940a84e89", + "0x1b651249802bf6ac59d4794025d7cebdabfcdd38", + "0xda3377e2e3bb2106c9d915257dbfe31b934854ae", + "0x3597FE5f85ef4c23c94B8A53Dd94C8106B90bfDd", + "0x93fe13bb5cddd95766bf6d0e5720d8d768276408", + "0x28f00731408efd5851AdBe89748c047FB94abd35", + "0x1f413aafae36cb17fd03b771ac9be217d1846277", + "0x8db3f233f00c16f5c29347c308ac6c21d15bc450", + "0xb9d0a141822254047a6f3cba698c50119151b6e9", + "0x60d1DF05426B3d7400db3aEDa1824c287cf48BB0", + "0x29bf45b62f13b7a0f413a1252dc2056014ec45bc", + "0xaa995cC7c7D5C141B51b8Bb66233BF04D9934638", + "0x6694fc7dab2f34b010bb87467f6cc6c2d4534f81", + "0x8a3db8e88dba75038f32d98daee70dc7812a8f0e", + "0xBBe8e2EA7173095325034Beb7F44ABeCc54cCCb9", + "0x2db66a069a3525c72282188324209c1e90ec0fa9", + "0x3e62E286485352Ff5d356FB5c69e2bb54a9FaD28", + "0x665B835fdf8B546d0c5FE6757349F3413E009141", + "0xfd89b87dcd3ae8fe7d3b255e362b3c61ecb25ced", + "0x32c6b5db05b98907a29baeb7d09c79c95498b17a", + "0xc677d6f9085d6e2558cb2c7e541a3c7b778c26cf", + "0x9c2653890dc1d2b060c8b7254dde42fdd0f39cbe", + "0x70a12fd75368140Af1D3122768954690c31cA93F", + "0xf1c77ebf0259344bbbbc62004b0853389ec41eb8", + "0x0bDb7A4862Dfe5e50b55c0496f60c5fad75146A4", + "0xA99C4F924a167cdEc1486aa9920de70A48455Ab2", + "0xf1e04cf8bc4a651efa9e1df7f0239754d6497b3c", + "0x1BeDF678eA91476731Ee1b32Ff8111bB1e822251", + "0x53ac9d82ebf90bf03c539119fadb82b86293ab7b", + "0x452b8aee94894b8ff6eeab179f67ed8d51576579", + "0xf92d29ab6f4fc6fc615e53f9787c986731eec496", + "0x1aca3e1d77a938f82faa91dc72bd6547ce50f80c", + "0xf06e77fd9289763c1efda7b6901f388f47656102", + "0xaf0ecb650dc88fe38dc3873b9f40f017f1b72063", + "0xfb934c5fa224675ddc9eed88a36efd5b310e6f2c", + "0x1fb0934bc8b650b9869034eac4ad4d4382020c13", + "0xC3c5ac9C328323e53DbdF064D94779436B91C49A", + "0xfbacc44585ce38d28832f71033de1b2e9f879525", + "0xe12c95Faf4656bb4482A9a840901d688F90bfe72", + "0xe5df8c7f12d450518402281ee4627aa105b5dd58", + "0xca75804fa43ea23fb65829c8212465a7145f213b", + "0x420379067fc6e0748ea1e7cae070217f2f653be1", + "0x4806688dfccea461b645f08b9cd2f695999276f4", + "0xfd0a10a4caae2f0a88e04b909c782487eb268ee6", + "0x7723000de847d13856aa46993e6d1d499d13af1b", + "0x3250a2576611f3bfbdead0005b9e3a2a1f6faf50", + "0x7e0ed7e4e71f1e4cca535dd98c3c93c8d3cd596f", + "0x9Ba7Ec4C0D21974C6d5582D3b58A81B9102F2bCC", + "0x87Ba3C38282409e6D13156303c43DD73B264010B", + "0xeffe47642c3674fd20f41d57faf114ffe121e63f", + "0xfeb90f1ac4ca82569fced3fbf91a9de3cb767b78", + "0x403cd03c31513c1f896a7c9e04c5e9f470a486ea", + "0x55f48966e93a75a6dc14a372a86dec46447cbc6c", + "0x34f2b150432044e2133b2445b28b723d30885164", + "0x2fd93906dc0e917b33385e477e1b70ad5ca502bc", + "0x5Ec9eA9045977C521CDdFF6DB054FD63AB40b24F", + "0x69b07fc8ed33596c261bd234652841235467a79e", + "0x75e8609c69869c5CB298cE5B1872bDe088A73330", + "0xd27e8256196d6f794c4329644c225b7b81a260f7", + "0x2a6F1FF63Aba4Ce7eBE7dFFefbd64F272EC3b983", + "0x184bc1fdfe6a947fa09ef97b84d8990d52c7acc8", + "0x05348c9cd6eb9cff8f1c442714cc0a556f176d7b", + "0x34417e7a17b28c11bbf1a50596538fa2e202c2a3", + "0x0712d172d2a75906ff9c7d3052ddb2568877aee9", + "0xbd356a9c20771d2be448bc7a556cfc0930c726fd", + "0x5ef0d55f04074930e11753f5a49d139cb8cd49df", + "0xFe6f8b49F6FC5a02629c5F57915d2a154e252857", + "0x908e8e8084d660f8f9054aa8ad1b31380d04b08f", + "0xBc1891925a6e4EdCC722656b81bdb2A340C0DDaf", + "0x6722c3b2564f565DEefe16405DeD07fA71Ce76aC", + "0x14D499d5409d670Cb853112176146b2C4BD47089", + "0x670bb3b8099099ab380a071303f3cd57b3a08d9b", + "0x9B84dB09103116A221BEE2748400ac3eE77DfB53", + "0x23c043a293b302e146aa9fcf9a9ca937b895dd56", + "0x2c315e93ed4233fd531f88e2a8ec25ed8822f382", + "0xed561e40a66e791988977c21fdc7f083e9bf24b0", + "0x5ea755f7dd3752e83950c298ad5faea684b9738a", + "0x942c49ee2d4f100050fdd2656d0322aaf7b789ec", + "0x91b64b13a7df73438b552da8104ab1f65bd8114b", + "0x755fd3fa2a4bd8c67f405894a3b1992771cc1d2b", + "0xa531b15b12ec023b91b1a31e9ddd9e2fa674c3c9", + "0x4c979b7648044a198e7e918f88f2c72f9544f37d", + "0xd4fa23307a181B9ca567886eB5bCd5c8f8f8bB3E", + "0x6Ea37ED3c988c215957fcDEb7C381fD827B9BF5c", + "0xe5A8654631B3729F73ca3503bA09a5d3e11b46da", + "0x2ca7f846c00989a80c977f02e87f2ab5d8c44a09", + "0xea37869916007789da842c5710c7d9ca999a85ae", + "0x4d037ca248ccf0768844ce52cd122baa9d80552b", + "0x8090487fca05bbee5f30117df57dca5630919a50", + "0x5fbabcbe85836609a79429fad2fb06518842ca34", + "0xafac95116ff5116cdf8b6128f509b8fc16dc5ee3", + "0xd6ac395afb603ee7f952aaf340c37c63f2988a4a", + "0x2E727a110b0256E26E1311b557D53FF47a53F573", + "0xc9f625c82f248558948705360624a502fb957c54", + "0xe53ecA73fC23b395d4a6A5C652202923A7d0b240", + "0xdc822485f112d3a4339c05694aad9c381c9af2c1", + "0xfa10e528c0a3b209e832aa2c233e70fd766cb26c", + "0xfee5717f50769c148df42ba9b2dc2d8bb9eceff7", + "0xda03207429d8c74be1f033e296542b529c95fb4a", + "0x8C42874173b51674a9e4C18998Fa6B86070Ea2da", + "0x930a7cd60a633128b7c5181307781e6d033ba51a", + "0xbE7fF9356D8820e720c514698BAb556eD5ad59dc", + "0xA4FDC2103B412cC142bd7715DabAB06F08eF842B", + "0x4b10fb28c326357d943392bb5f9e27c02c25200e", + "0x6ef13909698e4b287ab35a39088f0e7a57588c22", + "0x19131C3Aa44A344396492c85E4858B7505a794e6", + "0x4bd26cc6072dc2c58da7adb7065ea744382092d4", + "0x64e2965226ae776f4a76ac5aa2110393e82ed2e3", + "0xBea392Ab5E7427CcB2FC45A407A0A59C0cE80430", + "0x2143aa8c34e55785528b6cb4d1d413106bdffc92", + "0xdfc0ed701cae22293d809db9bb295f5c268ea7d6", + "0xcB4D38e12cebccb0C15b9b660BAbAe7b9494E8F6", + "0x44f979aFcC29D19f71cfC04A31E4754b36f6df85", + "0x1C494f1919C1512ebE74a5dCc17DAC9A64069023", + "0x1e7b56e1375ffbc659a188bfbd588ea1d53dc630", + "0x25f677051626fC7e1d0674c36c3bCC945Ea990A0", + "0xA660db2b20b58A448e848d0Ea8799595C482F773", + "0x31a249bdaE239eB983B4b717B361C43DF7ee8bE0", + "0xa0fa93efb404d4083aca0f958e10a42d16521a70", + "0xb27d6d2dc7db331450c827a7bad3fc0e97bf386f", + "0x58531045854c0c2548ce0a192800558808c57c1a", + "0xd4dcabba4332c2a2c67324f8d3d7621f4249e2e1", + "0xde3e20234ee87291c195bbb31f4b7af7351f8398", + "0x90fd836aae334d42b85fd7ce0b8c4a43afaa1c69", + "0xB3cFe70f6545a04e2700BA71f4EF5a37d36b25dd", + "0x1e14940fca5d7b3105a0115dd0747c3ebc649fa8", + "0x5e1b03a7f15e17b59d9b3b630dc6b40144bab7e6", + "0x662ae464b3e4e34bc2068931e8e7d265c5c27453", + "0x2a530801b38a01f69ec06615ffdc384545a8c432", + "0x2e40fe6babea94ca946971ae0afe2543db981631", + "0x46b756702b865af30cc0edba27e6d550e775a904", + "0x02e0ab5a0b8ae2aa8da79d6c2c9dbccaf9f725c3", + "0xe756e7f14be3270d918b576e40c21aac1f80dee2", + "0x4082150abbebe4f63ac77e9db6fb7dd65eea7e69", + "0xe3Fd02Fc12cB38A8074BA8bC4a77C5de9aaBf0C9", + "0x5e00b5255e81aa506d95534c3c0aa493e7309641", + "0xDec2d9d0AaaBB2A70B96a433328CCdF6C24199B6", + "0xf97020862f4282dfb21b781e7b760ee63e212dfe", + "0xdbf12da73b3fa72835ace6c943a0a59fda69e48a", + "0x92c20f715472aad2c7fc7284f0c2e4fad39e28af", + "0x368247207aa443e8fe18df18c266d67c4db56313", + "0x1c727a55ea3c11b0ab7d3a361fe0f3c47ce6de5d", + "0xf66866c2e3649b2e150221a283e9367c662d75cb", + "0x2f223c4854fb916523c2639be5877588a2d8bd99", + "0xea06c959c985ba421e4e2d9c2e461aa909169a32", + "0xe7e4f9a12525fc5e7a214819f868767407a05fd9", + "0xe23cd65ac0253f67aa75666765e3350d14117866", + "0x30741289523c2e4d2a62c7d6722686d14e723851", + "0x1a51bd2d1ebcd646f398d8a6608bb3741a7be613", + "0xaaCaEC1b466E8FAD895030f5F30fd7cB087b2db4", + "0x1FE9Fd1156688699F4ca017E72ee0D9873f9d758", + "0x6e90789b5ef0b28710951aae7d8024f1eb46dd37", + "0x99f4f03f53dc5cb4a1bb01ebbe29a5a4104c1ead", + "0x4c79d8aaa05333cc3cb841162580502f871ed0e9", + "0x6724578f7cd48090922C04a75BeB56740e23F850", + "0xf5a1f491dfe91e4078a05b30cc477de7888f5310", + "0x7b7a7d5d758b83c900ced4047d67da89cd7157f1", +]; + +export const whitelistGoerli = [ + "0x9D1A807355056442F878F3bBC22054a0677e7995", + "0xd4fa23307a181B9ca567886eB5bCd5c8f8f8bB3E", + "0x484624a2e0Ea9D1AE01Ad4EFDD7B52F83329f3c7", + "0x9D1A807355056442F878F3bBC22054a0677e7995", + "0xd4fa23307a181B9ca567886eB5bCd5c8f8f8bB3E", + "0x484624a2e0Ea9D1AE01Ad4EFDD7B52F83329f3c7", + "0x9D1A807355056442F878F3bBC22054a0677e7995", + "0xd4fa23307a181B9ca567886eB5bCd5c8f8f8bB3E", + "0x484624a2e0Ea9D1AE01Ad4EFDD7B52F83329f3c7", + "0x9D1A807355056442F878F3bBC22054a0677e7995", + "0xd4fa23307a181B9ca567886eB5bCd5c8f8f8bB3E", + "0x484624a2e0Ea9D1AE01Ad4EFDD7B52F83329f3c7", + "0x9D1A807355056442F878F3bBC22054a0677e7995", + "0xd4fa23307a181B9ca567886eB5bCd5c8f8f8bB3E", + "0x484624a2e0Ea9D1AE01Ad4EFDD7B52F83329f3c7", + "0x9D1A807355056442F878F3bBC22054a0677e7995", + "0xd4fa23307a181B9ca567886eB5bCd5c8f8f8bB3E", + "0x484624a2e0Ea9D1AE01Ad4EFDD7B52F83329f3c7", + "0x9D1A807355056442F878F3bBC22054a0677e7995", + "0xd4fa23307a181B9ca567886eB5bCd5c8f8f8bB3E", + "0x484624a2e0Ea9D1AE01Ad4EFDD7B52F83329f3c7", + "0x9D1A807355056442F878F3bBC22054a0677e7995", + "0xd4fa23307a181B9ca567886eB5bCd5c8f8f8bB3E", + "0x484624a2e0Ea9D1AE01Ad4EFDD7B52F83329f3c7", +]; diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 1fbba82..21aad67 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -1,5 +1,6 @@ import React, { useContext, useState } from "react"; import Nav from "react-bootstrap/esm/Nav"; +import { GiSpottedMushroom } from "react-icons/gi"; import "../styles/sidebar.scss"; import { Link, useLocation } from "react-router-dom"; import { Web3ModalContext } from "../state/Web3ModalContext"; @@ -11,7 +12,6 @@ import { ReactComponent as DashboardIcon } from "../assets/images/welcome/dashbo import { ReactComponent as VaultIcon } from "../assets/images/welcome/vault.svg"; import { ReactComponent as VaultMonitoringIcon } from "../assets/images/welcome/vault-monitoring.svg"; import { ReactComponent as LogoutIcon } from "../assets/images/welcome/logout.svg"; -// import { ReactComponent as GraphIcon } from "../assets/images/welcome/graph.svg"; import { ReactComponent as StakeIcon } from "../assets/images/welcome/stake.svg"; import { ReactComponent as FarmIcon } from "../assets/images/welcome/farm.svg"; @@ -47,6 +47,9 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { case "/governance": activeVal = "governance"; break; + case "/sewagefruit": + activeVal = "sewagefruit"; + break; default: activeVal = "dashboard"; break; @@ -131,6 +134,18 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { )} + + { + setActive("sewagefruit"); + }} + > + + Sewagefruit + + { window.location.reload(); }} > - + Disconnect diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index b3750e0..a05cb54 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -97,8 +97,6 @@ export const Monitoring = () => { const [vaultMode, setVaultMode] = useState("all"); const [currentMinRatio, setCurrentMinRatio] = useState("0%"); const [currentMaxRatio, setCurrentMaxRatio] = useState("2500%"); - // const [minFilterRatio, setMinFilterRatio] = useState("0"); - // const [maxFilterRatio, setMaxFilterRatio] = useState("1500"); const [renderTable, setRenderTable] = useState(false); const ratioRangeDropdown = useRef(null); const minRatioInput = useRef(null); diff --git a/src/components/modals/ChangeNetwork.tsx b/src/components/modals/ChangeNetwork.tsx deleted file mode 100644 index 9d73436..0000000 --- a/src/components/modals/ChangeNetwork.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import React from "react"; -import Modal from "react-bootstrap/esm/Modal"; -import Button from "react-bootstrap/esm/Button"; -import { useTranslation } from "react-i18next"; -import { FEATURES, NETWORKS } from "../../utils/constants"; -import { useNetworks } from "../../hooks/useNetworks"; -import { ReactComponent as ETHIconSmall } from "../../assets/images/vault/eth.svg"; -import { ReactComponent as POLYGONIconSmall } from "../../assets/images/vault/polygon.svg"; -import { ReactComponent as OPTIMISMIconSmall } from "../../assets/images/graph/optimism.svg"; - -type props = { - show: boolean; - onHide: () => void; - changeNetwork: (chainId: string) => void; -}; - -export const ChangeNetwork = ({ show, onHide, changeNetwork }: props) => { - const { t } = useTranslation(); - const networks = useNetworks(); - - const PolygonNetworks = () => { - let { hexChainId, chainId } = NETWORKS.polygon; - let name = "Polygon"; - - if (process.env.REACT_APP_NETWORK_ID !== "1") { - hexChainId = NETWORKS.mumbai.hexChainId; - chainId = NETWORKS.mumbai.chainId; - name = "Mumbai"; - } - - return ( - - ); - }; - - return ( - { - onHide(); - }} - size="lg" - aria-labelledby="contained-modal-title-vcenter" - centered - > - - {t("choose-network")} - - -
- {process.env.REACT_APP_NETWORK_ID === "1" ? ( - <> - - - - ) : ( - <> - - - - )} - {FEATURES.POLYGON && } -
-
-
- ); -}; diff --git a/src/contracts/Mushroom.json b/src/contracts/Mushroom.json new file mode 100644 index 0000000..ad08200 --- /dev/null +++ b/src/contracts/Mushroom.json @@ -0,0 +1,4520 @@ +{ + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "_merkleRoot", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "_baseURI", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_mintPeriod", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "baseURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "merkleRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_recipient", + "type": "address" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "mintPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_baseURI", + "type": "string" + } + ], + "name": "setBaseURI", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userToClaims", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": { + "object": "0x60e06040523480156200001157600080fd5b5060405162001e9c38038062001e9c8339810160408190526200003491620001c6565b858560006200004483826200031c565b5060016200005382826200031c565b505050620000706200006a620000ab60201b60201c565b620000af565b608084905260086200008384826200031c565b50620000908242620003e8565b60a0526001600160a01b031660c05250620004109350505050565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200012957600080fd5b81516001600160401b038082111562000146576200014662000101565b604051601f8301601f19908116603f0116810190828211818310171562000171576200017162000101565b816040528381526020925086838588010111156200018e57600080fd5b600091505b83821015620001b2578582018301518183018401529082019062000193565b600093810190920192909252949350505050565b60008060008060008060c08789031215620001e057600080fd5b86516001600160401b0380821115620001f857600080fd5b620002068a838b0162000117565b975060208901519150808211156200021d57600080fd5b6200022b8a838b0162000117565b96506040890151955060608901519150808211156200024957600080fd5b506200025889828a0162000117565b608089015160a08a0151919550935090506001600160a01b03811681146200027f57600080fd5b809150509295509295509295565b600181811c90821680620002a257607f821691505b602082108103620002c357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200031757600081815260208120601f850160051c81016020861015620002f25750805b601f850160051c820191505b818110156200031357828155600101620002fe565b5050505b505050565b81516001600160401b0381111562000338576200033862000101565b62000350816200034984546200028d565b84620002c9565b602080601f8311600181146200038857600084156200036f5750858301515b600019600386901b1c1916600185901b17855562000313565b600085815260208120601f198616915b82811015620003b95788860151825594840194600190910190840162000398565b5085821015620003d85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200040a57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c051611a39620004636000396000818161030e015281816108370152610ca20152600081816102d4015281816107ad0152610c0c01526000818161026f0152610aae0152611a396000f3fe608060405234801561001057600080fd5b50600436106101a85760003560e01c80636352211e116100f957806395d89b4111610097578063c87b56dd11610071578063c87b56dd146103c0578063d5abeb01146103d3578063e985e9c5146103dc578063f2fde38b1461040a57600080fd5b806395d89b4114610392578063a22cb4651461039a578063b88d4fde146103ad57600080fd5b8063715018a6116100d3578063715018a61461035e5780637bf3227014610366578063853828b6146103795780638da5cb5b1461038157600080fd5b80636352211e146103305780636c0360eb1461034357806370a082311461034b57600080fd5b80632eb4a7ab116101665780634b38413c116101405780634b38413c146102ac5780634c498203146102cf57806355f804b3146102f657806361d027b31461030957600080fd5b80632eb4a7ab1461026a5780633ccfd60b1461029157806342842e0e1461029957600080fd5b80629a9b7b146101ad57806301ffc9a7146101c957806306fdde03146101ec578063081812fc14610201578063095ea7b31461024257806323b872dd14610257575b600080fd5b6101b660075481565b6040519081526020015b60405180910390f35b6101dc6101d736600461137d565b61041d565b60405190151581526020016101c0565b6101f461046f565b6040516101c091906113be565b61022a61020f3660046113f1565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101c0565b610255610250366004611421565b6104fd565b005b61025561026536600461144b565b6105e4565b6101b67f000000000000000000000000000000000000000000000000000000000000000081565b6102556107ab565b6102556102a736600461144b565b61085f565b6101dc6102ba366004611487565b60096020526000908152604090205460ff1681565b6101b67f000000000000000000000000000000000000000000000000000000000000000081565b6102556103043660046114e9565b610934565b61022a7f000000000000000000000000000000000000000000000000000000000000000081565b61022a61033e3660046113f1565b61094c565b6101f46109a3565b6101b6610359366004611487565b6109b0565b610255610a13565b6101b661037436600461157e565b610a27565b610255610c0a565b6006546001600160a01b031661022a565b6101f4610ccd565b6102556103a8366004611637565b610cda565b6102556103bb366004611673565b610d46565b6101f46103ce3660046113f1565b610e0b565b6101b66109c481565b6101dc6103ea36600461170e565b600560209081526000928352604080842090915290825290205460ff1681565b610255610418366004611487565b610e73565b60006301ffc9a760e01b6001600160e01b03198316148061044e57506380ac58cd60e01b6001600160e01b03198316145b806104695750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000805461047c90611741565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611741565b80156104f55780601f106104ca576101008083540402835291602001916104f5565b820191906000526020600020905b8154815290600101906020018083116104d857829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061054657506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6105885760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600260205260409020546001600160a01b0384811691161461063a5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161057f565b6001600160a01b0382166106845760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161057f565b336001600160a01b03841614806106be57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806106df57506000818152600460205260409020546001600160a01b031633145b61071c5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161057f565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b7f0000000000000000000000000000000000000000000000000000000000000000421161081a5760405162461bcd60e51b815260206004820152601a60248201527f4d696e7420706572696f64207374696c6c206e6f74206f766572000000000000604482015260640161057f565b600060076000815461082b90611791565b9182905550905061085c7f000000000000000000000000000000000000000000000000000000000000000082610ee9565b50565b61086a8383836105e4565b6001600160a01b0382163b15806109135750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156108e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090791906117aa565b6001600160e01b031916145b61092f5760405162461bcd60e51b815260040161057f906117c7565b505050565b61093c610fb5565b6008610948828261183f565b5050565b6000818152600260205260409020546001600160a01b03168061099e5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161057f565b919050565b6008805461047c90611741565b60006001600160a01b0382166109f75760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161057f565b506001600160a01b031660009081526003602052604090205490565b610a1b610fb5565b610a25600061100f565b565b60006001600160a01b038316610a6e5760405162461bcd60e51b815260206004820152600c60248201526b41646472657373205a65726f60a01b604482015260640161057f565b6040516bffffffffffffffffffffffff19606085901b166020820152600090603401604051602081830303815290604052805190602001209050610ad3837f000000000000000000000000000000000000000000000000000000000000000083611061565b610b0f5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161057f565b6001600160a01b03841660009081526009602052604090205460ff1615610b6a5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015260640161057f565b6109c46007546001610b7c91906118ff565b1115610bbf5760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b604482015260640161057f565b6001600160a01b0384166000908152600960205260408120805460ff19166001179055600780548290610bf190611791565b91829055509050610c028582610ee9565b949350505050565b7f00000000000000000000000000000000000000000000000000000000000000004211610c795760405162461bcd60e51b815260206004820152601a60248201527f4d696e7420706572696f64207374696c6c206e6f74206f766572000000000000604482015260640161057f565b6109c46007541015610a25576000600760008154610c9690611791565b91829055509050610cc77f000000000000000000000000000000000000000000000000000000000000000082610ee9565b50610c79565b6001805461047c90611741565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d518585856105e4565b6001600160a01b0384163b1580610de85750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d999033908a90899089908990600401611912565b6020604051808303816000875af1158015610db8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddc91906117aa565b6001600160e01b031916145b610e045760405162461bcd60e51b815260040161057f906117c7565b5050505050565b6060610e168261094c565b50600060088054610e2690611741565b905011610e425760405180602001604052806000815250610469565b6008610e4d83611077565b604051602001610e5e929190611966565b60405160208183030381529060405292915050565b610e7b610fb5565b6001600160a01b038116610ee05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161057f565b61085c8161100f565b610ef382826111dd565b6001600160a01b0382163b1580610f995750604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af1158015610f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8d91906117aa565b6001600160e01b031916145b6109485760405162461bcd60e51b815260040161057f906117c7565b6006546001600160a01b03163314610a255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161057f565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008261106e85846112e8565b14949350505050565b606060018272184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b81106110ba576040919091019072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b90045b6d04ee2d6d415b85acef810000000081106110e857602091909101906d04ee2d6d415b85acef810000000090045b662386f26fc1000081106111085760109190910190662386f26fc1000090045b6305f5e100811061112257600891909101906305f5e10090045b6127108110611138576004919091019061271090045b6064811061114c5760029190910190606490045b600a811061115b576001820191505b60008267ffffffffffffffff811115611176576111766114a2565b6040519080825280601f01601f1916602001820160405280156111a0576020820181803683370190505b5090508281016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a87061a8153600a86049550856111aa5750949350505050565b6001600160a01b0382166112275760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161057f565b6000818152600260205260409020546001600160a01b03161561127d5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161057f565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b845181101561132d576113198286838151811061130c5761130c6119ed565b6020026020010151611335565b91508061132581611791565b9150506112ed565b509392505050565b6000818310611351576000828152602084905260409020611360565b60008381526020839052604090205b9392505050565b6001600160e01b03198116811461085c57600080fd5b60006020828403121561138f57600080fd5b813561136081611367565b60005b838110156113b557818101518382015260200161139d565b50506000910152565b60208152600082518060208401526113dd81604085016020870161139a565b601f01601f19169190910160400192915050565b60006020828403121561140357600080fd5b5035919050565b80356001600160a01b038116811461099e57600080fd5b6000806040838503121561143457600080fd5b61143d8361140a565b946020939093013593505050565b60008060006060848603121561146057600080fd5b6114698461140a565b92506114776020850161140a565b9150604084013590509250925092565b60006020828403121561149957600080fd5b6113608261140a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156114e1576114e16114a2565b604052919050565b600060208083850312156114fc57600080fd5b823567ffffffffffffffff8082111561151457600080fd5b818501915085601f83011261152857600080fd5b81358181111561153a5761153a6114a2565b61154c601f8201601f191685016114b8565b9150808252868482850101111561156257600080fd5b8084840185840137600090820190930192909252509392505050565b6000806040838503121561159157600080fd5b61159a8361140a565b915060208084013567ffffffffffffffff808211156115b857600080fd5b818601915086601f8301126115cc57600080fd5b8135818111156115de576115de6114a2565b8060051b91506115ef8483016114b8565b818152918301840191848101908984111561160957600080fd5b938501935b838510156116275784358252938501939085019061160e565b8096505050505050509250929050565b6000806040838503121561164a57600080fd5b6116538361140a565b91506020830135801515811461166857600080fd5b809150509250929050565b60008060008060006080868803121561168b57600080fd5b6116948661140a565b94506116a26020870161140a565b935060408601359250606086013567ffffffffffffffff808211156116c657600080fd5b818801915088601f8301126116da57600080fd5b8135818111156116e957600080fd5b8960208285010111156116fb57600080fd5b9699959850939650602001949392505050565b6000806040838503121561172157600080fd5b61172a8361140a565b91506117386020840161140a565b90509250929050565b600181811c9082168061175557607f821691505b60208210810361177557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000600182016117a3576117a361177b565b5060010190565b6000602082840312156117bc57600080fd5b815161136081611367565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b601f82111561092f57600081815260208120601f850160051c810160208610156118185750805b601f850160051c820191505b8181101561183757828155600101611824565b505050505050565b815167ffffffffffffffff811115611859576118596114a2565b61186d816118678454611741565b846117f1565b602080601f8311600181146118a2576000841561188a5750858301515b600019600386901b1c1916600185901b178555611837565b600085815260208120601f198616915b828110156118d1578886015182559484019460019091019084016118b2565b50858210156118ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156104695761046961177b565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b600080845461197481611741565b6001828116801561198c57600181146119a1576119d0565b60ff19841687528215158302870194506119d0565b8860005260208060002060005b858110156119c75781548a8201529084019082016119ae565b50505082870194505b5050505083516119e481836020880161139a565b01949350505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220b40f9616c9e00f818a109d5ac72e790b761290d335d2b3a591d3eb5856ec6f3f64736f6c63430008100033", + "sourceMap": "367:2162:13:-:0;;;722:369;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;924:5;931:7;2220:4:11;:12;924:5:13;2220:4:11;:12;:::i;:::-;-1:-1:-1;2242:6:11;:16;2251:7;2242:6;:16;:::i;:::-;;2154:111;;936:32:6;955:12;:10;;;:12;;:::i;:::-;936:18;:32::i;:::-;950:24:13::1;::::0;;;984:7:::1;:18;994:8:::0;984:7;:18:::1;:::i;:::-;-1:-1:-1::0;1025:29:13::1;1043:11:::0;1025:15:::1;:29;:::i;:::-;1012:42;::::0;-1:-1:-1;;;;;1064:20:13::1;;::::0;-1:-1:-1;367:2162:13;;-1:-1:-1;;;;367:2162:13;640:96:7;719:10;;640:96::o;2433:187:6:-;2525:6;;;-1:-1:-1;;;;;2541:17:6;;;-1:-1:-1;;;;;;2541:17:6;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;14:127:15:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:840;200:5;253:3;246:4;238:6;234:17;230:27;220:55;;271:1;268;261:12;220:55;294:13;;-1:-1:-1;;;;;356:10:15;;;353:36;;;369:18;;:::i;:::-;444:2;438:9;412:2;498:13;;-1:-1:-1;;494:22:15;;;518:2;490:31;486:40;474:53;;;542:18;;;562:22;;;539:46;536:72;;;588:18;;:::i;:::-;628:10;624:2;617:22;663:2;655:6;648:18;685:4;675:14;;730:3;725:2;720;712:6;708:15;704:24;701:33;698:53;;;747:1;744;737:12;698:53;769:1;760:10;;779:133;793:2;790:1;787:9;779:133;;;881:14;;;877:23;;871:30;850:14;;;846:23;;839:63;804:10;;;;779:133;;;954:1;932:15;;;928:24;;;921:35;;;;936:6;146:840;-1:-1:-1;;;;146:840:15:o;991:1058::-;1136:6;1144;1152;1160;1168;1176;1229:3;1217:9;1208:7;1204:23;1200:33;1197:53;;;1246:1;1243;1236:12;1197:53;1273:16;;-1:-1:-1;;;;;1338:14:15;;;1335:34;;;1365:1;1362;1355:12;1335:34;1388:61;1441:7;1432:6;1421:9;1417:22;1388:61;:::i;:::-;1378:71;;1495:2;1484:9;1480:18;1474:25;1458:41;;1524:2;1514:8;1511:16;1508:36;;;1540:1;1537;1530:12;1508:36;1563:63;1618:7;1607:8;1596:9;1592:24;1563:63;:::i;:::-;1553:73;;1666:2;1655:9;1651:18;1645:25;1635:35;;1716:2;1705:9;1701:18;1695:25;1679:41;;1745:2;1735:8;1732:16;1729:36;;;1761:1;1758;1751:12;1729:36;;1784:63;1839:7;1828:8;1817:9;1813:24;1784:63;:::i;:::-;1887:3;1872:19;;1866:26;1935:3;1920:19;;1914:26;1774:73;;-1:-1:-1;1866:26:15;-1:-1:-1;1914:26:15;-1:-1:-1;;;;;;1969:31:15;;1959:42;;1949:70;;2015:1;2012;2005:12;1949:70;2038:5;2028:15;;;991:1058;;;;;;;;:::o;2054:380::-;2133:1;2129:12;;;;2176;;;2197:61;;2251:4;2243:6;2239:17;2229:27;;2197:61;2304:2;2296:6;2293:14;2273:18;2270:38;2267:161;;2350:10;2345:3;2341:20;2338:1;2331:31;2385:4;2382:1;2375:15;2413:4;2410:1;2403:15;2267:161;;2054:380;;;:::o;2565:545::-;2667:2;2662:3;2659:11;2656:448;;;2703:1;2728:5;2724:2;2717:17;2773:4;2769:2;2759:19;2843:2;2831:10;2827:19;2824:1;2820:27;2814:4;2810:38;2879:4;2867:10;2864:20;2861:47;;;-1:-1:-1;2902:4:15;2861:47;2957:2;2952:3;2948:12;2945:1;2941:20;2935:4;2931:31;2921:41;;3012:82;3030:2;3023:5;3020:13;3012:82;;;3075:17;;;3056:1;3045:13;3012:82;;;3016:3;;;2656:448;2565:545;;;:::o;3286:1352::-;3406:10;;-1:-1:-1;;;;;3428:30:15;;3425:56;;;3461:18;;:::i;:::-;3490:97;3580:6;3540:38;3572:4;3566:11;3540:38;:::i;:::-;3534:4;3490:97;:::i;:::-;3642:4;;3706:2;3695:14;;3723:1;3718:663;;;;4425:1;4442:6;4439:89;;;-1:-1:-1;4494:19:15;;;4488:26;4439:89;-1:-1:-1;;3243:1:15;3239:11;;;3235:24;3231:29;3221:40;3267:1;3263:11;;;3218:57;4541:81;;3688:944;;3718:663;2512:1;2505:14;;;2549:4;2536:18;;-1:-1:-1;;3754:20:15;;;3872:236;3886:7;3883:1;3880:14;3872:236;;;3975:19;;;3969:26;3954:42;;4067:27;;;;4035:1;4023:14;;;;3902:19;;3872:236;;;3876:3;4136:6;4127:7;4124:19;4121:201;;;4197:19;;;4191:26;-1:-1:-1;;4280:1:15;4276:14;;;4292:3;4272:24;4268:37;4264:42;4249:58;4234:74;;4121:201;-1:-1:-1;;;;;4368:1:15;4352:14;;;4348:22;4335:36;;-1:-1:-1;3286:1352:15:o;4643:222::-;4708:9;;;4729:10;;;4726:133;;;4781:10;4776:3;4772:20;4769:1;4762:31;4816:4;4813:1;4806:15;4844:4;4841:1;4834:15;4726:133;4643:222;;;;:::o;:::-;367:2162:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", + "linkReferences": {} + }, + "deployedBytecode": { + "object": "0x608060405234801561001057600080fd5b50600436106101a85760003560e01c80636352211e116100f957806395d89b4111610097578063c87b56dd11610071578063c87b56dd146103c0578063d5abeb01146103d3578063e985e9c5146103dc578063f2fde38b1461040a57600080fd5b806395d89b4114610392578063a22cb4651461039a578063b88d4fde146103ad57600080fd5b8063715018a6116100d3578063715018a61461035e5780637bf3227014610366578063853828b6146103795780638da5cb5b1461038157600080fd5b80636352211e146103305780636c0360eb1461034357806370a082311461034b57600080fd5b80632eb4a7ab116101665780634b38413c116101405780634b38413c146102ac5780634c498203146102cf57806355f804b3146102f657806361d027b31461030957600080fd5b80632eb4a7ab1461026a5780633ccfd60b1461029157806342842e0e1461029957600080fd5b80629a9b7b146101ad57806301ffc9a7146101c957806306fdde03146101ec578063081812fc14610201578063095ea7b31461024257806323b872dd14610257575b600080fd5b6101b660075481565b6040519081526020015b60405180910390f35b6101dc6101d736600461137d565b61041d565b60405190151581526020016101c0565b6101f461046f565b6040516101c091906113be565b61022a61020f3660046113f1565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101c0565b610255610250366004611421565b6104fd565b005b61025561026536600461144b565b6105e4565b6101b67f000000000000000000000000000000000000000000000000000000000000000081565b6102556107ab565b6102556102a736600461144b565b61085f565b6101dc6102ba366004611487565b60096020526000908152604090205460ff1681565b6101b67f000000000000000000000000000000000000000000000000000000000000000081565b6102556103043660046114e9565b610934565b61022a7f000000000000000000000000000000000000000000000000000000000000000081565b61022a61033e3660046113f1565b61094c565b6101f46109a3565b6101b6610359366004611487565b6109b0565b610255610a13565b6101b661037436600461157e565b610a27565b610255610c0a565b6006546001600160a01b031661022a565b6101f4610ccd565b6102556103a8366004611637565b610cda565b6102556103bb366004611673565b610d46565b6101f46103ce3660046113f1565b610e0b565b6101b66109c481565b6101dc6103ea36600461170e565b600560209081526000928352604080842090915290825290205460ff1681565b610255610418366004611487565b610e73565b60006301ffc9a760e01b6001600160e01b03198316148061044e57506380ac58cd60e01b6001600160e01b03198316145b806104695750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000805461047c90611741565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611741565b80156104f55780601f106104ca576101008083540402835291602001916104f5565b820191906000526020600020905b8154815290600101906020018083116104d857829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061054657506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6105885760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600260205260409020546001600160a01b0384811691161461063a5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161057f565b6001600160a01b0382166106845760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161057f565b336001600160a01b03841614806106be57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806106df57506000818152600460205260409020546001600160a01b031633145b61071c5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161057f565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b7f0000000000000000000000000000000000000000000000000000000000000000421161081a5760405162461bcd60e51b815260206004820152601a60248201527f4d696e7420706572696f64207374696c6c206e6f74206f766572000000000000604482015260640161057f565b600060076000815461082b90611791565b9182905550905061085c7f000000000000000000000000000000000000000000000000000000000000000082610ee9565b50565b61086a8383836105e4565b6001600160a01b0382163b15806109135750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156108e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090791906117aa565b6001600160e01b031916145b61092f5760405162461bcd60e51b815260040161057f906117c7565b505050565b61093c610fb5565b6008610948828261183f565b5050565b6000818152600260205260409020546001600160a01b03168061099e5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161057f565b919050565b6008805461047c90611741565b60006001600160a01b0382166109f75760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161057f565b506001600160a01b031660009081526003602052604090205490565b610a1b610fb5565b610a25600061100f565b565b60006001600160a01b038316610a6e5760405162461bcd60e51b815260206004820152600c60248201526b41646472657373205a65726f60a01b604482015260640161057f565b6040516bffffffffffffffffffffffff19606085901b166020820152600090603401604051602081830303815290604052805190602001209050610ad3837f000000000000000000000000000000000000000000000000000000000000000083611061565b610b0f5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161057f565b6001600160a01b03841660009081526009602052604090205460ff1615610b6a5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015260640161057f565b6109c46007546001610b7c91906118ff565b1115610bbf5760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b604482015260640161057f565b6001600160a01b0384166000908152600960205260408120805460ff19166001179055600780548290610bf190611791565b91829055509050610c028582610ee9565b949350505050565b7f00000000000000000000000000000000000000000000000000000000000000004211610c795760405162461bcd60e51b815260206004820152601a60248201527f4d696e7420706572696f64207374696c6c206e6f74206f766572000000000000604482015260640161057f565b6109c46007541015610a25576000600760008154610c9690611791565b91829055509050610cc77f000000000000000000000000000000000000000000000000000000000000000082610ee9565b50610c79565b6001805461047c90611741565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d518585856105e4565b6001600160a01b0384163b1580610de85750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d999033908a90899089908990600401611912565b6020604051808303816000875af1158015610db8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddc91906117aa565b6001600160e01b031916145b610e045760405162461bcd60e51b815260040161057f906117c7565b5050505050565b6060610e168261094c565b50600060088054610e2690611741565b905011610e425760405180602001604052806000815250610469565b6008610e4d83611077565b604051602001610e5e929190611966565b60405160208183030381529060405292915050565b610e7b610fb5565b6001600160a01b038116610ee05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161057f565b61085c8161100f565b610ef382826111dd565b6001600160a01b0382163b1580610f995750604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af1158015610f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8d91906117aa565b6001600160e01b031916145b6109485760405162461bcd60e51b815260040161057f906117c7565b6006546001600160a01b03163314610a255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161057f565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008261106e85846112e8565b14949350505050565b606060018272184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b81106110ba576040919091019072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b90045b6d04ee2d6d415b85acef810000000081106110e857602091909101906d04ee2d6d415b85acef810000000090045b662386f26fc1000081106111085760109190910190662386f26fc1000090045b6305f5e100811061112257600891909101906305f5e10090045b6127108110611138576004919091019061271090045b6064811061114c5760029190910190606490045b600a811061115b576001820191505b60008267ffffffffffffffff811115611176576111766114a2565b6040519080825280601f01601f1916602001820160405280156111a0576020820181803683370190505b5090508281016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a87061a8153600a86049550856111aa5750949350505050565b6001600160a01b0382166112275760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161057f565b6000818152600260205260409020546001600160a01b03161561127d5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161057f565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b845181101561132d576113198286838151811061130c5761130c6119ed565b6020026020010151611335565b91508061132581611791565b9150506112ed565b509392505050565b6000818310611351576000828152602084905260409020611360565b60008381526020839052604090205b9392505050565b6001600160e01b03198116811461085c57600080fd5b60006020828403121561138f57600080fd5b813561136081611367565b60005b838110156113b557818101518382015260200161139d565b50506000910152565b60208152600082518060208401526113dd81604085016020870161139a565b601f01601f19169190910160400192915050565b60006020828403121561140357600080fd5b5035919050565b80356001600160a01b038116811461099e57600080fd5b6000806040838503121561143457600080fd5b61143d8361140a565b946020939093013593505050565b60008060006060848603121561146057600080fd5b6114698461140a565b92506114776020850161140a565b9150604084013590509250925092565b60006020828403121561149957600080fd5b6113608261140a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156114e1576114e16114a2565b604052919050565b600060208083850312156114fc57600080fd5b823567ffffffffffffffff8082111561151457600080fd5b818501915085601f83011261152857600080fd5b81358181111561153a5761153a6114a2565b61154c601f8201601f191685016114b8565b9150808252868482850101111561156257600080fd5b8084840185840137600090820190930192909252509392505050565b6000806040838503121561159157600080fd5b61159a8361140a565b915060208084013567ffffffffffffffff808211156115b857600080fd5b818601915086601f8301126115cc57600080fd5b8135818111156115de576115de6114a2565b8060051b91506115ef8483016114b8565b818152918301840191848101908984111561160957600080fd5b938501935b838510156116275784358252938501939085019061160e565b8096505050505050509250929050565b6000806040838503121561164a57600080fd5b6116538361140a565b91506020830135801515811461166857600080fd5b809150509250929050565b60008060008060006080868803121561168b57600080fd5b6116948661140a565b94506116a26020870161140a565b935060408601359250606086013567ffffffffffffffff808211156116c657600080fd5b818801915088601f8301126116da57600080fd5b8135818111156116e957600080fd5b8960208285010111156116fb57600080fd5b9699959850939650602001949392505050565b6000806040838503121561172157600080fd5b61172a8361140a565b91506117386020840161140a565b90509250929050565b600181811c9082168061175557607f821691505b60208210810361177557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000600182016117a3576117a361177b565b5060010190565b6000602082840312156117bc57600080fd5b815161136081611367565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b601f82111561092f57600081815260208120601f850160051c810160208610156118185750805b601f850160051c820191505b8181101561183757828155600101611824565b505050505050565b815167ffffffffffffffff811115611859576118596114a2565b61186d816118678454611741565b846117f1565b602080601f8311600181146118a2576000841561188a5750858301515b600019600386901b1c1916600185901b178555611837565b600085815260208120601f198616915b828110156118d1578886015182559484019460019091019084016118b2565b50858210156118ef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156104695761046961177b565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b600080845461197481611741565b6001828116801561198c57600181146119a1576119d0565b60ff19841687528215158302870194506119d0565b8860005260208060002060005b858110156119c75781548a8201529084019082016119ae565b50505082870194505b5050505083516119e481836020880161139a565b01949350505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220b40f9616c9e00f818a109d5ac72e790b761290d335d2b3a591d3eb5856ec6f3f64736f6c63430008100033", + "sourceMap": "367:2162:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;442:29;;;;;;;;;160:25:15;;;148:2;133:18;442:29:13;;;;;;;;4714:335:11;;;;;;:::i;:::-;;:::i;:::-;;;747:14:15;;740:22;722:41;;710:2;695:18;4714:335:11;582:187:15;899:18:11;;;:::i;:::-;;;;;;;:::i;1844:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1844:46:11;;;;;;-1:-1:-1;;;;;1779:32:15;;;1761:51;;1749:2;1734:18;1844:46:11;1615:203:15;2453:282:11;;;;;;:::i;:::-;;:::i;:::-;;2950:741;;;;;;:::i;:::-;;:::i;550:35:13:-;;;;;2061:197;;;:::i;3697:396:11:-;;;;;;:::i;:::-;;:::i;671:44:13:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;591:35;;;;;1729:96;;;;;;:::i;:::-;;:::i;632:33::-;;;;;1327:149:11;;;;;;:::i;:::-;;:::i;523:21:13:-;;;:::i;1482:168:11:-;;;;;;:::i;:::-;;:::i;1831:101:6:-;;;:::i;1097:626:13:-;;;;;;:::i;:::-;;:::i;2264:263::-;;;:::i;1201:85:6:-;1273:6;;-1:-1:-1;;;;;1273:6:6;1201:85;;924:20:11;;;:::i;2741:203::-;;;;;;:::i;:::-;;:::i;4099:427::-;;;;;;:::i;:::-;;:::i;1831:224:13:-;;;;;;:::i;:::-;;:::i;477:40::-;;513:4;477:40;;1897:68:11;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2081:198:6;;;;;;:::i;:::-;;:::i;4714:335:11:-;4790:4;-1:-1:-1;;;;;;;;;4825:25:11;;;;:100;;-1:-1:-1;;;;;;;;;;4900:25:11;;;4825:100;:175;;;-1:-1:-1;;;;;;;;;;4975:25:11;;;4825:175;4806:194;4714:335;-1:-1:-1;;4714:335:11:o;899:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2453:282::-;2524:13;2540:12;;;:8;:12;;;;;;-1:-1:-1;;;;;2540:12:11;2571:10;:19;;;:58;;-1:-1:-1;;;;;;2594:23:11;;;;;;:16;:23;;;;;;;;2618:10;2594:35;;;;;;;;;;2571:58;2563:85;;;;-1:-1:-1;;;2563:85:11;;7189:2:15;2563:85:11;;;7171:21:15;7228:2;7208:18;;;7201:30;-1:-1:-1;;;7247:18:15;;;7240:44;7301:18;;2563:85:11;;;;;;;;;2659:15;;;;:11;:15;;;;;;:25;;-1:-1:-1;;;;;;2659:25:11;-1:-1:-1;;;;;2659:25:11;;;;;;;;;2700:28;;2659:15;;2700:28;;;;;;;2514:221;2453:282;;:::o;2950:741::-;3081:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;3073:20:11;;;3081:12;;3073:20;3065:43;;;;-1:-1:-1;;;3065:43:11;;7532:2:15;3065:43:11;;;7514:21:15;7571:2;7551:18;;;7544:30;-1:-1:-1;;;7590:18:15;;;7583:40;7640:18;;3065:43:11;7330:334:15;3065:43:11;-1:-1:-1;;;;;3127:16:11;;3119:46;;;;-1:-1:-1;;;3119:46:11;;7871:2:15;3119:46:11;;;7853:21:15;7910:2;7890:18;;;7883:30;-1:-1:-1;;;7929:18:15;;;7922:47;7986:18;;3119:46:11;7669:341:15;3119:46:11;3197:10;-1:-1:-1;;;;;3197:18:11;;;;:56;;-1:-1:-1;;;;;;3219:22:11;;;;;;:16;:22;;;;;;;;3242:10;3219:34;;;;;;;;;;3197:56;:89;;;-1:-1:-1;3271:15:11;;;;:11;:15;;;;;;-1:-1:-1;;;;;3271:15:11;3257:10;:29;3197:89;3176:150;;;;-1:-1:-1;;;3176:150:11;;7189:2:15;3176:150:11;;;7171:21:15;7228:2;7208:18;;;7201:30;-1:-1:-1;;;7247:18:15;;;7240:44;7301:18;;3176:150:11;6987:338:15;3176:150:11;-1:-1:-1;;;;;3526:16:11;;;;;;;:10;:16;;;;;;;;:18;;-1:-1:-1;;3526:18:11;;;3559:14;;;;;;;;;:16;;3526:18;3559:16;;;3596:12;;;:8;:12;;;;;:17;;-1:-1:-1;;;;;;3596:17:11;;;;;;;;3631:11;:15;;;;;;3624:22;;;;;;;;3662;;3605:2;;3559:14;3526:16;3662:22;;;2950:741;;;:::o;2061:197:13:-;2124:10;2106:15;:28;2098:67;;;;-1:-1:-1;;;2098:67:13;;8217:2:15;2098:67:13;;;8199:21:15;8256:2;8236:18;;;8229:30;8295:28;8275:18;;;8268:56;8341:18;;2098:67:13;8015:350:15;2098:67:13;2175:17;2197:14;;2195:16;;;;;:::i;:::-;;;;;-1:-1:-1;2195:16:13;-1:-1:-1;2221:30:13;2231:8;2195:16;2221:9;:30::i;:::-;2088:170;2061:197::o;3697:396:11:-;3816:26;3829:4;3835:2;3839;3816:12;:26::i;:::-;-1:-1:-1;;;;;3874:14:11;;;:19;;:170;;-1:-1:-1;3913:66:11;;-1:-1:-1;;;3913:66:11;;;3954:10;3913:66;;;8947:34:15;-1:-1:-1;;;;;9017:15:15;;;8997:18;;;8990:43;9049:18;;;9042:34;;;9112:3;9092:18;;;9085:31;-1:-1:-1;9132:19:15;;;9125:30;3999:45:11;;3913:40;;;;3999:45;;9172:19:15;;3913:66:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;3913:131:11;;3874:170;3853:233;;;;-1:-1:-1;;;3853:233:11;;;;;;;:::i;:::-;3697:396;;;:::o;1729:96:13:-;1094:13:6;:11;:13::i;:::-;1800:7:13::1;:18;1810:8:::0;1800:7;:18:::1;:::i;:::-;;1729:96:::0;:::o;1327:149:11:-;1385:13;1427:12;;;:8;:12;;;;;;-1:-1:-1;;;;;1427:12:11;;1410:59;;;;-1:-1:-1;;;1410:59:11;;12207:2:15;1410:59:11;;;12189:21:15;12246:2;12226:18;;;12219:30;-1:-1:-1;;;12265:18:15;;;12258:40;12315:18;;1410:59:11;12005:334:15;1410:59:11;1327:149;;;:::o;523:21:13:-;;;;;;;:::i;1482:168:11:-;1545:7;-1:-1:-1;;;;;1572:19:11;;1564:44;;;;-1:-1:-1;;;1564:44:11;;12546:2:15;1564:44:11;;;12528:21:15;12585:2;12565:18;;;12558:30;-1:-1:-1;;;12604:18:15;;;12597:42;12656:18;;1564:44:11;12344:336:15;1564:44:11;-1:-1:-1;;;;;;1626:17:11;;;;;:10;:17;;;;;;;1482:168::o;1831:101:6:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1097:626:13:-;1171:7;-1:-1:-1;;;;;1234:24:13;;1226:49;;;;-1:-1:-1;;;1226:49:13;;12887:2:15;1226:49:13;;;12869:21:15;12926:2;12906:18;;;12899:30;-1:-1:-1;;;12945:18:15;;;12938:42;12997:18;;1226:49:13;12685:336:15;1226:49:13;1310:28;;-1:-1:-1;;13175:2:15;13171:15;;;13167:53;1310:28:13;;;13155:66:15;1285:12:13;;13237::15;;1310:28:13;;;;;;;;;;;;1300:39;;;;;;1285:54;;1357:43;1376:5;1383:10;1395:4;1357:18;:43::i;:::-;1349:69;;;;-1:-1:-1;;;1349:69:13;;13462:2:15;1349:69:13;;;13444:21:15;13501:2;13481:18;;;13474:30;-1:-1:-1;;;13520:18:15;;;13513:43;13573:18;;1349:69:13;13260:337:15;1349:69:13;-1:-1:-1;;;;;1436:24:13;;;;;;:12;:24;;;;;;;;:33;1428:61;;;;-1:-1:-1;;;1428:61:13;;13804:2:15;1428:61:13;;;13786:21:15;13843:2;13823:18;;;13816:30;-1:-1:-1;;;13862:18:15;;;13855:45;13917:18;;1428:61:13;13602:339:15;1428:61:13;513:4;1507:14;;1524:1;1507:18;;;;:::i;:::-;:31;;1499:62;;;;-1:-1:-1;;;1499:62:13;;14278:2:15;1499:62:13;;;14260:21:15;14317:2;14297:18;;;14290:30;-1:-1:-1;;;14336:18:15;;;14329:48;14394:18;;1499:62:13;14076:342:15;1499:62:13;-1:-1:-1;;;;;1571:24:13;;;;;;:12;:24;;;;;:31;;-1:-1:-1;;1571:31:13;1598:4;1571:31;;;1634:14;1632:16;;1571:24;;1632:16;;;:::i;:::-;;;;;-1:-1:-1;1632:16:13;-1:-1:-1;1658:32:13;1668:10;1632:16;1658:9;:32::i;:::-;1707:9;1097:626;-1:-1:-1;;;;1097:626:13:o;2264:263::-;2330:10;2312:15;:28;2304:67;;;;-1:-1:-1;;;2304:67:13;;8217:2:15;2304:67:13;;;8199:21:15;8256:2;8236:18;;;8229:30;8295:28;8275:18;;;8268:56;8341:18;;2304:67:13;8015:350:15;2304:67:13;513:4;2388:14;;:26;2381:140;;;2430:17;2452:14;;2450:16;;;;;:::i;:::-;;;;;-1:-1:-1;2450:16:13;-1:-1:-1;2480:30:13;2490:8;2450:16;2480:9;:30::i;:::-;2416:105;2381:140;;924:20:11;;;;;;;:::i;2741:203::-;2843:10;2826:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;2826:38:11;;;;;;;;;;;;:49;;-1:-1:-1;;2826:49:11;;;;;;;;;;2891:46;;722:41:15;;;2826:38:11;;2843:10;2891:46;;695:18:15;2891:46:11;;;;;;;2741:203;;:::o;4099:427::-;4247:26;4260:4;4266:2;4270;4247:12;:26::i;:::-;-1:-1:-1;;;;;4305:14:11;;;:19;;:172;;-1:-1:-1;4344:68:11;;-1:-1:-1;;;4344:68:11;;;4432:45;-1:-1:-1;;;;;4344:40:11;;;4432:45;;4344:68;;4385:10;;4397:4;;4403:2;;4407:4;;;;4344:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;4344:133:11;;4305:172;4284:235;;;;-1:-1:-1;;;4284:235:11;;;;;;;:::i;:::-;4099:427;;;;;:::o;1831:224:13:-;1904:13;1929:16;1937:7;1929;:16::i;:::-;;1986:1;1968:7;1962:21;;;;;:::i;:::-;;;:25;:86;;;;;;;;;;;;;;;;;2014:7;2023:18;:7;:16;:18::i;:::-;1997:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1955:93;1831:224;-1:-1:-1;;1831:224:13:o;2081:198:6:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:6;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:6;;16317:2:15;2161:73:6::1;::::0;::::1;16299:21:15::0;16356:2;16336:18;;;16329:30;16395:34;16375:18;;;16368:62;-1:-1:-1;;;16446:18:15;;;16439:36;16492:19;;2161:73:6::1;16115:402:15::0;2161:73:6::1;2244:28;2263:8;2244:18;:28::i;6185:340:11:-:0;6255:13;6261:2;6265;6255:5;:13::i;:::-;-1:-1:-1;;;;;6300:14:11;;;:19;;:176;;-1:-1:-1;6339:72:11;;-1:-1:-1;;;6339:72:11;;;6380:10;6339:72;;;8947:34:15;6400:1:11;8997:18:15;;;8990:43;;;9049:18;;;9042:34;;;9112:3;9092:18;;;9085:31;9132:19;;;9125:30;6431:45:11;-1:-1:-1;;;;;6339:40:11;;;6431:45;;9172:19:15;;6339:72:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;6339:137:11;;6300:176;6279:239;;;;-1:-1:-1;;;6279:239:11;;;;;;;:::i;1359:130:6:-;1273:6;;-1:-1:-1;;;;;1273:6:6;719:10:7;1422:23:6;1414:68;;;;-1:-1:-1;;;1414:68:6;;16724:2:15;1414:68:6;;;16706:21:15;;;16743:18;;;16736:30;16802:34;16782:18;;;16775:62;16854:18;;1414:68:6;16522:356:15;2433:187:6;2525:6;;;-1:-1:-1;;;;;2541:17:6;;;-1:-1:-1;;;;;;2541:17:6;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;1153:184:9:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;;1153:184;-1:-1:-1;;;;1153:184:9:o;388:1614:8:-;444:13;510:1;604:5;-1:-1:-1;;;627:19:8;;623:107;;713:2;703:12;;;;;-1:-1:-1;;;666:19:8;;623:107;760:6;747:9;:19;743:107;;833:2;823:12;;;;;799:6;786:19;;743:107;880:6;867:9;:19;863:107;;953:2;943:12;;;;;919:6;906:19;;863:107;1000:5;987:9;:18;983:104;;1071:1;1061:11;;;;;1038:5;1025:18;;983:104;1117:5;1104:9;:18;1100:104;;1188:1;1178:11;;;;;1155:5;1142:18;;1100:104;1234:5;1221:9;:18;1217:104;;1305:1;1295:11;;;;;1272:5;1259:18;;1217:104;1351:5;1338:9;:18;1334:68;;1386:1;1376:11;;;;1334:68;1463:20;1497:6;1486:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1486:18:8;-1:-1:-1;1463:41:8;-1:-1:-1;1624:28:8;;;1640:2;1624:28;1679:280;-1:-1:-1;;1710:5:8;-1:-1:-1;;;1844:2:8;1833:14;;1828:30;1710:5;1815:44;1903:2;1894:11;;;-1:-1:-1;1923:21:8;1679:280;1923:21;-1:-1:-1;1979:6:8;388:1614;-1:-1:-1;;;;388:1614:8:o;5243:371:11:-;-1:-1:-1;;;;;5317:16:11;;5309:46;;;;-1:-1:-1;;;5309:46:11;;7871:2:15;5309:46:11;;;7853:21:15;7910:2;7890:18;;;7883:30;-1:-1:-1;;;7929:18:15;;;7922:47;7986:18;;5309:46:11;7669:341:15;5309:46:11;5398:1;5374:12;;;:8;:12;;;;;;-1:-1:-1;;;;;5374:12:11;:26;5366:53;;;;-1:-1:-1;;;5366:53:11;;17217:2:15;5366:53:11;;;17199:21:15;17256:2;17236:18;;;17229:30;-1:-1:-1;;;17275:18:15;;;17268:44;17329:18;;5366:53:11;17015:338:15;5366:53:11;-1:-1:-1;;;;;5509:14:11;;;;;;:10;:14;;;;;;;;:16;;;;;;5546:12;;;:8;:12;;;;;;:17;;-1:-1:-1;;;;;;5546:17:11;;;;;5579:28;5555:2;;5509:14;;5579:28;;5509:14;;5579:28;5243:371;;:::o;1991:290:9:-;2074:7;2116:4;2074:7;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;:::i;:::-;;;;;;;2202:9;:33::i;:::-;2187:48;-1:-1:-1;2168:3:9;;;;:::i;:::-;;;;2130:116;;;-1:-1:-1;2262:12:9;1991:290;-1:-1:-1;;;1991:290:9:o;8054:147::-;8117:7;8147:1;8143;:5;:51;;8275:13;8366:15;;;8401:4;8394:15;;;8447:4;8431:21;;8143:51;;;8275:13;8366:15;;;8401:4;8394:15;;;8447:4;8431:21;;8151:20;8136:58;8054:147;-1:-1:-1;;;8054:147:9:o;196:131:15:-;-1:-1:-1;;;;;;270:32:15;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:250::-;859:1;869:113;883:6;880:1;877:13;869:113;;;959:11;;;953:18;940:11;;;933:39;905:2;898:10;869:113;;;-1:-1:-1;;1016:1:15;998:16;;991:27;774:250::o;1029:396::-;1178:2;1167:9;1160:21;1141:4;1210:6;1204:13;1253:6;1248:2;1237:9;1233:18;1226:34;1269:79;1341:6;1336:2;1325:9;1321:18;1316:2;1308:6;1304:15;1269:79;:::i;:::-;1409:2;1388:15;-1:-1:-1;;1384:29:15;1369:45;;;;1416:2;1365:54;;1029:396;-1:-1:-1;;1029:396:15:o;1430:180::-;1489:6;1542:2;1530:9;1521:7;1517:23;1513:32;1510:52;;;1558:1;1555;1548:12;1510:52;-1:-1:-1;1581:23:15;;1430:180;-1:-1:-1;1430:180:15:o;1823:173::-;1891:20;;-1:-1:-1;;;;;1940:31:15;;1930:42;;1920:70;;1986:1;1983;1976:12;2001:254;2069:6;2077;2130:2;2118:9;2109:7;2105:23;2101:32;2098:52;;;2146:1;2143;2136:12;2098:52;2169:29;2188:9;2169:29;:::i;:::-;2159:39;2245:2;2230:18;;;;2217:32;;-1:-1:-1;;;2001:254:15:o;2260:328::-;2337:6;2345;2353;2406:2;2394:9;2385:7;2381:23;2377:32;2374:52;;;2422:1;2419;2412:12;2374:52;2445:29;2464:9;2445:29;:::i;:::-;2435:39;;2493:38;2527:2;2516:9;2512:18;2493:38;:::i;:::-;2483:48;;2578:2;2567:9;2563:18;2550:32;2540:42;;2260:328;;;;;:::o;2775:186::-;2834:6;2887:2;2875:9;2866:7;2862:23;2858:32;2855:52;;;2903:1;2900;2893:12;2855:52;2926:29;2945:9;2926:29;:::i;2966:127::-;3027:10;3022:3;3018:20;3015:1;3008:31;3058:4;3055:1;3048:15;3082:4;3079:1;3072:15;3098:275;3169:2;3163:9;3234:2;3215:13;;-1:-1:-1;;3211:27:15;3199:40;;3269:18;3254:34;;3290:22;;;3251:62;3248:88;;;3316:18;;:::i;:::-;3352:2;3345:22;3098:275;;-1:-1:-1;3098:275:15:o;3378:764::-;3447:6;3478:2;3521;3509:9;3500:7;3496:23;3492:32;3489:52;;;3537:1;3534;3527:12;3489:52;3577:9;3564:23;3606:18;3647:2;3639:6;3636:14;3633:34;;;3663:1;3660;3653:12;3633:34;3701:6;3690:9;3686:22;3676:32;;3746:7;3739:4;3735:2;3731:13;3727:27;3717:55;;3768:1;3765;3758:12;3717:55;3804:2;3791:16;3826:2;3822;3819:10;3816:36;;;3832:18;;:::i;:::-;3874:53;3917:2;3898:13;;-1:-1:-1;;3894:27:15;3890:36;;3874:53;:::i;:::-;3861:66;;3950:2;3943:5;3936:17;3990:7;3985:2;3980;3976;3972:11;3968:20;3965:33;3962:53;;;4011:1;4008;4001:12;3962:53;4066:2;4061;4057;4053:11;4048:2;4041:5;4037:14;4024:45;4110:1;4089:14;;;4085:23;;;4078:34;;;;-1:-1:-1;4093:5:15;3378:764;-1:-1:-1;;;3378:764:15:o;4147:1020::-;4240:6;4248;4301:2;4289:9;4280:7;4276:23;4272:32;4269:52;;;4317:1;4314;4307:12;4269:52;4340:29;4359:9;4340:29;:::i;:::-;4330:39;;4388:2;4441;4430:9;4426:18;4413:32;4464:18;4505:2;4497:6;4494:14;4491:34;;;4521:1;4518;4511:12;4491:34;4559:6;4548:9;4544:22;4534:32;;4604:7;4597:4;4593:2;4589:13;4585:27;4575:55;;4626:1;4623;4616:12;4575:55;4662:2;4649:16;4684:2;4680;4677:10;4674:36;;;4690:18;;:::i;:::-;4736:2;4733:1;4729:10;4719:20;;4759:28;4783:2;4779;4775:11;4759:28;:::i;:::-;4821:15;;;4891:11;;;4887:20;;;4852:12;;;;4919:19;;;4916:39;;;4951:1;4948;4941:12;4916:39;4975:11;;;;4995:142;5011:6;5006:3;5003:15;4995:142;;;5077:17;;5065:30;;5028:12;;;;5115;;;;4995:142;;;5156:5;5146:15;;;;;;;;4147:1020;;;;;:::o;5172:347::-;5237:6;5245;5298:2;5286:9;5277:7;5273:23;5269:32;5266:52;;;5314:1;5311;5304:12;5266:52;5337:29;5356:9;5337:29;:::i;:::-;5327:39;;5416:2;5405:9;5401:18;5388:32;5463:5;5456:13;5449:21;5442:5;5439:32;5429:60;;5485:1;5482;5475:12;5429:60;5508:5;5498:15;;;5172:347;;;;;:::o;5524:808::-;5621:6;5629;5637;5645;5653;5706:3;5694:9;5685:7;5681:23;5677:33;5674:53;;;5723:1;5720;5713:12;5674:53;5746:29;5765:9;5746:29;:::i;:::-;5736:39;;5794:38;5828:2;5817:9;5813:18;5794:38;:::i;:::-;5784:48;;5879:2;5868:9;5864:18;5851:32;5841:42;;5934:2;5923:9;5919:18;5906:32;5957:18;5998:2;5990:6;5987:14;5984:34;;;6014:1;6011;6004:12;5984:34;6052:6;6041:9;6037:22;6027:32;;6097:7;6090:4;6086:2;6082:13;6078:27;6068:55;;6119:1;6116;6109:12;6068:55;6159:2;6146:16;6185:2;6177:6;6174:14;6171:34;;;6201:1;6198;6191:12;6171:34;6246:7;6241:2;6232:6;6228:2;6224:15;6220:24;6217:37;6214:57;;;6267:1;6264;6257:12;6214:57;5524:808;;;;-1:-1:-1;5524:808:15;;-1:-1:-1;6298:2:15;6290:11;;6320:6;5524:808;-1:-1:-1;;;5524:808:15:o;6337:260::-;6405:6;6413;6466:2;6454:9;6445:7;6441:23;6437:32;6434:52;;;6482:1;6479;6472:12;6434:52;6505:29;6524:9;6505:29;:::i;:::-;6495:39;;6553:38;6587:2;6576:9;6572:18;6553:38;:::i;:::-;6543:48;;6337:260;;;;;:::o;6602:380::-;6681:1;6677:12;;;;6724;;;6745:61;;6799:4;6791:6;6787:17;6777:27;;6745:61;6852:2;6844:6;6841:14;6821:18;6818:38;6815:161;;6898:10;6893:3;6889:20;6886:1;6879:31;6933:4;6930:1;6923:15;6961:4;6958:1;6951:15;6815:161;;6602:380;;;:::o;8370:127::-;8431:10;8426:3;8422:20;8419:1;8412:31;8462:4;8459:1;8452:15;8486:4;8483:1;8476:15;8502:135;8541:3;8562:17;;;8559:43;;8582:18;;:::i;:::-;-1:-1:-1;8629:1:15;8618:13;;8502:135::o;9202:249::-;9271:6;9324:2;9312:9;9303:7;9299:23;9295:32;9292:52;;;9340:1;9337;9330:12;9292:52;9372:9;9366:16;9391:30;9415:5;9391:30;:::i;9456:340::-;9658:2;9640:21;;;9697:2;9677:18;;;9670:30;-1:-1:-1;;;9731:2:15;9716:18;;9709:46;9787:2;9772:18;;9456:340::o;9927:545::-;10029:2;10024:3;10021:11;10018:448;;;10065:1;10090:5;10086:2;10079:17;10135:4;10131:2;10121:19;10205:2;10193:10;10189:19;10186:1;10182:27;10176:4;10172:38;10241:4;10229:10;10226:20;10223:47;;;-1:-1:-1;10264:4:15;10223:47;10319:2;10314:3;10310:12;10307:1;10303:20;10297:4;10293:31;10283:41;;10374:82;10392:2;10385:5;10382:13;10374:82;;;10437:17;;;10418:1;10407:13;10374:82;;;10378:3;;;9927:545;;;:::o;10648:1352::-;10774:3;10768:10;10801:18;10793:6;10790:30;10787:56;;;10823:18;;:::i;:::-;10852:97;10942:6;10902:38;10934:4;10928:11;10902:38;:::i;:::-;10896:4;10852:97;:::i;:::-;11004:4;;11068:2;11057:14;;11085:1;11080:663;;;;11787:1;11804:6;11801:89;;;-1:-1:-1;11856:19:15;;;11850:26;11801:89;-1:-1:-1;;10605:1:15;10601:11;;;10597:24;10593:29;10583:40;10629:1;10625:11;;;10580:57;11903:81;;11050:944;;11080:663;9874:1;9867:14;;;9911:4;9898:18;;-1:-1:-1;;11116:20:15;;;11234:236;11248:7;11245:1;11242:14;11234:236;;;11337:19;;;11331:26;11316:42;;11429:27;;;;11397:1;11385:14;;;;11264:19;;11234:236;;;11238:3;11498:6;11489:7;11486:19;11483:201;;;11559:19;;;11553:26;-1:-1:-1;;11642:1:15;11638:14;;;11654:3;11634:24;11630:37;11626:42;11611:58;11596:74;;11483:201;-1:-1:-1;;;;;11730:1:15;11714:14;;;11710:22;11697:36;;-1:-1:-1;10648:1352:15:o;13946:125::-;14011:9;;;14032:10;;;14029:36;;;14045:18;;:::i;14423:662::-;-1:-1:-1;;;;;14702:15:15;;;14684:34;;14754:15;;14749:2;14734:18;;14727:43;14801:2;14786:18;;14779:34;;;14849:3;14844:2;14829:18;;14822:31;;;14869:19;;14862:35;;;14627:4;14890:6;14940;14664:3;14919:19;;14906:49;15005:1;14999:3;14990:6;14979:9;14975:22;14971:32;14964:43;15075:3;15068:2;15064:7;15059:2;15051:6;15047:15;15043:29;15032:9;15028:45;15024:55;15016:63;;14423:662;;;;;;;;:::o;15090:1020::-;15266:3;15295:1;15328:6;15322:13;15358:36;15384:9;15358:36;:::i;:::-;15413:1;15430:18;;;15457:133;;;;15604:1;15599:356;;;;15423:532;;15457:133;-1:-1:-1;;15490:24:15;;15478:37;;15563:14;;15556:22;15544:35;;15535:45;;;-1:-1:-1;15457:133:15;;15599:356;15630:6;15627:1;15620:17;15660:4;15705:2;15702:1;15692:16;15730:1;15744:165;15758:6;15755:1;15752:13;15744:165;;;15836:14;;15823:11;;;15816:35;15879:16;;;;15773:10;;15744:165;;;15748:3;;;15938:6;15933:3;15929:16;15922:23;;15423:532;;;;;15986:6;15980:13;16002:68;16061:8;16056:3;16049:4;16041:6;16037:17;16002:68;:::i;:::-;16086:18;;15090:1020;-1:-1:-1;;;;15090:1020:15:o;17358:127::-;17419:10;17414:3;17410:20;17407:1;17400:31;17450:4;17447:1;17440:15;17474:4;17471:1;17464:15", + "linkReferences": {}, + "immutableReferences": { + "24749": [ + { + "start": 623, + "length": 32 + }, + { + "start": 2734, + "length": 32 + } + ], + "24751": [ + { + "start": 724, + "length": 32 + }, + { + "start": 1965, + "length": 32 + }, + { + "start": 3084, + "length": 32 + } + ], + "24753": [ + { + "start": 782, + "length": 32 + }, + { + "start": 2103, + "length": 32 + }, + { + "start": 3234, + "length": 32 + } + ] + } + }, + "methodIdentifiers": { + "approve(address,uint256)": "095ea7b3", + "balanceOf(address)": "70a08231", + "baseURI()": "6c0360eb", + "currentTokenId()": "009a9b7b", + "getApproved(uint256)": "081812fc", + "isApprovedForAll(address,address)": "e985e9c5", + "maxSupply()": "d5abeb01", + "merkleRoot()": "2eb4a7ab", + "mint(address,bytes32[])": "7bf32270", + "mintPeriod()": "4c498203", + "name()": "06fdde03", + "owner()": "8da5cb5b", + "ownerOf(uint256)": "6352211e", + "renounceOwnership()": "715018a6", + "safeTransferFrom(address,address,uint256)": "42842e0e", + "safeTransferFrom(address,address,uint256,bytes)": "b88d4fde", + "setApprovalForAll(address,bool)": "a22cb465", + "setBaseURI(string)": "55f804b3", + "supportsInterface(bytes4)": "01ffc9a7", + "symbol()": "95d89b41", + "tokenURI(uint256)": "c87b56dd", + "transferFrom(address,address,uint256)": "23b872dd", + "transferOwnership(address)": "f2fde38b", + "treasury()": "61d027b3", + "userToClaims(address)": "4b38413c", + "withdraw()": "3ccfd60b", + "withdrawAll()": "853828b6" + }, + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.16+commit.07a7930e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"_merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"_baseURI\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_mintPeriod\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_treasury\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"merkleRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_recipient\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mintPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_baseURI\",\"type\":\"string\"}],\"name\":\"setBaseURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"treasury\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userToClaims\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/Mushroom.sol\":\"Mushroom\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":ds-test/=lib/solmate/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"keccak256\":\"0x20b522c62459df59d6fdde3efb7597492dd44970eacdc1a6acc2b20a93bf53b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9ccfb6f87a4f86ffa8725f4c8dd48f9780ac3aeaa0d299394077122b23dfcea0\",\"dweb:/ipfs/QmZ6W2Ssx3oRUM9AtQrzf9ur94dYBqPCSBJypScXxNUqZE\"]},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\":{\"keccak256\":\"0x596ed72a251d391b814a4aa19d7acb02ebdcc92ba27d3fff74a6f0c158b12ab7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d5f49013d50b1011c842f76e96f3c3f146ca7cb15084c8805575e0e0e1a5c700\",\"dweb:/ipfs/QmQ3n5qiuioUA74heD6ZddNkYg1kYihjQBNcy9zgwYXKgM\"]},\"lib/solmate/src/tokens/ERC721.sol\":{\"keccak256\":\"0x04af19f16f00ba65ae168d6d10da5210dc18da6bcec6974dccf984ba388aa22d\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://098e69f22b67da6927e03203c12ebfda5b0490518f6d9cce7853001ac5ad8403\",\"dweb:/ipfs/QmYyzfurQe88PsVjRNfutV3gS7Vi68f7zgtVZVtLfd4ViK\"]},\"src/Mushroom.sol\":{\"keccak256\":\"0x8dfbdbb1c3881ef589db437c627b44d444db49d6a2a7b30323eaf1511bd52c93\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://30aa1d4500fdf50d83da690c9b8a3ae8d8d4232f1ca5f0c85d1b9fdb4105a9b8\",\"dweb:/ipfs/QmRsbUCW3FFoCQBhdrFPFUSQZrAvPXTefMA5AyBv2YweK4\"]}},\"version\":1}", + "metadata": { + "compiler": { + "version": "0.8.16+commit.07a7930e" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "_merkleRoot", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "_baseURI", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_mintPeriod", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "spender", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "approve" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "baseURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "currentTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "maxSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "merkleRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_recipient", + "type": "address" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "mintPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "renounceOwnership" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setApprovalForAll" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_baseURI", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setBaseURI" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function", + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferOwnership" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "userToClaims", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw" + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "withdrawAll" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + ":ds-test/=lib/solmate/lib/ds-test/src/", + ":forge-std/=lib/forge-std/src/", + ":openzeppelin-contracts/=lib/openzeppelin-contracts/", + ":solmate/=lib/solmate/src/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "ipfs" + }, + "compilationTarget": { + "src/Mushroom.sol": "Mushroom" + }, + "libraries": {} + }, + "sources": { + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "keccak256": "0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673", + "urls": [ + "bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2", + "dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "keccak256": "0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7", + "urls": [ + "bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92", + "dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { + "keccak256": "0x20b522c62459df59d6fdde3efb7597492dd44970eacdc1a6acc2b20a93bf53b8", + "urls": [ + "bzz-raw://9ccfb6f87a4f86ffa8725f4c8dd48f9780ac3aeaa0d299394077122b23dfcea0", + "dweb:/ipfs/QmZ6W2Ssx3oRUM9AtQrzf9ur94dYBqPCSBJypScXxNUqZE" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol": { + "keccak256": "0x596ed72a251d391b814a4aa19d7acb02ebdcc92ba27d3fff74a6f0c158b12ab7", + "urls": [ + "bzz-raw://d5f49013d50b1011c842f76e96f3c3f146ca7cb15084c8805575e0e0e1a5c700", + "dweb:/ipfs/QmQ3n5qiuioUA74heD6ZddNkYg1kYihjQBNcy9zgwYXKgM" + ], + "license": "MIT" + }, + "lib/solmate/src/tokens/ERC721.sol": { + "keccak256": "0x04af19f16f00ba65ae168d6d10da5210dc18da6bcec6974dccf984ba388aa22d", + "urls": [ + "bzz-raw://098e69f22b67da6927e03203c12ebfda5b0490518f6d9cce7853001ac5ad8403", + "dweb:/ipfs/QmYyzfurQe88PsVjRNfutV3gS7Vi68f7zgtVZVtLfd4ViK" + ], + "license": "AGPL-3.0-only" + }, + "src/Mushroom.sol": { + "keccak256": "0x8dfbdbb1c3881ef589db437c627b44d444db49d6a2a7b30323eaf1511bd52c93", + "urls": [ + "bzz-raw://30aa1d4500fdf50d83da690c9b8a3ae8d8d4232f1ca5f0c85d1b9fdb4105a9b8", + "dweb:/ipfs/QmRsbUCW3FFoCQBhdrFPFUSQZrAvPXTefMA5AyBv2YweK4" + ], + "license": "MIT" + } + }, + "version": 1 + }, + "ast": { + "absolutePath": "src/Mushroom.sol", + "id": 24968, + "exportedSymbols": { + "Context": [ + 21443 + ], + "ERC721": [ + 24640 + ], + "ERC721TokenReceiver": [ + 24660 + ], + "MaxSupply": [ + 24729 + ], + "MerkleProof": [ + 22309 + ], + "Mushroom": [ + 24967 + ], + "NonExistentTokenURI": [ + 24731 + ], + "Ownable": [ + 21421 + ], + "PeriodNotOver": [ + 24733 + ], + "Strings": [ + 21807 + ] + }, + "nodeType": "SourceUnit", + "src": "32:2498:13", + "nodes": [ + { + "id": 24723, + "nodeType": "PragmaDirective", + "src": "32:23:13", + "literals": [ + "solidity", + "0.8", + ".16" + ] + }, + { + "id": 24724, + "nodeType": "ImportDirective", + "src": "57:35:13", + "absolutePath": "lib/solmate/src/tokens/ERC721.sol", + "file": "solmate/tokens/ERC721.sol", + "nameLocation": "-1:-1:-1", + "scope": 24968, + "sourceUnit": 24661, + "symbolAliases": [], + "unitAlias": "" + }, + { + "id": 24725, + "nodeType": "ImportDirective", + "src": "93:60:13", + "absolutePath": "lib/openzeppelin-contracts/contracts/utils/Strings.sol", + "file": "openzeppelin-contracts/contracts/utils/Strings.sol", + "nameLocation": "-1:-1:-1", + "scope": 24968, + "sourceUnit": 21808, + "symbolAliases": [], + "unitAlias": "" + }, + { + "id": 24726, + "nodeType": "ImportDirective", + "src": "154:61:13", + "absolutePath": "lib/openzeppelin-contracts/contracts/access/Ownable.sol", + "file": "openzeppelin-contracts/contracts/access/Ownable.sol", + "nameLocation": "-1:-1:-1", + "scope": 24968, + "sourceUnit": 21422, + "symbolAliases": [], + "unitAlias": "" + }, + { + "id": 24727, + "nodeType": "ImportDirective", + "src": "216:77:13", + "absolutePath": "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol", + "file": "openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol", + "nameLocation": "-1:-1:-1", + "scope": 24968, + "sourceUnit": 22310, + "symbolAliases": [], + "unitAlias": "" + }, + { + "id": 24729, + "nodeType": "ErrorDefinition", + "src": "295:18:13", + "errorSelector": "b36c1284", + "name": "MaxSupply", + "nameLocation": "301:9:13", + "parameters": { + "id": 24728, + "nodeType": "ParameterList", + "parameters": [], + "src": "310:2:13" + } + }, + { + "id": 24731, + "nodeType": "ErrorDefinition", + "src": "314:28:13", + "errorSelector": "d872946b", + "name": "NonExistentTokenURI", + "nameLocation": "320:19:13", + "parameters": { + "id": 24730, + "nodeType": "ParameterList", + "parameters": [], + "src": "339:2:13" + } + }, + { + "id": 24733, + "nodeType": "ErrorDefinition", + "src": "343:22:13", + "errorSelector": "bef9bbeb", + "name": "PeriodNotOver", + "nameLocation": "349:13:13", + "parameters": { + "id": 24732, + "nodeType": "ParameterList", + "parameters": [], + "src": "362:2:13" + } + }, + { + "id": 24967, + "nodeType": "ContractDefinition", + "src": "367:2162:13", + "nodes": [ + { + "id": 24740, + "nodeType": "UsingForDirective", + "src": "410:26:13", + "global": false, + "libraryName": { + "id": 24738, + "name": "Strings", + "nameLocations": [ + "416:7:13" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 21807, + "src": "416:7:13" + }, + "typeName": { + "id": 24739, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "428:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "id": 24742, + "nodeType": "VariableDeclaration", + "src": "442:29:13", + "constant": false, + "functionSelector": "009a9b7b", + "mutability": "mutable", + "name": "currentTokenId", + "nameLocation": "457:14:13", + "scope": 24967, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 24741, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "442:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "id": 24745, + "nodeType": "VariableDeclaration", + "src": "477:40:13", + "constant": true, + "functionSelector": "d5abeb01", + "mutability": "constant", + "name": "maxSupply", + "nameLocation": "501:9:13", + "scope": 24967, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 24743, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "477:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "32353030", + "id": 24744, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "513:4:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_2500_by_1", + "typeString": "int_const 2500" + }, + "value": "2500" + }, + "visibility": "public" + }, + { + "id": 24747, + "nodeType": "VariableDeclaration", + "src": "523:21:13", + "constant": false, + "functionSelector": "6c0360eb", + "mutability": "mutable", + "name": "baseURI", + "nameLocation": "537:7:13", + "scope": 24967, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string" + }, + "typeName": { + "id": 24746, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "523:6:13", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "public" + }, + { + "id": 24749, + "nodeType": "VariableDeclaration", + "src": "550:35:13", + "constant": false, + "functionSelector": "2eb4a7ab", + "mutability": "immutable", + "name": "merkleRoot", + "nameLocation": "575:10:13", + "scope": 24967, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 24748, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "550:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "public" + }, + { + "id": 24751, + "nodeType": "VariableDeclaration", + "src": "591:35:13", + "constant": false, + "functionSelector": "4c498203", + "mutability": "immutable", + "name": "mintPeriod", + "nameLocation": "616:10:13", + "scope": 24967, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 24750, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "591:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "id": 24753, + "nodeType": "VariableDeclaration", + "src": "632:33:13", + "constant": false, + "functionSelector": "61d027b3", + "mutability": "immutable", + "name": "treasury", + "nameLocation": "657:8:13", + "scope": 24967, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 24752, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "632:7:13", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "public" + }, + { + "id": 24757, + "nodeType": "VariableDeclaration", + "src": "671:44:13", + "constant": false, + "functionSelector": "4b38413c", + "mutability": "mutable", + "name": "userToClaims", + "nameLocation": "703:12:13", + "scope": 24967, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + }, + "typeName": { + "id": 24756, + "keyType": { + "id": 24754, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "679:7:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "671:24:13", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + }, + "valueType": { + "id": 24755, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "690:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + }, + "visibility": "public" + }, + { + "id": 24796, + "nodeType": "FunctionDefinition", + "src": "722:369:13", + "body": { + "id": 24795, + "nodeType": "Block", + "src": "940:151:13", + "statements": [ + { + "expression": { + "id": 24778, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 24776, + "name": "merkleRoot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24749, + "src": "950:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 24777, + "name": "_merkleRoot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24763, + "src": "963:11:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "950:24:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 24779, + "nodeType": "ExpressionStatement", + "src": "950:24:13" + }, + { + "expression": { + "id": 24782, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 24780, + "name": "baseURI", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24747, + "src": "984:7:13", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 24781, + "name": "_baseURI", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24765, + "src": "994:8:13", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "src": "984:18:13", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "id": 24783, + "nodeType": "ExpressionStatement", + "src": "984:18:13" + }, + { + "expression": { + "id": 24789, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 24784, + "name": "mintPeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24751, + "src": "1012:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 24788, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 24785, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "1025:5:13", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 24786, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1031:9:13", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "1025:15:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 24787, + "name": "_mintPeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24767, + "src": "1043:11:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1025:29:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1012:42:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 24790, + "nodeType": "ExpressionStatement", + "src": "1012:42:13" + }, + { + "expression": { + "id": 24793, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 24791, + "name": "treasury", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24753, + "src": "1064:8:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 24792, + "name": "_treasury", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24769, + "src": "1075:9:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1064:20:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 24794, + "nodeType": "ExpressionStatement", + "src": "1064:20:13" + } + ] + }, + "implemented": true, + "kind": "constructor", + "modifiers": [ + { + "arguments": [ + { + "id": 24772, + "name": "_name", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24759, + "src": "924:5:13", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 24773, + "name": "_symbol", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24761, + "src": "931:7:13", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "id": 24774, + "kind": "baseConstructorSpecifier", + "modifierName": { + "id": 24771, + "name": "ERC721", + "nameLocations": [ + "917:6:13" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 24640, + "src": "917:6:13" + }, + "nodeType": "ModifierInvocation", + "src": "917:22:13" + } + ], + "name": "", + "nameLocation": "-1:-1:-1", + "parameters": { + "id": 24770, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 24759, + "mutability": "mutable", + "name": "_name", + "nameLocation": "757:5:13", + "nodeType": "VariableDeclaration", + "scope": 24796, + "src": "743:19:13", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 24758, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "743:6:13", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 24761, + "mutability": "mutable", + "name": "_symbol", + "nameLocation": "786:7:13", + "nodeType": "VariableDeclaration", + "scope": 24796, + "src": "772:21:13", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 24760, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "772:6:13", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 24763, + "mutability": "mutable", + "name": "_merkleRoot", + "nameLocation": "811:11:13", + "nodeType": "VariableDeclaration", + "scope": 24796, + "src": "803:19:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 24762, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "803:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 24765, + "mutability": "mutable", + "name": "_baseURI", + "nameLocation": "846:8:13", + "nodeType": "VariableDeclaration", + "scope": 24796, + "src": "832:22:13", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 24764, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "832:6:13", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 24767, + "mutability": "mutable", + "name": "_mintPeriod", + "nameLocation": "872:11:13", + "nodeType": "VariableDeclaration", + "scope": 24796, + "src": "864:19:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 24766, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "864:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 24769, + "mutability": "mutable", + "name": "_treasury", + "nameLocation": "901:9:13", + "nodeType": "VariableDeclaration", + "scope": 24796, + "src": "893:17:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 24768, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "893:7:13", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "733:183:13" + }, + "returnParameters": { + "id": 24775, + "nodeType": "ParameterList", + "parameters": [], + "src": "940:0:13" + }, + "scope": 24967, + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "id": 24872, + "nodeType": "FunctionDefinition", + "src": "1097:626:13", + "body": { + "id": 24871, + "nodeType": "Block", + "src": "1180:543:13", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 24812, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 24807, + "name": "_recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24798, + "src": "1234:10:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 24810, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1256:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 24809, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1248:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 24808, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1248:7:13", + "typeDescriptions": {} + } + }, + "id": 24811, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1248:10:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1234:24:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "41646472657373205a65726f", + "id": 24813, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1260:14:13", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_71587322384fed86844d293a84e5c118d6907a210035a9cc6be3b52ed696f507", + "typeString": "literal_string \"Address Zero\"" + }, + "value": "Address Zero" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_71587322384fed86844d293a84e5c118d6907a210035a9cc6be3b52ed696f507", + "typeString": "literal_string \"Address Zero\"" + } + ], + "id": 24806, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "1226:7:13", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 24814, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1226:49:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 24815, + "nodeType": "ExpressionStatement", + "src": "1226:49:13" + }, + { + "assignments": [ + 24817 + ], + "declarations": [ + { + "constant": false, + "id": 24817, + "mutability": "mutable", + "name": "leaf", + "nameLocation": "1293:4:13", + "nodeType": "VariableDeclaration", + "scope": 24871, + "src": "1285:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 24816, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1285:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 24824, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "id": 24821, + "name": "_recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24798, + "src": "1327:10:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 24819, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "1310:3:13", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 24820, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1314:12:13", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "1310:16:13", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 24822, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1310:28:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 24818, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "1300:9:13", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 24823, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1300:39:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1285:54:13" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 24828, + "name": "proof", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24801, + "src": "1376:5:13", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes32_$dyn_memory_ptr", + "typeString": "bytes32[] memory" + } + }, + { + "id": 24829, + "name": "merkleRoot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24749, + "src": "1383:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 24830, + "name": "leaf", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24817, + "src": "1395:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_array$_t_bytes32_$dyn_memory_ptr", + "typeString": "bytes32[] memory" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 24826, + "name": "MerkleProof", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 22309, + "src": "1357:11:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_MerkleProof_$22309_$", + "typeString": "type(library MerkleProof)" + } + }, + "id": 24827, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1369:6:13", + "memberName": "verify", + "nodeType": "MemberAccess", + "referencedDeclaration": 21831, + "src": "1357:18:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_array$_t_bytes32_$dyn_memory_ptr_$_t_bytes32_$_t_bytes32_$returns$_t_bool_$", + "typeString": "function (bytes32[] memory,bytes32,bytes32) pure returns (bool)" + } + }, + "id": 24831, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1357:43:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "496e76616c69642070726f6f66", + "id": 24832, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1402:15:13", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_dbb8b2d35c676776519896c045ce9c5b267915e4127b1aa1fa65a56a3d2b2639", + "typeString": "literal_string \"Invalid proof\"" + }, + "value": "Invalid proof" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_dbb8b2d35c676776519896c045ce9c5b267915e4127b1aa1fa65a56a3d2b2639", + "typeString": "literal_string \"Invalid proof\"" + } + ], + "id": 24825, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "1349:7:13", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 24833, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1349:69:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 24834, + "nodeType": "ExpressionStatement", + "src": "1349:69:13" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 24840, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "baseExpression": { + "id": 24836, + "name": "userToClaims", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24757, + "src": "1436:12:13", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + } + }, + "id": 24838, + "indexExpression": { + "id": 24837, + "name": "_recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24798, + "src": "1449:10:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1436:24:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "66616c7365", + "id": 24839, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1464:5:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + "src": "1436:33:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "416c726561647920636c61696d6564", + "id": 24841, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1471:17:13", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_8d5f1075ee9cf123a11fed45e62459547c318d7703b4e3920694b01d6b8c6dcf", + "typeString": "literal_string \"Already claimed\"" + }, + "value": "Already claimed" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_8d5f1075ee9cf123a11fed45e62459547c318d7703b4e3920694b01d6b8c6dcf", + "typeString": "literal_string \"Already claimed\"" + } + ], + "id": 24835, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "1428:7:13", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 24842, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1428:61:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 24843, + "nodeType": "ExpressionStatement", + "src": "1428:61:13" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 24849, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 24847, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 24845, + "name": "currentTokenId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24742, + "src": "1507:14:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "hexValue": "31", + "id": 24846, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1524:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "1507:18:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 24848, + "name": "maxSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24745, + "src": "1529:9:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1507:31:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "4d617820737570706c792072656163686564", + "id": 24850, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1540:20:13", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_cf40cb9708e1320ee04bc59cb2f8b4ce47ba0c93638609957810c412abce51a7", + "typeString": "literal_string \"Max supply reached\"" + }, + "value": "Max supply reached" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_cf40cb9708e1320ee04bc59cb2f8b4ce47ba0c93638609957810c412abce51a7", + "typeString": "literal_string \"Max supply reached\"" + } + ], + "id": 24844, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "1499:7:13", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 24851, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1499:62:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 24852, + "nodeType": "ExpressionStatement", + "src": "1499:62:13" + }, + { + "expression": { + "id": 24857, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 24853, + "name": "userToClaims", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24757, + "src": "1571:12:13", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + } + }, + "id": 24855, + "indexExpression": { + "id": 24854, + "name": "_recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24798, + "src": "1584:10:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "1571:24:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "74727565", + "id": 24856, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1598:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "src": "1571:31:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 24858, + "nodeType": "ExpressionStatement", + "src": "1571:31:13" + }, + { + "assignments": [ + 24860 + ], + "declarations": [ + { + "constant": false, + "id": 24860, + "mutability": "mutable", + "name": "newItemId", + "nameLocation": "1620:9:13", + "nodeType": "VariableDeclaration", + "scope": 24871, + "src": "1612:17:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 24859, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1612:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 24863, + "initialValue": { + "id": 24862, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": true, + "src": "1632:16:13", + "subExpression": { + "id": 24861, + "name": "currentTokenId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24742, + "src": "1634:14:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1612:36:13" + }, + { + "expression": { + "arguments": [ + { + "id": 24865, + "name": "_recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24798, + "src": "1668:10:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 24866, + "name": "newItemId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24860, + "src": "1680:9:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 24864, + "name": "_safeMint", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 24597, + 24639 + ], + "referencedDeclaration": 24597, + "src": "1658:9:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 24867, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1658:32:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 24868, + "nodeType": "ExpressionStatement", + "src": "1658:32:13" + }, + { + "expression": { + "id": 24869, + "name": "newItemId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24860, + "src": "1707:9:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 24805, + "id": 24870, + "nodeType": "Return", + "src": "1700:16:13" + } + ] + }, + "functionSelector": "7bf32270", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "mint", + "nameLocation": "1106:4:13", + "parameters": { + "id": 24802, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 24798, + "mutability": "mutable", + "name": "_recipient", + "nameLocation": "1119:10:13", + "nodeType": "VariableDeclaration", + "scope": 24872, + "src": "1111:18:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 24797, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1111:7:13", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 24801, + "mutability": "mutable", + "name": "proof", + "nameLocation": "1148:5:13", + "nodeType": "VariableDeclaration", + "scope": 24872, + "src": "1131:22:13", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes32_$dyn_memory_ptr", + "typeString": "bytes32[]" + }, + "typeName": { + "baseType": { + "id": 24799, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1131:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 24800, + "nodeType": "ArrayTypeName", + "src": "1131:9:13", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes32_$dyn_storage_ptr", + "typeString": "bytes32[]" + } + }, + "visibility": "internal" + } + ], + "src": "1110:44:13" + }, + "returnParameters": { + "id": 24805, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 24804, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 24872, + "src": "1171:7:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 24803, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1171:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1170:9:13" + }, + "scope": 24967, + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "id": 24884, + "nodeType": "FunctionDefinition", + "src": "1729:96:13", + "body": { + "id": 24883, + "nodeType": "Block", + "src": "1790:35:13", + "statements": [ + { + "expression": { + "id": 24881, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 24879, + "name": "baseURI", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24747, + "src": "1800:7:13", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 24880, + "name": "_baseURI", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24874, + "src": "1810:8:13", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "src": "1800:18:13", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "id": 24882, + "nodeType": "ExpressionStatement", + "src": "1800:18:13" + } + ] + }, + "functionSelector": "55f804b3", + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 24877, + "kind": "modifierInvocation", + "modifierName": { + "id": 24876, + "name": "onlyOwner", + "nameLocations": [ + "1780:9:13" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 21340, + "src": "1780:9:13" + }, + "nodeType": "ModifierInvocation", + "src": "1780:9:13" + } + ], + "name": "setBaseURI", + "nameLocation": "1738:10:13", + "parameters": { + "id": 24875, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 24874, + "mutability": "mutable", + "name": "_baseURI", + "nameLocation": "1763:8:13", + "nodeType": "VariableDeclaration", + "scope": 24884, + "src": "1749:22:13", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 24873, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "1749:6:13", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "1748:24:13" + }, + "returnParameters": { + "id": 24878, + "nodeType": "ParameterList", + "parameters": [], + "src": "1790:0:13" + }, + "scope": 24967, + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "id": 24917, + "nodeType": "FunctionDefinition", + "src": "1831:224:13", + "body": { + "id": 24916, + "nodeType": "Block", + "src": "1919:136:13", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 24893, + "name": "tokenId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24886, + "src": "1937:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 24892, + "name": "ownerOf", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24165, + "src": "1929:7:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_address_$", + "typeString": "function (uint256) view returns (address)" + } + }, + "id": 24894, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1929:16:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 24895, + "nodeType": "ExpressionStatement", + "src": "1929:16:13" + }, + { + "expression": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 24902, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "arguments": [ + { + "id": 24898, + "name": "baseURI", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24747, + "src": "1968:7:13", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + ], + "id": 24897, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1962:5:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 24896, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1962:5:13", + "typeDescriptions": {} + } + }, + "id": 24899, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1962:14:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes storage pointer" + } + }, + "id": 24900, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1977:6:13", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "1962:21:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 24901, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1986:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "1962:25:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "hexValue": "", + "id": 24913, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2046:2:13", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + }, + "value": "" + }, + "id": 24914, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "1962:86:13", + "trueExpression": { + "arguments": [ + { + "arguments": [ + { + "id": 24907, + "name": "baseURI", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24747, + "src": "2014:7:13", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 24908, + "name": "tokenId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24886, + "src": "2023:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 24909, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2031:8:13", + "memberName": "toString", + "nodeType": "MemberAccess", + "referencedDeclaration": 21612, + "src": "2023:16:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_string_memory_ptr_$bound_to$_t_uint256_$", + "typeString": "function (uint256) pure returns (string memory)" + } + }, + "id": 24910, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2023:18:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + }, + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "expression": { + "id": 24905, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "1997:3:13", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 24906, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2001:12:13", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "1997:16:13", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 24911, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1997:45:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 24904, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1990:6:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + }, + "typeName": { + "id": 24903, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "1990:6:13", + "typeDescriptions": {} + } + }, + "id": 24912, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1990:53:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "functionReturnParameters": 24891, + "id": 24915, + "nodeType": "Return", + "src": "1955:93:13" + } + ] + }, + "baseFunctions": [ + 24134 + ], + "functionSelector": "c87b56dd", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tokenURI", + "nameLocation": "1840:8:13", + "overrides": { + "id": 24888, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "1886:8:13" + }, + "parameters": { + "id": 24887, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 24886, + "mutability": "mutable", + "name": "tokenId", + "nameLocation": "1857:7:13", + "nodeType": "VariableDeclaration", + "scope": 24917, + "src": "1849:15:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 24885, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1849:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1848:17:13" + }, + "returnParameters": { + "id": 24891, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 24890, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 24917, + "src": "1904:13:13", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 24889, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "1904:6:13", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "1903:15:13" + }, + "scope": 24967, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 24939, + "nodeType": "FunctionDefinition", + "src": "2061:197:13", + "body": { + "id": 24938, + "nodeType": "Block", + "src": "2088:170:13", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 24924, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 24921, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "2106:5:13", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 24922, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2112:9:13", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "2106:15:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "id": 24923, + "name": "mintPeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24751, + "src": "2124:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2106:28:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "4d696e7420706572696f64207374696c6c206e6f74206f766572", + "id": 24925, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2136:28:13", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_6b175bd1800c73b3fb8225ec6af662a8feb3714e32c3e54f67b2346cd14700b9", + "typeString": "literal_string \"Mint period still not over\"" + }, + "value": "Mint period still not over" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_6b175bd1800c73b3fb8225ec6af662a8feb3714e32c3e54f67b2346cd14700b9", + "typeString": "literal_string \"Mint period still not over\"" + } + ], + "id": 24920, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "2098:7:13", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 24926, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2098:67:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 24927, + "nodeType": "ExpressionStatement", + "src": "2098:67:13" + }, + { + "assignments": [ + 24929 + ], + "declarations": [ + { + "constant": false, + "id": 24929, + "mutability": "mutable", + "name": "newItemId", + "nameLocation": "2183:9:13", + "nodeType": "VariableDeclaration", + "scope": 24938, + "src": "2175:17:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 24928, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2175:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 24932, + "initialValue": { + "id": 24931, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": true, + "src": "2195:16:13", + "subExpression": { + "id": 24930, + "name": "currentTokenId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24742, + "src": "2197:14:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2175:36:13" + }, + { + "expression": { + "arguments": [ + { + "id": 24934, + "name": "treasury", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24753, + "src": "2231:8:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 24935, + "name": "newItemId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24929, + "src": "2241:9:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 24933, + "name": "_safeMint", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 24597, + 24639 + ], + "referencedDeclaration": 24597, + "src": "2221:9:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 24936, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2221:30:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 24937, + "nodeType": "ExpressionStatement", + "src": "2221:30:13" + } + ] + }, + "functionSelector": "3ccfd60b", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nameLocation": "2070:8:13", + "parameters": { + "id": 24918, + "nodeType": "ParameterList", + "parameters": [], + "src": "2078:2:13" + }, + "returnParameters": { + "id": 24919, + "nodeType": "ParameterList", + "parameters": [], + "src": "2088:0:13" + }, + "scope": 24967, + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "id": 24966, + "nodeType": "FunctionDefinition", + "src": "2264:263:13", + "body": { + "id": 24965, + "nodeType": "Block", + "src": "2294:233:13", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 24946, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 24943, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "2312:5:13", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 24944, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2318:9:13", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "2312:15:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "id": 24945, + "name": "mintPeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24751, + "src": "2330:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2312:28:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "4d696e7420706572696f64207374696c6c206e6f74206f766572", + "id": 24947, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2342:28:13", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_6b175bd1800c73b3fb8225ec6af662a8feb3714e32c3e54f67b2346cd14700b9", + "typeString": "literal_string \"Mint period still not over\"" + }, + "value": "Mint period still not over" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_6b175bd1800c73b3fb8225ec6af662a8feb3714e32c3e54f67b2346cd14700b9", + "typeString": "literal_string \"Mint period still not over\"" + } + ], + "id": 24942, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "2304:7:13", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 24948, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2304:67:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 24949, + "nodeType": "ExpressionStatement", + "src": "2304:67:13" + }, + { + "body": { + "id": 24963, + "nodeType": "Block", + "src": "2416:105:13", + "statements": [ + { + "assignments": [ + 24954 + ], + "declarations": [ + { + "constant": false, + "id": 24954, + "mutability": "mutable", + "name": "newItemId", + "nameLocation": "2438:9:13", + "nodeType": "VariableDeclaration", + "scope": 24963, + "src": "2430:17:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 24953, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2430:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 24957, + "initialValue": { + "id": 24956, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": true, + "src": "2450:16:13", + "subExpression": { + "id": 24955, + "name": "currentTokenId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24742, + "src": "2452:14:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2430:36:13" + }, + { + "expression": { + "arguments": [ + { + "id": 24959, + "name": "treasury", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24753, + "src": "2490:8:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 24960, + "name": "newItemId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24954, + "src": "2500:9:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 24958, + "name": "_safeMint", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 24597, + 24639 + ], + "referencedDeclaration": 24597, + "src": "2480:9:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 24961, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2480:30:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 24962, + "nodeType": "ExpressionStatement", + "src": "2480:30:13" + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 24952, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 24950, + "name": "currentTokenId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24742, + "src": "2388:14:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 24951, + "name": "maxSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24745, + "src": "2405:9:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2388:26:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 24964, + "nodeType": "WhileStatement", + "src": "2381:140:13" + } + ] + }, + "functionSelector": "853828b6", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdrawAll", + "nameLocation": "2273:11:13", + "parameters": { + "id": 24940, + "nodeType": "ParameterList", + "parameters": [], + "src": "2284:2:13" + }, + "returnParameters": { + "id": 24941, + "nodeType": "ParameterList", + "parameters": [], + "src": "2294:0:13" + }, + "scope": 24967, + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 24734, + "name": "ERC721", + "nameLocations": [ + "388:6:13" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 24640, + "src": "388:6:13" + }, + "id": 24735, + "nodeType": "InheritanceSpecifier", + "src": "388:6:13" + }, + { + "baseName": { + "id": 24736, + "name": "Ownable", + "nameLocations": [ + "396:7:13" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 21421, + "src": "396:7:13" + }, + "id": 24737, + "nodeType": "InheritanceSpecifier", + "src": "396:7:13" + } + ], + "canonicalName": "Mushroom", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "linearizedBaseContracts": [ + 24967, + 21421, + 21443, + 24640 + ], + "name": "Mushroom", + "nameLocation": "376:8:13", + "scope": 24968, + "usedErrors": [] + } + ], + "license": "MIT" + }, + "id": 13 +} \ No newline at end of file diff --git a/src/hooks/useMerkleTree.tsx b/src/hooks/useMerkleTree.tsx new file mode 100644 index 0000000..3a23567 --- /dev/null +++ b/src/hooks/useMerkleTree.tsx @@ -0,0 +1,27 @@ +import React from "react"; +import { MerkleTree } from "merkletreejs"; +import keccak256 from "keccak256"; + +class MerkleTreeFactory { + merkleTree: MerkleTree; + + constructor(whitellist: Array) { + const leaves = whitellist.map((addr) => keccak256(addr)); + this.merkleTree = new MerkleTree(leaves, keccak256, { sortPairs: true }); + } + + getProof = (address: string): any => this.merkleTree.getHexProof(keccak256(address)); + + verify = (address: string): boolean => { + const merkleRoot = this.merkleTree.getHexRoot(); + const proof = this.getProof(address); + + return this.merkleTree.verify(proof, keccak256(address), merkleRoot); + }; +} + +export const useMerkleTree = (whitellist: Array): MerkleTreeFactory => { + const merkleTree = React.useMemo(() => new MerkleTreeFactory(whitellist), [whitellist]); + + return merkleTree; +}; diff --git a/src/hooks/useMushroomNft.tsx b/src/hooks/useMushroomNft.tsx new file mode 100644 index 0000000..1c0b7aa --- /dev/null +++ b/src/hooks/useMushroomNft.tsx @@ -0,0 +1,23 @@ +import React, { useState } from "react"; +import { ethers } from "ethers"; +import { Contract } from "ethers-multicall"; +import { IMushroomNftContext } from "../state/MushroomNftContext"; + +export const useMushroomNft = (): IMushroomNftContext => { + const [mushroomNft, setMushroomNft] = useState(); + const [mushroomNftRead, setMushroomNftRead] = useState(); + + const setCurrentMushroomNft = React.useCallback((currentMushroomNft: ethers.Contract): void => { + setMushroomNft(currentMushroomNft); + }, []); + const setCurrentMushroomNftRead = React.useCallback((currentMushroomNftRead: Contract): void => { + setMushroomNftRead(currentMushroomNftRead); + }, []); + + return { + mushroomNft, + setCurrentMushroomNft, + mushroomNftRead, + setCurrentMushroomNftRead, + }; +}; diff --git a/src/state/MushroomNftContext.tsx b/src/state/MushroomNftContext.tsx new file mode 100644 index 0000000..756e836 --- /dev/null +++ b/src/state/MushroomNftContext.tsx @@ -0,0 +1,19 @@ +import React from "react"; +import { ethers } from "ethers"; +import { Contract } from "ethers-multicall"; + +export interface IMushroomNftContext { + mushroomNft?: ethers.Contract; + setCurrentMushroomNft: (currentMushroom: ethers.Contract) => void; + mushroomNftRead?: Contract; + setCurrentMushroomNftRead: (currentMushroomRead: Contract) => void; +} + +export const MUSHROOM_VALUE = { + setCurrentMushroomNft: () => {}, + setCurrentMushroomNftRead: () => {}, +}; + +const mushroomNftContext = React.createContext(MUSHROOM_VALUE); + +export default mushroomNftContext; diff --git a/src/styles/_colors.scss b/src/styles/_colors.scss index 472a65b..02fbdf9 100644 --- a/src/styles/_colors.scss +++ b/src/styles/_colors.scss @@ -5,6 +5,7 @@ $purple: #7940f2; $dark: #494866; $darker: #212138; $light: #9795b0; +$lighter: #bebcd4; $white: #ffffff; $off-white: #f5f5f5; $pink: #e440f2; diff --git a/src/styles/app.scss b/src/styles/app.scss index f1269e4..a390894 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -16,8 +16,8 @@ $theme-colors: ( @import "~bootstrap/scss/bootstrap"; -p { - color: $light; +p, li { + color: $lighter; } h1, @@ -59,6 +59,10 @@ body { border-width: 1px; } +.btn:disabled { + color: $dark; +} + .btn.neon-highlight { border: 1px solid $highlight; box-sizing: border-box; @@ -209,6 +213,21 @@ input[type="number"].neon-hightlight:focus { background: no-repeat; } +span { + &.neon-green { + text-shadow: 0 0 4px #167226, 0 0 10px #61c4b3, 0 0 20px #167226, 0 -10px 40px #167226; + } + &.neon-orange { + text-shadow: 0 0 4px #eeb173,0 0 10px rgb(236, 97, 97),0 0 20px #eeb173,0 -10px 40px #c33; + } + &.neon-pink { + text-shadow: 0 0 4px #e440f2, 0 0 10px #e98ff1, 0 0 20px #e440f2, 0 -10px 40px #b626c4; + } + &.neon-purple { + text-shadow: 0 0 4px #7940f2, 0 0 10px #fcdf49, 0 0 20px #7940f2, 0 -10px 40px #c33; + } +} + textarea.neon-green:focus { border-color: $green !important; box-shadow: -1px 0px 15px -6px $green; diff --git a/src/styles/sewagefruit.scss b/src/styles/sewagefruit.scss new file mode 100644 index 0000000..0f0413b --- /dev/null +++ b/src/styles/sewagefruit.scss @@ -0,0 +1,97 @@ +@import "./colors"; +@import "./fonts"; + +.sewage-fruit { + display: flex; + flex-direction: column; + margin: 2rem; + padding: 1rem; + + [class^="col-"] { + padding-left: 0px; + padding-right: 0px; + } + + .spinner { + margin: 5rem 0rem; + } + + .content { + display: grid; + grid-template-columns: 46% 46%; + grid-gap: 3rem; + } + + .card { + padding: 1rem; + margin-top: 2rem; + + ul { + margin: 2.5rem 0rem; + } + + &-footer { + display: flex; + justify-content: flex-end; + } + + img { + width: 60%; + } + .img-sewage { + width: 100%; + } + .img-minted { + width: 70%; + border-radius: 50%; + } + .btn { + background-color: $darker; + width: 10rem; + height: 2.7rem; + } + } + + .mint { + background-color: rgba(33, 33, 56, 0.7); + p { + font-size: 1.1rem; + } + .card-body { + display: flex; + justify-content: center; + align-items: center; + } + } + + @media (max-width: 1300px) { + .content { + grid-template-columns: 49% 49%; + } + } + @media (max-width: 1080px) { + .content { + grid-template-columns: 100%; + grid-gap: 1rem; + } + } + @media (max-width: 1024px) { + margin: 4rem 1rem; + padding: 0.5rem; + } + @media (max-width: 500px) { + margin: 2rem 0.2rem 4rem 0.7rem; + padding: 0rem; + .card { + img { + width: 75%; + } + .img-minted { + width: 82%; + } + } + .mint { + height: 27rem; + } + } +} \ No newline at end of file diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index f8e2a45..c5d508c 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -1,7 +1,7 @@ @import "./colors"; .sidebar { - width: 5.3rem; + width: 6.1rem; height: 100%; background-color: $darker; border-right: solid 2px $dark; @@ -48,6 +48,10 @@ filter: #A9A7BE; } + a svg.sewagefruit, svg.logout-icon { + margin-top: 0.8rem; + } + a.active svg { -webkit-filter: drop-shadow(3px 3px 2px $highlight); filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); @@ -63,12 +67,16 @@ } &.mobile { - width: 4.5rem; + width: 5.5rem; z-index: 10; top: 0; svg.menu { fill: $white; } + a svg.sewagefruit, + svg.logout-icon { + margin-top: 0.8rem; + } .mt-4.nav-item { margin-top: 0.5rem !important; } @@ -76,7 +84,7 @@ height: 4.5rem; } &.slide-out { - left: -5rem; + left: -5.5rem; transition: left 0.6s ease-out; } diff --git a/src/styles/tower.scss b/src/styles/tower.scss deleted file mode 100644 index 6ad1123..0000000 --- a/src/styles/tower.scss +++ /dev/null @@ -1,88 +0,0 @@ -/* First lets set a background */ -.bg{ - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: url('https://images.unsplash.com/photo-1431352832634-845fad190fbd?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&s=ec80c41e488dc2b99ed543df2f3f0919'); - background-position: center center; - background-origin: content-box; - background-size: cover; - background-attachment: fixed; - z-index: -2; -} - -/* Now the same background, but with brightness filters*/ -.lightning{ - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: url('https://images.unsplash.com/photo-1431352832634-845fad190fbd?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&s=ec80c41e488dc2b99ed543df2f3f0919'); - background-position: center center; - background-origin: content-box; - background-size: cover; - background-attachment: fixed; - -webkit-filter: brightness(3); - filter: brightness(3); - -o-filter: brightness(3); - -moz-filter: brightness(3); - z-index: -1; -} - -/*Now just a opacity animation*/ -.flashit{ --webkit-animation: flash ease-out 7s infinite; --moz-animation: flash ease-out 7s infinite; -animation: flash ease-out 7s infinite; -animation-delay: 2s; -} - -@-webkit-keyframes flash { - from { opacity: 0; } - 92% { opacity: 0; } - 93% { opacity: 0.6; } - 94% { opacity: 0.2; } - 96% { opacity: 0.9; } - to { opacity: 0; } -} - -@keyframes flash { - from { opacity: 0; } - 92% { opacity: 0; } - 93% { opacity: 0.6; } - 94% { opacity: 0.2; } - 96% { opacity: 1; } - to { opacity: 0; } -} -/*End! is that simple! */ - -/*Now just some stupid logo to get some look and feel */ -#logo{ - z-index:1000; - width: 100%; - font-size: 6rem; - color: white; - position: fixed; - top: 50%; - left: 50%; - margin-left: -18rem; - margin-top: -2rem; - font-weight: 900; -} -#logo span{ font-weight: 100;} - -html , body{ - font-family: "Titillium Web", "lato" , sans-serif; -} -@import url(https://fonts.googleapis.com/css?family=Titillium+Web:200,900|Lato:100,300,900); - -@media screen and (max-width: 630px){ - #logo{ - font-size: 3rem; - margin-left: -9rem; - margin-top: -1rem; - } -} \ No newline at end of file diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index f5ea6f6..814d764 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -16,6 +16,18 @@ export const NETWORKS = { process.env.REACT_APP_FORTMATIC_INFURA_ID || "" ), }, + goerli: { + chainId: 5, + hexChainId: "0x5", + name: "goerli", + eth: "0x7f86C79c1D458B03c14e5a6C658100283a1c3cc1", + weth: "0x7f86C79c1D458B03c14e5a6C658100283a1c3cc1", + mushroomNft: "0x91877f3928379e972ac28ea9076ded52c9738b7c", + infuraRpcUrl: "https://goerli.infura.io/v3/".concat(process.env.REACT_APP_INFURA_ID || ""), + infuraFortmaticRpcUrl: "https://goerli.infura.io/v3/".concat( + process.env.REACT_APP_FORTMATIC_INFURA_ID || "" + ), + }, rinkeby: { chainId: 4, hexChainId: "0x4", @@ -84,6 +96,11 @@ export const GRAPHQL_ENDPOINT = { mumbai: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-polygon", }; +export const OS_API_URL = { + mainnet: "https://testnets-api.opensea.io/api/v1/assets", + goerli: "https://testnets-api.opensea.io/api/v1/assets", +}; + export const FEATURES = { KEEPERS_API: false, NEW_VAULTS: true, diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index e3a4cbb..6e83a8d 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -287,7 +287,11 @@ export const isValidNetwork = (chainId: number) => { export const isInLayer1 = (chainId: number | undefined) => { if (!isUndefined(chainId)) { - return chainId === NETWORKS.mainnet.chainId || chainId === NETWORKS.rinkeby.chainId; + return ( + chainId === NETWORKS.mainnet.chainId || + chainId === NETWORKS.rinkeby.chainId || + chainId === NETWORKS.goerli.chainId + ); } return false; }; @@ -306,6 +310,13 @@ export const isPolygon = (chainId: number | undefined) => { return false; }; +export const isGoerli = (chainId: number | undefined) => { + if (!isUndefined(chainId)) { + return chainId === NETWORKS.goerli.chainId; + } + return false; +}; + export const getDefaultProvider = (chainId: number | undefined, name: string | undefined) => { let provider; if (chainId === NETWORKS.okovan.chainId) { diff --git a/yarn.lock b/yarn.lock index 8616715..c10bba8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2211,6 +2211,13 @@ dependencies: "@types/node" "*" +"@types/bn.js@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== + dependencies: + "@types/node" "*" + "@types/eslint@^7.28.2": version "7.29.0" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78" @@ -2365,13 +2372,6 @@ dependencies: "@types/react" "^16" -"@types/react-helmet@^6.1.5": - version "6.1.5" - resolved "https://registry.yarnpkg.com/@types/react-helmet/-/react-helmet-6.1.5.tgz#35f89a6b1646ee2bc342a33a9a6c8777933f9083" - integrity sha512-/ICuy7OHZxR0YCAZLNg9r7I9aijWUWvxaPR6uTuyxe8tAj5RL4Sw1+R6NhXUtOsarkGYPmaHdBDvuXh2DIN/uA== - dependencies: - "@types/react" "*" - "@types/react-router-dom@^5.1.6": version "5.3.2" resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.2.tgz#ebd8e145cf056db5c66eb1dac63c72f52e8542ee" @@ -4268,6 +4268,11 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bignumber.js@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" + integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== + binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -4344,6 +4349,11 @@ bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^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.1.2, bn.js@^5.2.1: + 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== + body-parser@1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" @@ -4569,6 +4579,11 @@ buffer-indexof@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== +buffer-reverse@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" + integrity sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg== + buffer-to-arraybuffer@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" @@ -5376,6 +5391,11 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +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== + crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" @@ -6918,6 +6938,13 @@ eth-tx-summary@^3.1.2: ethereumjs-vm "^2.6.0" through2 "^2.0.3" +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + ethereum-checksum-address@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/ethereum-checksum-address/-/ethereum-checksum-address-0.0.2.tgz#46fcb2d962dacd1ed49d7b464408ec26fd183209" @@ -7101,6 +7128,17 @@ ethereumjs-util@^6.0.0: ethjs-util "0.1.6" rlp "^2.2.3" +ethereumjs-util@^7.1.0: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" @@ -9594,7 +9632,7 @@ js-sha3@0.5.7: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= -js-sha3@0.8.0: +js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -9815,7 +9853,7 @@ jsprim@^1.2.2: array-includes "^3.1.3" object.assign "^4.1.2" -keccak256@^1.0.0: +keccak256@^1.0.0, keccak256@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/keccak256/-/keccak256-1.0.6.tgz#dd32fb771558fed51ce4e45a035ae7515573da58" integrity sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw== @@ -10345,6 +10383,17 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" +merkletreejs@^0.2.32: + version "0.2.32" + resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.2.32.tgz#cf1c0760e2904e4a1cc269108d6009459fd06223" + integrity sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ== + dependencies: + bignumber.js "^9.0.1" + buffer-reverse "^1.0.1" + crypto-js "^3.1.9-1" + treeify "^1.1.0" + web3-utils "^1.3.4" + mersenne-twister@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz#f916618ee43d7179efcf641bec4531eb9670978a" @@ -12675,32 +12724,6 @@ react-error-overlay@^6.0.9: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.10.tgz#0fe26db4fa85d9dbb8624729580e90e7159a59a6" integrity sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA== -react-fast-compare@^3.1.1, react-fast-compare@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" - integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== - -react-helmet-async@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" - integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== - dependencies: - "@babel/runtime" "^7.12.5" - invariant "^2.2.4" - prop-types "^15.7.2" - react-fast-compare "^3.2.0" - shallowequal "^1.1.0" - -react-helmet@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" - integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== - dependencies: - object-assign "^4.1.1" - prop-types "^15.7.2" - react-fast-compare "^3.1.1" - react-side-effect "^2.1.0" - react-i18next@^11.15.3: version "11.15.3" resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.15.3.tgz#7608fb3cacc02ac75a62fc2d68b579f140b198dd" @@ -12850,11 +12873,6 @@ react-scripts@4.0.0: optionalDependencies: fsevents "^2.1.3" -react-side-effect@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.2.tgz#dc6345b9e8f9906dc2eeb68700b615e0b4fe752a" - integrity sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw== - react-swipeable@^6.1.0: version "6.2.0" resolved "https://registry.yarnpkg.com/react-swipeable/-/react-swipeable-6.2.0.tgz#057271cb7a6fb4af9d2a3f6d80ccdf33e2f64d47" @@ -13393,7 +13411,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.0.0, rlp@^2.2.3: +rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4: version "2.2.7" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== @@ -14859,6 +14877,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -15492,6 +15515,19 @@ web3-utils@1.2.1: underscore "1.9.1" utf8 "3.0.0" +web3-utils@^1.3.4: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.0.tgz#0a506f8c6af9a2ad6ba79689892662769534fc03" + integrity sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ== + dependencies: + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + web3modal@^1.9.5: version "1.9.5" resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.5.tgz#a1d6351a11358b376af5772f79f3dcdba6c38d1b" From 2509d42b204f41d5ed749c1b25ea1382fa326ef0 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 4 Oct 2022 00:04:45 -0600 Subject: [PATCH 146/278] hide sewage fruit --- src/components/Sidebar.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 21aad67..26e5df5 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -1,6 +1,6 @@ import React, { useContext, useState } from "react"; import Nav from "react-bootstrap/esm/Nav"; -import { GiSpottedMushroom } from "react-icons/gi"; +// import { GiSpottedMushroom } from "react-icons/gi"; import "../styles/sidebar.scss"; import { Link, useLocation } from "react-router-dom"; import { Web3ModalContext } from "../state/Web3ModalContext"; @@ -134,7 +134,7 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { )} - + {/* { Sewagefruit - + */} Date: Tue, 4 Oct 2022 00:11:39 -0600 Subject: [PATCH 147/278] fixed index --- public/index.html | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/public/index.html b/public/index.html index 2a9579a..8b19f16 100644 --- a/public/index.html +++ b/public/index.html @@ -49,20 +49,18 @@ - + - + TCAP - By Cryptex Finance From f74b7483ea842034e0458c1a57bd9add0be02d50 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 4 Oct 2022 00:19:54 -0600 Subject: [PATCH 148/278] changed index.html --- public/index.html | 149 ++++++++++++++++++++-------------------------- 1 file changed, 66 insertions(+), 83 deletions(-) diff --git a/public/index.html b/public/index.html index 8b19f16..e0ace96 100644 --- a/public/index.html +++ b/public/index.html @@ -1,108 +1,91 @@ - - - - - - - - - - - - + + + + + + + - - - - - + + + + + - - - - - - - - - - - + + + + + + TCAP - By Cryptex Finance + - gtag("config", "G-WKTME4J30E"); - - TCAP - By Cryptex Finance - - - -
- - -<<<<<<< HEAD - - - + + + + + From c20da9809e3baf59f0ccb3f05a36a4341a912262 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 4 Oct 2022 10:29:54 -0600 Subject: [PATCH 149/278] delete beta warning --- src/components/Warnings.tsx | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/src/components/Warnings.tsx b/src/components/Warnings.tsx index fcafa8b..2f12f8e 100644 --- a/src/components/Warnings.tsx +++ b/src/components/Warnings.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import Alert from "react-bootstrap/esm/Alert"; import { useLocation } from "react-router-dom"; import { useTranslation } from "react-i18next"; @@ -7,26 +7,9 @@ const Warnings = () => { const { t } = useTranslation(); const location = useLocation(); const [vaultWarning, setVaultWarning] = useState(true); - const [showBeta, setShowBeta] = useState(true); - - useEffect(() => { - const savedAlert = localStorage.getItem("alert"); - if (savedAlert) setShowBeta(false); - }, [location]); return ( <> - {showBeta && ( - { - setShowBeta(false); - localStorage.setItem("alert", "false"); - }} - dismissible - > - 💀 {t("warning")} - - )} {vaultWarning && location.pathname === "/vault" && ( { From d68996f9d0de200f05630907c80bcb4456d0866a Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 5 Oct 2022 11:54:23 -0600 Subject: [PATCH 150/278] added rewards end date --- src/components/Farm/UniV3Rewards/Apr.tsx | 2 +- src/components/Farm/UniV3Rewards/Rewards.tsx | 39 +- src/components/Governance/Delegators.tsx | 2 +- src/components/Governance/StakerStats.tsx | 9 +- src/styles/app.scss | 2 + src/styles/delegators.scss | 6 +- src/styles/farm.scss | 28 +- src/styles/mint2.scss | 799 ------------------- 8 files changed, 69 insertions(+), 818 deletions(-) delete mode 100644 src/styles/mint2.scss diff --git a/src/components/Farm/UniV3Rewards/Apr.tsx b/src/components/Farm/UniV3Rewards/Apr.tsx index c26f359..47951d4 100644 --- a/src/components/Farm/UniV3Rewards/Apr.tsx +++ b/src/components/Farm/UniV3Rewards/Apr.tsx @@ -130,7 +130,7 @@ const Apr = ({ incentive, stakerContractRead }: props) => { <> {apr >= 0 ? ( { + if (ethTcapIncentive.length > 0) { + const d = new Date(ethTcapIncentive[0].endTime * 1000); + return d.toLocaleDateString(); + } + return "-"; + }; + const withdraw = async (lpTokenId: number) => { if (stakerContract) { try { @@ -320,17 +328,12 @@ const Rewards = ({
APR:
-
- -
-
- Available to Claim - In order to claim rewards, you need to unstake your token. + Incentive ends on {incentiveEndDate()} } > @@ -338,8 +341,24 @@ const Rewards = ({ ? - : -
+
+ +
+
Available to Claim
+ + In order to claim rewards, you need to unstake your token. + + } + > + + +
:
Current APR:
+
+
End Date:
+ {incentiveEndDate()} +
Create Position diff --git a/src/components/Governance/Delegators.tsx b/src/components/Governance/Delegators.tsx index de63126..8652089 100644 --- a/src/components/Governance/Delegators.tsx +++ b/src/components/Governance/Delegators.tsx @@ -82,12 +82,12 @@ const Delegators = ({ currentSignerAddress }: props) => { setKeepersInfo(responseJson); }) .catch((error) => { - console.error("Error getting all"); console.error(error); setKeepersInfo([]); }); }; loadKeepers(); + if (FEATURES.KEEPERS_API) { loadKeepersFromDB(); } else { diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 8a8bc47..03767da 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -25,6 +25,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro const [rewards, setRewards] = useState("0.0"); const [waitTime, setWaitTime] = useState(604800); const [lastStakeDate, setLastStakeDate] = useState(); + const [periodEnds, setPeriodEnds] = useState(new Date()); useEffect(() => { async function load() { @@ -39,19 +40,23 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro currentSignerAddress ); const currentWaitTimeCall = await governance.delegatorFactoryRead?.waitTime(); + const currentPeriodEndsCall = await governance.delegatorFactoryRead?.periodFinish(); + // @ts-ignore - const [totalSupply, currentStake, currentReward, currentWaitTime] = + const [totalSupply, currentStake, currentReward, currentWaitTime, currentPeriodEnds] = await signer.ethcallProvider?.all([ totalSupplyCall, currentStakeCall, currentRewardCall, currentWaitTimeCall, + currentPeriodEndsCall, ]); setTotalStaked(ethers.utils.formatEther(totalSupply)); setStake(ethers.utils.formatEther(currentStake)); setRewards(ethers.utils.formatEther(currentReward)); currentWT = parseInt(currentWaitTime.toString()); setWaitTime(currentWT); + setPeriodEnds(new Date(currentPeriodEnds.toNumber() * 1000)); } } load(); @@ -108,6 +113,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro
{t("governance.staked-reward")} APREnd Date
{apy()} {periodEnds.toLocaleDateString()} )} diff --git a/src/components/MushroomNft/Sewagefruit.tsx b/src/components/MushroomNft/Sewagefruit.tsx index d54788e..8523b3d 100644 --- a/src/components/MushroomNft/Sewagefruit.tsx +++ b/src/components/MushroomNft/Sewagefruit.tsx @@ -31,6 +31,7 @@ type UserStatusType = { const SewageFruit = () => { const { t } = useTranslation(); // const { isInitialized, Moralis } = useMoralis(); + const revealedDate = new Date(1667245715000); const currentNetwork = useContext(NetworkContext); const signer = useContext(SignerContext); const mushroom = useContext(MushroomNftContext); @@ -257,8 +258,8 @@ const SewageFruit = () => { return (

Sewage Fruitz MINTED. It will be revealed on{" "} - {mintPeriodEnd.toLocaleString()}. You can check out - the collection{" "} + {revealedDate.toLocaleDateString()}. You can check + out the collection{" "} Date: Tue, 1 Nov 2022 09:22:12 -0600 Subject: [PATCH 172/278] testing typeform --- package.json | 1 + src/components/MushroomNft/Sewagefruit.tsx | 3 ++- yarn.lock | 13 +++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 4566763..555cd66 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", + "@typeform/embed-react": "^2.1.0", "@types/jest": "^26.0.15", "@types/node": "^14.14.2", "@types/react": "^16.9.53", diff --git a/src/components/MushroomNft/Sewagefruit.tsx b/src/components/MushroomNft/Sewagefruit.tsx index 8523b3d..494456e 100644 --- a/src/components/MushroomNft/Sewagefruit.tsx +++ b/src/components/MushroomNft/Sewagefruit.tsx @@ -3,6 +3,7 @@ import Button from "react-bootstrap/Button"; import Card from "react-bootstrap/esm/Card"; import Spinner from "react-bootstrap/Spinner"; import { useTranslation } from "react-i18next"; +// import { Widget } from "@typeform/embed-react"; import "../../styles/sewagefruit.scss"; import Loading from "../Loading"; import SignerContext from "../../state/SignerContext"; @@ -359,7 +360,7 @@ const SewageFruit = () => { Connect your wallet to see if you are eligible to mint a Sewage Fruit. If you aren’t eligible, public mint will be available on {mintPeriodEnd.toLocaleDateString()}.

- )} + )} diff --git a/yarn.lock b/yarn.lock index 3c19775..6ec8ac2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2273,6 +2273,19 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@typeform/embed-react@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@typeform/embed-react/-/embed-react-2.1.0.tgz#a99a4ddbec0d0259635a0a14d513fe2c975ff94f" + integrity sha512-usjuo7gVbf/GdcAUxfVV5f0/VbSikdJaw2wYkSSaWQFVrgFewZ3yowhjSuJCTcOsOKwAb2IrTB+kHvNHNrJMlQ== + dependencies: + "@typeform/embed" "2.0.1" + fast-deep-equal "^3.1.3" + +"@typeform/embed@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@typeform/embed/-/embed-2.0.1.tgz#073f238ac3b05369a5d72f55e7bfc85db66887af" + integrity sha512-FeYgDtUAhFrCD7L7iAO65jzLUoPVXRbNjsXe7YQLgLinGpLeVXuwuOuzYagrVl3IQ3Ykmi4sA2LZr29LaMTA7w== + "@types/aria-query@^4.2.0": version "4.2.2" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" From e42c62a4014a37717301182f6b5f3f424dfedaa0 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 1 Nov 2022 21:03:03 -0600 Subject: [PATCH 173/278] upgrading react --- package.json | 12 +- src/App.tsx | 4 - .../Farm/UniV3Rewards/ClaimReward.tsx | 8 +- src/components/Farm/UniV3Rewards/Rewards.tsx | 8 +- src/components/Farm/index.tsx | 62 +- src/components/Faucet.tsx | 189 ------ src/components/Governance.tsx | 547 ------------------ src/components/Governance/Delegators.tsx | 2 +- src/components/Governance/KeeperForm.tsx | 4 +- src/components/Governance/ProfileCard.tsx | 304 +++++----- src/components/Governance/StakerStats.tsx | 4 +- src/components/Governance/common.tsx | 2 +- src/components/Graph.tsx | 497 ---------------- src/components/Header.tsx | 2 +- src/components/Pool.tsx | 293 ---------- src/components/Vault/Mint.tsx | 80 ++- src/components/Vault/Monitoring/Liquidate.tsx | 26 +- src/components/Vault/Monitoring/Vaults.tsx | 31 +- src/components/Vault/Monitoring/index.tsx | 47 +- src/components/Vault/Vault.tsx | 14 +- src/components/Warnings.tsx | 4 +- src/components/Welcome/Protocol.tsx | 48 +- src/components/Welcome/Summary.tsx | 56 +- src/components/modals/Stake.tsx | 20 +- src/index.tsx | 10 +- yarn.lock | 144 ++--- 26 files changed, 496 insertions(+), 1922 deletions(-) delete mode 100644 src/components/Faucet.tsx delete mode 100644 src/components/Governance.tsx delete mode 100644 src/components/Graph.tsx delete mode 100644 src/components/Pool.tsx diff --git a/package.json b/package.json index 4566763..86a91bd 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "license": "MIT", "dependencies": { - "@apollo/client": "^3.2.5", + "@apollo/client": "^3.7.1", "@davatar/react": "^1.8.1", "@ethersproject/abi": "5.0.0", "@portis/web3": "^2.0.0-beta.59", @@ -14,8 +14,8 @@ "@testing-library/user-event": "^12.1.10", "@types/jest": "^26.0.15", "@types/node": "^14.14.2", - "@types/react": "^16.9.53", - "@types/react-dom": "^16.9.8", + "@types/react": "^18.0.24", + "@types/react-dom": "^18.0.8", "@walletconnect/web3-provider": "^1.3.6", "authereum": "^0.1.0", "bootstrap": "^4.5.3", @@ -30,9 +30,9 @@ "keccak256": "^1.0.6", "merkletreejs": "^0.2.32", "node-sass": "^4.14.1", - "react": "^17.0.1", - "react-bootstrap": "^1.4.0", - "react-dom": "^17.0.1", + "react": "^18.0.0", + "react-bootstrap": "^2.5.0", + "react-dom": "^18.0.0", "react-i18next": "^11.15.3", "react-icons": "^4.3.1", "react-number-format": "^4.4.1", diff --git a/src/App.tsx b/src/App.tsx index 4654aa1..efc5879 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -16,7 +16,6 @@ import Header from "./components/Header"; import Sidebar from "./components/Sidebar"; import Topbar from "./components/Topbar"; import WelcomeWrapper from "./components/Welcome/index"; -import Graph from "./components/Graph"; import { Vault, Monitoring } from "./components/Vault"; import Delegators from "./components/Governance/Delegators"; import MushroomNft from "./components/MushroomNft"; @@ -945,9 +944,6 @@ const App = () => { - - - diff --git a/src/components/Farm/UniV3Rewards/ClaimReward.tsx b/src/components/Farm/UniV3Rewards/ClaimReward.tsx index 4d4d247..d02464c 100644 --- a/src/components/Farm/UniV3Rewards/ClaimReward.tsx +++ b/src/components/Farm/UniV3Rewards/ClaimReward.tsx @@ -80,14 +80,16 @@ const ClaimReward = ({ > - {t("farming.univ3.claim-reward")} + <>{t("farming.univ3.claim-reward")}
- {t("farming.univ3.amount-claim")} + + <>{t("farming.univ3.amount-claim")} + MAX @@ -105,7 +107,7 @@ const ClaimReward = ({ diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index a451f2f..2a1b2ef 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -201,15 +201,15 @@ const Rewards = ({ }); }; - const { loading, data, error, refetch } = useQuery(OWNER_POSITIONS, { + const { loading, refetch } = useQuery(OWNER_POSITIONS, { fetchPolicy: "no-cache", pollInterval: 90000, notifyOnNetworkStatusChange: true, variables: { owner: ownerAddress.toLowerCase() }, - onError: () => { + onError: (error) => { console.log(error); }, - onCompleted: () => { + onCompleted: (data: any) => { if (signer.signer && ownerAddress !== "") { loadData(data); setFirstLoad(false); @@ -271,7 +271,7 @@ const Rewards = ({ className=" ml-4 claim" disabled={btnDisabled} > - {t("claim")} + <>{t("claim")} ); }; diff --git a/src/components/Farm/index.tsx b/src/components/Farm/index.tsx index fcaabf5..421c206 100644 --- a/src/components/Farm/index.tsx +++ b/src/components/Farm/index.tsx @@ -404,22 +404,34 @@ const Farm = () => { return (
-

{t("farming.farming")}

{" "} +

+ <>{t("farming.farming")} +

{" "} {isInLayer1(currentNetwork.chainId) && } -

{t("farming.liquidity")}

+

+ <>{t("farming.liquidity")} +

- - + + + -

- - {" "} -

-

Total Supply

- - -

- - {" "} -

-

Quorum Required

- - -

- - -

-

Proposal Threshold

- - -

- {" "} - days -

-

Voting Period

- - - - - {address !== "" ? ( - -
-

Balance

-

- {noDelegate ? ( - <> - ) : ( - <> - Delegated Account {address} - - )} -

-
- -
-

- - -

-

CTX Balance

- - - {currentVotes !== "0" && currentVotes !== "0.0" && ( - <> - - -

- - -

-

Delegated Votes

- - - - )} -
- - {" "} - - ) : ( - -
-

Connect Your Account

-

Vote and delegate with your CTX tokens connecting your account

-
- -
- - - - - )} - - - -

Proposals

-

Delegate CTX to yourself or others, to vote on the future of the protocol.

- -
- {t("description")}{t("balance")}{t("stake")} + <>{t("description")} + + <>{t("balance")} + + <>{t("stake")} +
-
{t("farming.unlocked")}
+
+ <>{t("farming.unlocked")} +
{ trigger={["hover", "click"]} overlay={ - {t("farming.unlocked-info")} + <>{t("farming.unlocked-info")} } > @@ -438,7 +450,9 @@ const Farm = () => {
-
{t("farming.locked")}
+
+ <>{t("farming.locked")} +
{ trigger={["hover", "click"]} overlay={ - {t("farming.locked-info")} + <>{t("farming.locked-info")} } > @@ -471,7 +485,9 @@ const Farm = () => { rel="noreferrer" href={`${lpURL}/#/add/${tokens.tcapToken?.address}/ETH`} > - {t("farming.eth-tcap-pool")}
SushiSwap + <> + {t("farming.eth-tcap-pool")}
SushiSwap +
@@ -525,10 +541,10 @@ const Farm = () => { {address === "" ? ( <> ) : ( @@ -541,7 +557,7 @@ const Farm = () => { claimRewards("ETHPOOL"); }} > - {t("claim")} + <>{t("claim")} ) : ( )} )} @@ -578,7 +594,9 @@ const Farm = () => { rel="noreferrer" href={`${lpURL}/#/add/${tokens.ctxToken?.address}/ETH`} > - {t("farming.eth-ctx-pool")}
SushiSwap + <> + {t("farming.eth-ctx-pool")}
SushiSwap +
@@ -634,13 +652,13 @@ const Farm = () => { {address === "" ? ( <> ) : ( @@ -668,7 +686,7 @@ const Farm = () => { claimVest("CTXPOOL"); }} > - {t("claim-vest")} + <>{t("claim-vest")} ) : ( )} )} diff --git a/src/components/Faucet.tsx b/src/components/Faucet.tsx deleted file mode 100644 index 2981d9d..0000000 --- a/src/components/Faucet.tsx +++ /dev/null @@ -1,189 +0,0 @@ -import React, { useState, useContext } from "react"; -import Button from "react-bootstrap/esm/Button"; -import Card from "react-bootstrap/esm/Card"; -import Form from "react-bootstrap/esm/Form"; -import InputGroup from "react-bootstrap/esm/InputGroup"; -import { ethers } from "ethers"; -import TokensContext from "../state/TokensContext"; -import "../styles/faucet.scss"; -import { isValidAddress, errorNotification } from "../utils/utils"; - -const Faucet = () => { - const tokens = useContext(TokensContext); - const [walletAddress, setWalletAddress] = useState(""); - const [amount, setAmount] = useState(""); - - const onChangeWallet = (event: React.ChangeEvent) => { - setWalletAddress(event.target.value); - }; - - const onChangeAmount = (event: React.ChangeEvent) => { - setAmount(event.target.value); - }; - - const printDAI = async (event: React.MouseEvent) => { - event.preventDefault(); - if (tokens) { - const validAddress = await isValidAddress(walletAddress); - if (validAddress && tokens.daiToken) { - if (parseFloat(amount) < 1000) { - const value = ethers.utils.parseEther(amount.toString()); - await tokens.daiToken.mint(validAddress, value); - setWalletAddress(""); - setAmount(""); - } else { - errorNotification("Mint amount too high, try 1000 DAI"); - } - } - } - }; - - const printWBTC = async (event: React.MouseEvent) => { - event.preventDefault(); - if (tokens) { - const validAddress = await isValidAddress(walletAddress); - if (validAddress && tokens.wbtcToken) { - if (parseFloat(amount) <= 1) { - const value = ethers.utils.parseEther(amount.toString()); - await tokens.wbtcToken.mint(validAddress, value); - } else { - errorNotification("Mint amount too high, try 1 WBTC"); - } - - setWalletAddress(""); - setAmount(""); - } - } - }; - - const wrapETH = async (event: React.MouseEvent) => { - event.preventDefault(); - if (tokens) { - const validAddress = await isValidAddress(walletAddress); - if (validAddress && tokens.wethToken) { - const value = ethers.utils.parseEther(amount.toString()); - await tokens.wethToken.deposit({ value }); - setWalletAddress(""); - setAmount(""); - } - } - }; - - return ( -
-
-

Faucet

-
- -
-

Print DAI

-

Fake DAI will be created

-
- - - Wallet Address - - - - - - Amount to Print - - - - - - -
- -
-

Print WBTC

-

Fake WBTC will be created

-
-
- - Wallet Address - - - - - - Amount to Print - - - - - -
-
- -
-

Wrap ETH

-

You ETH will be turned into WETH

-
-
- - Wallet Address - - - - - - Amount to Print - - - - - - -
-
-
-
-
- ); -}; - -export default Faucet; diff --git a/src/components/Governance.tsx b/src/components/Governance.tsx deleted file mode 100644 index dc70ae8..0000000 --- a/src/components/Governance.tsx +++ /dev/null @@ -1,547 +0,0 @@ -import React, { useContext, useEffect, useState } from "react"; -import Card from "react-bootstrap/esm/Card"; -import Button from "react-bootstrap/esm/Button"; -import Col from "react-bootstrap/esm/Col"; -import Row from "react-bootstrap/esm/Row"; -import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; -import Tooltip from "react-bootstrap/esm/Tooltip"; -import Table from "react-bootstrap/esm/Table"; -import ProgressBar from "react-bootstrap/esm/ProgressBar"; -import { ethers } from "ethers"; -import NumberFormat from "react-number-format"; -import { useQuery, gql } from "@apollo/client"; -import SignerContext from "../state/SignerContext"; -import TokensContext from "../state/TokensContext"; -import OraclesContext from "../state/OraclesContext"; -import GovernanceContext from "../state/GovernanceContext"; -import { Web3ModalContext } from "../state/Web3ModalContext"; -import { makeShortAddress, getProposalStatus, notifyUser, errorNotification } from "../utils/utils"; -import "../styles/governance.scss"; -import { ReactComponent as CtxIcon } from "../assets/images/ctx-coin.svg"; -import Loading from "./Loading"; -import { NewProposal } from "./modals/NewProposal"; -import { Delegate } from "./modals/Delegate"; -import { Vote } from "./modals/Vote"; - -const Governance = () => { - const [address, setAddress] = useState(""); - const [ctxBalance, setCtxBalance] = useState("0"); - const [currentVotes, setCurrentVotes] = useState("0"); - const [isLoading, setIsLoading] = useState(true); - const signer = useContext(SignerContext); - const web3Modal = useContext(Web3ModalContext); - const tokens = useContext(TokensContext); - const oracles = useContext(OraclesContext); - const governance = useContext(GovernanceContext); - const [noDelegate, setNoDelegate] = useState(false); - const [proposals, setProposals] = useState([]); - const [newProposalShow, setNewProposalShow] = useState(false); - const [delegateShow, setDelegateShow] = useState(false); - const [proposerThreshold, setProposerThreshold] = useState("0"); - const [quorumVotes, setQuorumVotes] = useState("0"); - const [currentBlock, setCurrentBlock] = useState(0); - const [currentTimestamp, setCurrentTimestamp] = useState(0); - const [gracePeriod, setGracePeriod] = useState(0); - - // Vote Modal - const [voteShow, setVoteShow] = useState(false); - const [voteProposal, setVoteProposal] = useState(); - const [voteFor, setVoteFor] = useState(0); - const [voteAgainst, setVoteAgainst] = useState(0); - const [voteEndTime, setVoteEndTime] = useState(""); - const [voteStatus, setVoteStatus] = useState(""); - - const etherscanURL = process?.env?.REACT_APP_ETHERSCAN; - - function clickVote( - proposal: any, - forVote: number, - against: number, - endTime: string, - status: string - ) { - setVoteProposal(proposal); - setVoteFor(forVote); - setVoteAgainst(against); - setVoteEndTime(endTime); - setVoteStatus(status); - setVoteShow(true); - } - - const PROPOSALS = gql` - query { - proposals(orderBy: id, orderDirection: desc) { - id - proposer { - id - } - targets - values - signatures - calldatas - status - description - startBlock - endBlock - executionETA - votes { - id - support - votes - } - } - } - `; - - const { data } = useQuery(PROPOSALS); - - const refresh = async () => { - try { - if (signer.signer && tokens.tcapToken && oracles.tcapOracle && tokens.ctxToken) { - const currentAddress = await signer.signer.getAddress(); - const delegateAddress = await tokens.ctxToken.delegates(currentAddress); - if (delegateAddress === ethers.constants.AddressZero) { - setNoDelegate(true); - } else { - setNoDelegate(false); - } - setAddress(makeShortAddress(delegateAddress)); - const currentCtxBalance = await tokens.ctxToken.balanceOf(currentAddress); - const tcapString = ethers.utils.formatEther(currentCtxBalance); - setCtxBalance(tcapString); - const votes = await tokens.ctxToken.getCurrentVotes(currentAddress); - setCurrentVotes(votes.toString()); - } - } catch (error) { - // catch error in case the vault screen is changed - } - }; - - useEffect(() => { - const loadAddress = async () => { - if ( - signer.signer && - tokens.tcapToken && - oracles.tcapOracle && - tokens.ctxToken && - governance.governorAlpha && - governance.timelock - ) { - const currentAddress = await signer.signer.getAddress(); - - const delegateAddress = await tokens.ctxToken.delegates(currentAddress); - if (delegateAddress === ethers.constants.AddressZero) { - setNoDelegate(true); - } else { - setNoDelegate(false); - } - setAddress(makeShortAddress(delegateAddress)); - const currentCtxBalance = await tokens.ctxToken.balanceOf(currentAddress); - const tcapString = ethers.utils.formatEther(currentCtxBalance); - setCtxBalance(tcapString); - const votes = await tokens.ctxToken.getCurrentVotes(currentAddress); - setCurrentVotes(ethers.utils.formatEther(votes)); - const currentThreshold = await governance.governorAlpha.proposalThreshold(); - setProposerThreshold(ethers.utils.formatEther(currentThreshold)); - const currentQuorum = await governance.governorAlpha.quorumVotes(); - setQuorumVotes(ethers.utils.formatEther(currentQuorum)); - const currentGrace = await governance.timelock.GRACE_PERIOD(); - setGracePeriod(currentGrace); - } - if (data) { - const currentProposals: any[] = []; - await data.proposals.forEach((p: any) => { - currentProposals.push(p); - }); - setProposals(currentProposals); - const network = process.env.REACT_APP_NETWORK_NAME; - const provider = ethers.getDefaultProvider(network, { - infura: process.env.REACT_APP_INFURA_ID, - alchemy: process.env.REACT_APP_ALCHEMY_KEY, - }); - const block = await provider.getBlockNumber(); - setCurrentBlock(block); - const timestamp = Date.now(); - setCurrentTimestamp(timestamp); - setIsLoading(false); - } - }; - - loadAddress(); - // eslint-disable-next-line - }, [data]); - - async function queueTransaction(id: number) { - if (governance.governorAlpha) { - try { - const tx = await governance.governorAlpha.queue(id); - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001) { - errorNotification("Transaction rejected"); - } - } - } - } - - async function executeTransaction(id: number) { - if (governance.governorAlpha) { - try { - const tx = await governance.governorAlpha.execute(id); - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001) { - errorNotification("Transaction rejected"); - } - } - } - } - - if (isLoading) { - return ; - } - - return ( -
-
-

Governance Portal

- -
- - - - - - - - - - - {proposals.map((proposal, i) => { - let forVotes = 0; - let againstVotes = 0; - let { - id, - description, - status, - executionETA, - startBlock, - endBlock, - votes, - proposer, - } = proposal; - votes.forEach((vote: any) => { - if (vote.support) { - forVotes += parseInt(vote.votes); - } else { - againstVotes += parseInt(vote.votes); - } - }); - - const denominator = forVotes + againstVotes; - const forRate = denominator !== 0 ? (forVotes / denominator) * 100 : 0; - const againstRate = - denominator !== 0 ? (againstVotes / denominator) * 100 : 0; - - const timeBlock = endBlock - currentBlock; - const eta = executionETA || 0; - const endTimeMili = currentTimestamp + timeBlock * 13 * 1000; - let endTime = new Date(endTimeMili).toDateString(); - if (status !== "EXECUTED") { - status = getProposalStatus( - startBlock, - endBlock, - currentBlock, - forVotes, - againstVotes, - parseInt(quorumVotes), - eta, - gracePeriod - ); - } - - if (eta !== 0) { - endTime = new Date(eta * 1000).toDateString(); - } - - const animated = status === "PENDING" || status === "ACTIVE"; - const row = ( - - - - - - - - - ); - return row; - })} - -
#DescriptionProposerVotesStatus -
{id}{description} - - {makeShortAddress(proposer.id)} - - - - 👍: {forVotes.toLocaleString()} -
👎: {againstVotes.toLocaleString()} - - } - > - - - - -
-
- Closes on {endTime}} - > - - {status.charAt(0) + status.slice(1).toLowerCase()} - {(status === "PENDING" || - status === "ACTIVE" || - status === "QUEUED") && } - - - - {(() => { - switch (status) { - case "SUCCEEDED": - return ( - - ); - case "READY": - return ( - - ); - default: - return ( - - ); - } - })()} -
-
- - -
-
- setDelegateShow(false)} - refresh={() => refresh()} - /> - setNewProposalShow(false)} - refresh={() => refresh()} - /> - { - setVoteShow(false); - }} - proposal={voteProposal} - forVote={voteFor} - against={voteAgainst} - endTime={voteEndTime} - status={voteStatus} - /> -
- ); -}; -export default Governance; diff --git a/src/components/Governance/Delegators.tsx b/src/components/Governance/Delegators.tsx index 8652089..e186c08 100644 --- a/src/components/Governance/Delegators.tsx +++ b/src/components/Governance/Delegators.tsx @@ -172,7 +172,7 @@ const Delegators = ({ currentSignerAddress }: props) => { {FEATURES.KEEPERS_API && (
)} diff --git a/src/components/Governance/KeeperForm.tsx b/src/components/Governance/KeeperForm.tsx index 1a7f382..7f5da41 100644 --- a/src/components/Governance/KeeperForm.tsx +++ b/src/components/Governance/KeeperForm.tsx @@ -398,13 +398,11 @@ const KeeperForm = ({ size={120} /> )} - {imageError} diff --git a/src/components/Governance/ProfileCard.tsx b/src/components/Governance/ProfileCard.tsx index fe32888..2d4ef4a 100644 --- a/src/components/Governance/ProfileCard.tsx +++ b/src/components/Governance/ProfileCard.tsx @@ -65,7 +65,7 @@ const ProfileCard = ({ // @ts-ignore // eslint-disable-next-line react-hooks/exhaustive-deps - useEffect(async () => { + useEffect(() => { async function getProvider() { if (mediaQuery) { setBriefLength(143); @@ -90,7 +90,7 @@ const ProfileCard = ({ setActionText("Stake & Delegate"); } - await getProvider(); + getProvider(); // eslint-disable-next-line }, [signer, delegator, governance, mediaQuery]); @@ -159,169 +159,165 @@ const ProfileCard = ({ }; return ( - <> - -
- - -
{t("staked")} - {t("last")} {t("staked")} + <> + {t("last")} {t("staked")} + {t("governance.staked-reward")} APR
- - - - - - - - - - - - - - - - - {" "} - - - - - - - - - -
- {t("pools.available")}{t("pools.liquidity")} -
- - - - - ETH/TCAP
- SushiSwap -
- - - -
- $ - {" "} - - -
- - - - - ETH/CTX
- SushiSwap -
- - - -
- $ - {" "} - - -
- - - - - ETH/TCAP
- UniSwap V2 -
-
- $ - {" "} - - -
- - - -
-
- ); -}; -export default Farm; diff --git a/src/components/Vault/Mint.tsx b/src/components/Vault/Mint.tsx index a81e365..834e73f 100644 --- a/src/components/Vault/Mint.tsx +++ b/src/components/Vault/Mint.tsx @@ -1362,11 +1362,11 @@ const Mint = ({ address, t }: props) => {
- {t("vault.collateral.add", { collateral: selectedVault })} + <>{t("vault.collateral.add", { collateral: selectedVault })} - {t("max")} + <>{t("max")} @@ -1379,15 +1379,13 @@ const Mint = ({ address, t }: props) => { onFocus={onFocusAddCollateral} onBlur={onBlurAddCollateral} /> - - - + { - {t("vault.collateral.remove", { collateral: selectedVault })} + <>{t("vault.collateral.remove", { collateral: selectedVault })} - {t("max-safe")} + <>{t("max-safe")} @@ -1419,15 +1417,13 @@ const Mint = ({ address, t }: props) => { onFocus={onFocusRemoveCollateral} onBlur={onBlurRemoveCollateral} /> - - - + {
-

{t("vault.debt.title")}

+

+ <>{t("vault.debt.title")} +

@@ -1477,7 +1475,7 @@ const Mint = ({ address, t }: props) => { {t("vault.debt.mint")} - {t("max-safe")} + <>{t("max-safe")} @@ -1490,16 +1488,14 @@ const Mint = ({ address, t }: props) => { onFocus={onFocusMint} onBlur={onBlurMint} /> - - - + { {t("vault.debt.burn")} - {t("max")} + <>{t("max")} @@ -1529,15 +1525,9 @@ const Mint = ({ address, t }: props) => { onFocus={onFocusBurn} onBlur={onBlurBurn} /> - - - + { /> - {t("vault.debt.fee")}:{" "} + <>{t("vault.debt.fee")}: ( - {t("monitoring.reward-info")} + <>{t("monitoring.reward-info")} ); const tcapAmountHelp = () => ( - {t("monitoring.tcap-amount-info")} + <>{t("monitoring.tcap-amount-info")} ); const netRewardHelp = () => ( - {t("monitoring.net-reward-info1")}:
- {t("monitoring.net-reward-info2")} + <> + {t("monitoring.net-reward-info1")}:
+ {t("monitoring.net-reward-info2")} +
); @@ -282,7 +284,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = > - {t("monitoring.liquidate-vault")} + <>{t("monitoring.liquidate-vault")} @@ -290,7 +292,9 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = <> - {t("amount-tcap")} + + <>{t("amount-tcap")} + MIN REQUIRED @@ -318,7 +322,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) =
- {t("monitoring.reward")}:{" "} + <>{t("monitoring.reward")}:
- {t("monitoring.reward")} + <>{t("monitoring.reward")} {helpToolTip(0)} - {t("required-tcap")} + <>{t("required-tcap")} {helpToolTip(1)} Burn Fee - {t("monitoring.net-reward")} + <>{t("monitoring.net-reward")} {helpToolTip(3)}
Vault Id - {t("status")} + <>{t("status")} - Empty: {t("monitoring.empty-info")}
- Ready: {t("monitoring.ready-info")}
- Active: {t("monitoring.active-info")}
- Liquidation:{" "} - {t("monitoring.liquidation-info")}
+ <> + Empty: {t("monitoring.empty-info")}
+ Ready: {t("monitoring.ready-info")}
+ Active: {t("monitoring.active-info")}
+ Liquidation:{" "} + {t("monitoring.liquidation-info")}
+ } > @@ -190,35 +192,40 @@ export const Vaults = ({
- {t("collateral")} + <>{t("collateral")} - {t("collateral")} (USD) + <>{t("collateral")} (USD)
- {t("debt")} + + + <>{t("debt")} +
{t("debt")} (USD) + <>{t("debt")} (USD) + - {t("monitoring.ratio")} + <>{t("monitoring.ratio")} - {t("monitoring.net-reward")} + <>{t("monitoring.net-reward")} diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx index d3bf622..648db43 100644 --- a/src/components/Vault/Monitoring/index.tsx +++ b/src/components/Vault/Monitoring/index.tsx @@ -736,15 +736,17 @@ export const Monitoring = () => { setFilteringRatios(false); }; - const { loading, data, error } = useQuery(vaultsQuery, { + const { loading } = useQuery(vaultsQuery, { fetchPolicy: "no-cache", notifyOnNetworkStatusChange: true, skip: skipQuery, - onError: () => { + onError: (error) => { console.log(error); }, - onCompleted: () => { - if (pricesUpdated) { + onCompleted: (data: any) => { + console.log("--- graph --"); + console.log(data); + if (pricesUpdated && !isUndefined(data)) { setVaultGraphList(data); loadVaults(data); } @@ -756,9 +758,10 @@ export const Monitoring = () => { if (!pricesUpdated) { loadPrices(); loadRatios(); - } else if (!isUndefined(data)) { - loadVaults(data); } + // else if (!isUndefined(data)) { + // loadVaults(data); + // } }, // eslint-disable-next-line [signer, currentNetwork.chainId, pricesUpdated] @@ -935,29 +938,39 @@ export const Monitoring = () => { -
{t("totals")}
+
+ <>{t("totals")} +
+ + + + + + + + + + + + +
+ <>{t("monitoring.reward")} + {helpToolTip(0)} + + <>{t("required-tcap")} + {helpToolTip(1)} + Burn Fee + <>{t("monitoring.net-reward")} + {helpToolTip(3)} +
${numberFormatStr(rewardUSD, 2, 2)}${numberFormatStr(maxTcapUSD, 2, 2)}${numberFormatStr(burnFeeUsd, 2, 2)}${numberFormatStr(netReward.toFixed(2), 2, 2)}
+ + + + + + ); +}; + +export default Liquidate; diff --git a/src/components/Vaults/monitoring/Pagination.tsx b/src/components/Vaults/monitoring/Pagination.tsx new file mode 100644 index 0000000..8584d1f --- /dev/null +++ b/src/components/Vaults/monitoring/Pagination.tsx @@ -0,0 +1,95 @@ +import React from "react"; +import Pagination from "react-bootstrap/Pagination"; +import { PaginationType } from "../types"; + +type props = { + pagination: PaginationType; + onPageSelected: (pageNumber: number) => void; +}; + +export const VaultPagination = ({ pagination, onPageSelected }: props) => { + const pag = Array.from(Array(pagination.pages).keys()); + const activePag = pagination.current; + + const VaultPages = () => { + const midPages = Array.from(Array(5).keys()); + const midPage = Math.floor(pagination.pages / 2); + midPages[0] = midPage - 2; + midPages[1] = midPage - 1; + midPages[2] = midPage; + midPages[3] = midPage + 1; + midPages[4] = midPage + 2; + + return ( + <> + + {1} + + {pagination.current >= 3 && pagination.current < midPages[0] && } + {pagination.current > 1 && pagination.current < midPages[0] && ( + {pagination.current} + )} + + {midPages.map((item) => ( + onPageSelected(item)} + > + {item} + + ))} + + {pagination.current < pagination.pages && pagination.current > midPages[4] && ( + {pagination.current} + )} + {pagination.current < pagination.pages - 1 && pagination.current > midPages[4] && ( + + )} + onPageSelected(pagination.pages)} + > + {pagination.pages} + + + ); + }; + + return ( + + {pagination.pages >= 10 && ( + onPageSelected(1)} disabled={pagination.previous === 0} /> + )} + onPageSelected(pagination.previous)} + disabled={pagination.previous === 0} + /> + {pagination.pages >= 10 ? ( + + ) : ( + pag.map((item) => ( + onPageSelected(item + 1)} + > + {item + 1} + + )) + )} + onPageSelected(pagination.next)} + disabled={pagination.current === pagination.pages} + /> + {pagination.pages >= 10 && ( + onPageSelected(pagination.pages)} + disabled={pagination.next === 0} + /> + )} + + ); +}; diff --git a/src/components/Vaults/monitoring/Vaults.tsx b/src/components/Vaults/monitoring/Vaults.tsx new file mode 100644 index 0000000..3d5a65f --- /dev/null +++ b/src/components/Vaults/monitoring/Vaults.tsx @@ -0,0 +1,361 @@ +import React, { useState } from "react"; +import Button from "react-bootstrap/esm/Button"; +import Table from "react-bootstrap/Table"; +import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; +import Tooltip from "react-bootstrap/esm/Tooltip"; +import { ethers } from "ethers"; +import { useTranslation } from "react-i18next"; +import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; +import { ReactComponent as SortIcon } from "../../../assets/images/sort.svg"; +import { ReactComponent as SortUpIcon } from "../../../assets/images/sort-up.svg"; +import { ReactComponent as SortDownIcon } from "../../../assets/images/sort-down.svg"; +import Liquidate from "./Liquidate"; +import { PaginationType, VaultsType, VaultToUpdateType } from "../types"; +import { numberFormatStr } from "../../../utils/utils"; +import { + capitalize, + TokenIcon, + sortCollateralDesc, + sortCollateralAsc, + sortCollateralUsdDesc, + sortCollateralUsdAsc, + sortDebtDesc, + sortDebtAsc, + sortRatioDesc, + sortRatioAsc, + sortRewardDesc, + sortRewardAsc, +} from "../common"; + +type dataType = { + currentAddress: string; + vaults: Array; + setVaults: (v: Array) => void; + currentStatus: string; + pagination: PaginationType; + refresh: ( + index: number, + symbol: string, + vaultId: string, + collateral: ethers.BigNumberish, + debt: ethers.BigNumberish + ) => void; + setVaultToUpdate: (initData: VaultToUpdateType) => void; + myVaults: boolean; +}; + +export const Vaults = ({ + currentAddress, + vaults, + setVaults, + currentStatus, + pagination, + refresh, + setVaultToUpdate, + myVaults, +}: dataType) => { + const { t } = useTranslation(); + const [showLiquidate, setShowLiquidate] = useState(false); + const [vaultIndex, setVaultIndex] = useState(-1); + const [liqVault, setLiqVault] = useState(null); + const [collateralSort, setCollateralSort] = useState(0); + const [collateralUsdSort, setCollateralUsdSort] = useState(0); + const [debtSort, setDebtSort] = useState(0); + const [ratioSort, setRatioSort] = useState(0); + const [rewardSort, setRewardSort] = useState(0); + // const [renderReward, setRenderReward] = useState(false); + + const liquidateVault = (index: number, lVault: VaultsType) => { + setVaultIndex(index); + setLiqVault(lVault); + setShowLiquidate(true); + }; + + const updateLiqVault = (collateral: ethers.BigNumberish, debt: ethers.BigNumberish) => { + if (liqVault !== null) { + refresh(vaultIndex, liqVault.collateralSymbol, liqVault.id, collateral, debt); + } + }; + + const resetSortTypes = (current: number) => { + if (current !== 1) { + setCollateralSort(0); + } + if (current !== 2) { + setCollateralUsdSort(0); + } + if (current !== 3) { + setDebtSort(0); + } + if (current !== 4) { + setRatioSort(0); + } + if (current !== 5) { + setRewardSort(0); + } + }; + + const onSortCollateralClick = () => { + const sortType = collateralSort === 1 ? 2 : 1; + if (sortType === 1) { + setVaults(vaults.sort(sortCollateralDesc)); + } else { + setVaults(vaults.sort(sortCollateralAsc)); + } + setCollateralSort(sortType); + resetSortTypes(1); + }; + + const onSortCollateralUsdClick = () => { + const sortType = collateralUsdSort === 1 ? 2 : 1; + if (sortType === 1) { + setVaults(vaults.sort(sortCollateralUsdDesc)); + } else { + setVaults(vaults.sort(sortCollateralUsdAsc)); + } + setCollateralUsdSort(sortType); + resetSortTypes(2); + }; + + const onSortDebtClick = () => { + const sortType = debtSort === 1 ? 2 : 1; + if (sortType === 1) { + setVaults(vaults.sort(sortDebtDesc)); + } else { + setVaults(vaults.sort(sortDebtAsc)); + } + setDebtSort(sortType); + resetSortTypes(3); + }; + + const onSortRatioClick = () => { + const sortType = ratioSort === 1 ? 2 : 1; + if (sortType === 1) { + setVaults(vaults.sort(sortRatioDesc)); + } else { + setVaults(vaults.sort(sortRatioAsc)); + } + setRatioSort(sortType); + resetSortTypes(4); + }; + + const onSortRewardClick = () => { + const sortType = rewardSort === 1 ? 2 : 1; + if (sortType === 1) { + setVaults(vaults.sort(sortRewardDesc)); + } else { + setVaults(vaults.sort(sortRewardAsc)); + } + setRewardSort(sortType); + resetSortTypes(5); + }; + + const sortingIncon = (sortOrder: number) => { + if (sortOrder === 0) { + return ; + } + if (sortOrder === 1) { + return ; + } + return ; + }; + + const statusTag = (index: number, v: VaultsType) => { + if (currentAddress === "") { + return {capitalize(v.status)}; + } + if (v.status === "liquidation") { + return ( + + ); + } + return {capitalize(v.status)}; + }; + + const vaultButtonLink = (index: number, v: VaultsType) => { + const vtu = { + vaultId: v.id, + assetSymbol: "tcap", + collateralSymbol: v.collateralSymbol, + isHardVault: v.isHardVault, + }; + return ( + + ); + }; + + return ( + <> + + + + + + + + + + + {myVaults && currentAddress !== "" && + )} + + + + {vaults.map((v, index) => { + const itemPage = Math.ceil((index + 1) / pagination.itemsPerPage); + return ( + + + + + + + + + {currentStatus === "liquidation" && ( + + )} + {myVaults && v.url !== "" && } + + ); + })} + +
Vault Id + <>{t("status")} + + <> + Empty: {t("monitoring.empty-info")}
+ Ready: {t("monitoring.ready-info")}
+ Active: {t("monitoring.active-info")}
+ Liquidation:{" "} + {t("monitoring.liquidation-info")}
+ + + } + > + +
+
+ <>{t("collateral")} + + + <>{t("collateral")} (USD) + + +
+ + + <>{t("debt")} + + +
+
+ <>{t("debt")} (USD) + + <>{t("monitoring.ratio")} + + } + {currentStatus === "liquidation" && ( + + <>{t("monitoring.net-reward")} + +
{numberFormatStr(v.id, 0, 0)} +
+ {statusTag(index, v)} + {v.isHardVault && Hard mode} +
+
+ + {numberFormatStr(v.collateralValue, 4, 12)} + + } + > +
+ {numberFormatStr(v.collateralValue, 4, 4)} + +
+
+
+
+ ${numberFormatStr(v.collateralUsd, 2, 2)} +
+
+
+ + {numberFormatStr(v.debt, 4, 12)} + + } + > + {numberFormatStr(v.debt, 4, 4)} + +
+
+
+ ${numberFormatStr(v.debtUsd, 2, 2)} +
+
+
+ + Min Ratio: {v.minRatio}% + + } + > + + {v.ratio.toFixed(0)} + {v.ratio === 0 ? "" : "%"} + + +
+
+
+ ${v.netReward.toFixed(2)} +
+
{vaultButtonLink(index, v)}
+ { + setLiqVault(null); + setVaultIndex(-1); + setShowLiquidate(false); + }} + refresh={updateLiqVault} + /> + + ); +}; diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx new file mode 100644 index 0000000..d8550c3 --- /dev/null +++ b/src/components/Vaults/monitoring/index.tsx @@ -0,0 +1,865 @@ +import React, { useContext, useEffect, useRef, useState } from "react"; +import { + Button, + Card, + Col, + Dropdown, + Form, + Row, + ToggleButton, + ToggleButtonGroup, +} from "react-bootstrap/esm"; +import Spinner from "react-bootstrap/Spinner"; +import { FaArrowsAltH } from "react-icons/fa"; +import { ethers, BigNumber } from "ethers"; +import { useLazyQuery, gql } from "@apollo/client"; +import { useTranslation } from "react-i18next"; +import { VaultPagination } from "./Pagination"; +import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; +import { signerContext, hardVaultsContext, networkContext, vaultsContext } from "../../../state"; +import { Vaults } from "./Vaults"; +import { usePrices, useRatios } from "../../../hooks"; +import { + getRatio2, + isArbitrum, + isInLayer1, + isOptimism, + isUndefined, + numberFormatStr, + toUSD, +} from "../../../utils/utils"; +import { capitalize, TokenIcon, getMinRatio, getCollateralPrice, VAULT_STATUS } from "../common"; +import { + DropdownItemType, + PaginationType, + VaultToUpdateType, + VaultsTotalsType, + VaultsType, +} from "../types"; + +const pagDefault = { + previous: 0, + current: 0, + next: 0, + pages: 0, + lastDataPage: 0, + itemsPerPage: 10, + itemsCount: 0, + lastId: "0", +}; + +const totalsDefault = { + vaults: 0, + collateral: "0", + collateralUSD: "0", + debt: "0", + debtUSD: "0", +}; + +type liqVaultsTempType = { + vaultId: string; + vaultType: string; + decimals: number; + hardVault: boolean; +}; + +type props = { + setVaultToUpdate: (initData: VaultToUpdateType) => void; +}; + +const showAllVaults = true; + +const Monitoring = ({ setVaultToUpdate }: props) => { + const { t } = useTranslation(); + const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); + const vaults = useContext(vaultsContext); + const hardVaults = useContext(hardVaultsContext); + const prices = usePrices(); + const ratios = useRatios(); + const [vaultsUpdated, setVaultsUpdated] = useState(false); + const [vaultsTotals, setVaultsTotals] = useState(totalsDefault); + const [vaultList, setVaultList] = useState>([]); + const [vaultGraphList, setVaultGraphList] = useState>([]); + const [pagination, setPagination] = useState(pagDefault); + const [loadMore, setLoadMore] = useState(false); + const [filteringRatios, setFilteringRatios] = useState(false); + const [currentAddress, setCurrentAddress] = useState(""); + const [ownerAddress, setOwnerAddress] = useState(""); + const [radioValue, setRadioValue] = useState("2"); + const [tokenSymbol, setTokenSymbol] = useState("all"); + const [currentStatus, setCurrentStatus] = useState("all"); + const [vaultMode, setVaultMode] = useState("all"); + const [currentMinRatio, setCurrentMinRatio] = useState("0%"); + const [currentMaxRatio, setCurrentMaxRatio] = useState("2500%"); + const [renderTable, setRenderTable] = useState(false); + const ratioRangeDropdown = useRef(null); + const minRatioInput = useRef(null); + const maxRatioInput = useRef(null); + const radios = [ + { name: t("all-vaults"), value: "1" }, + { name: t("my-vaults"), value: "2" }, + ]; + const viewsList = [ + { key: "5", name: "5" }, + { key: "10", name: "10" }, + { key: "15", name: "15" }, + { key: "20", name: "20" }, + { key: "25", name: "25" }, + { key: "30", name: "30" }, + ]; + const statusList = [ + { key: "all", name: "All" }, + { key: VAULT_STATUS.empty, name: "Empty" }, + { key: VAULT_STATUS.ready, name: "Ready" }, + { key: VAULT_STATUS.active, name: "Active" }, + { key: VAULT_STATUS.liquidation, name: "Liquidation" }, + ]; + const modeList = [ + { key: "all", name: "All" }, + { key: "regular", name: "Regular" }, + { key: "hard", name: "Hard" }, + ]; + + const buildFilters = () => { + const weiLimit = "100000000"; + let filter = ""; + let ownerFilter = ""; + let vaultFilter = ""; + let statusFilter = ""; + let modeFilter = ""; + if (radioValue === "2" && ownerAddress !== "") { + ownerFilter = `, owner: "${ownerAddress}"`; + } + if (tokenSymbol !== "all") { + vaultFilter = `tokenSymbol: "${tokenSymbol.toUpperCase()}"`; + } + if (currentStatus !== "all") { + if (currentStatus === "empty") { + statusFilter = `collateral_lt: "${weiLimit}"`; + } + if (currentStatus === "ready") { + statusFilter = `collateral_gte: "${weiLimit}", debt_lt: "${weiLimit}"`; + } + } + if (vaultMode !== "all") { + const isHard = vaultMode === "hard" ? "true" : "false"; + modeFilter = "hardVault: ".concat(isHard); + } + + filter = ownerFilter; + if (vaultFilter !== "") { + filter = filter.concat(`, ${vaultFilter}`); + } + if (statusFilter !== "") { + filter = filter.concat(`, ${statusFilter}`); + } + if (modeFilter !== "") { + filter = filter.concat(`, ${modeFilter}`); + } + if (filter !== "") { + if (loadMore) { + filter = `, where: { blockTS_gt: "${pagination.lastId}" ${filter} }`; + } else { + filter = `, where: { blockTS_gt: "0" ${filter} }`; + } + } + return filter; + }; + + const str = + "query allVaults {" + + `vaults(first: 1000, orderBy: blockTS ${buildFilters()}) {` + + "id " + + "vaultId " + + "owner " + + "collateral " + + "debt " + + "currentRatio " + + "tokenSymbol " + + "hardVault " + + "blockTS " + + "underlyingProtocol { " + + "underlyingToken { " + + "decimals " + + "} " + + "}" + + "} " + + "}"; + + const vaultsQuery = gql` + ${str} + `; + + const isValidRatio = (value: string) => { + let valid = false; + if (!Number.isNaN(value)) { + valid = Number.parseFloat(value) >= 0; + } + return valid; + }; + + const getMinRangeRatio = (): number => { + if (minRatioInput && minRatioInput.current) { + // @ts-ignore + const minRatio = minRatioInput.current.value; + if (isValidRatio(minRatio)) { + return parseFloat(minRatio); + } + } + return 0; + }; + + const getMaxRangeRatio = (): number => { + if (maxRatioInput && maxRatioInput.current) { + // @ts-ignore + const maxRatio = maxRatioInput.current.value; + if (isValidRatio(maxRatio)) { + return parseFloat(maxRatio); + } + } + return 3000; + }; + + const calculateNetRewardUsd = async ( + vaultId: string, + vaultType: string, + isHardVault: boolean, + decimals: number + ) => { + try { + let cVault = vaults.wethVault; + let cVaultRead = vaults.wethVaultRead; + const vaultPrice = getCollateralPrice(prices, vaultType); + if (isHardVault) { + cVault = hardVaults.wethVault; + cVaultRead = hardVaults.wethVaultRead; + } + + switch (vaultType) { + case "DAI": + if (isHardVault) { + cVault = hardVaults.daiVault; + cVaultRead = hardVaults.daiVaultRead; + } else { + cVault = vaults.daiVault; + cVaultRead = vaults.daiVaultRead; + } + break; + case "AAVE": + cVault = vaults.aaveVault; + cVaultRead = vaults.aaveVaultRead; + break; + case "LINK": + cVault = vaults.linkVault; + cVaultRead = vaults.linkVaultRead; + break; + case "SNX": + cVault = vaults.snxVault; + cVaultRead = vaults.snxVaultRead; + break; + case "UNI": + cVault = vaults.uniVault; + cVaultRead = vaults.uniVaultRead; + break; + case "MATIC": + cVault = vaults.maticVault; + cVaultRead = vaults.maticVaultRead; + break; + case "WBTC": + cVault = vaults.wbtcVault; + cVaultRead = vaults.wbtcVaultRead; + break; + case "USDC": + cVault = hardVaults.usdcVault; + cVaultRead = hardVaults.usdcVaultRead; + break; + default: + if (isHardVault) { + cVault = hardVaults.wethVault; + cVaultRead = hardVaults.wethVaultRead; + } else { + cVault = vaults.wethVault; + cVaultRead = vaults.wethVaultRead; + } + break; + } + + const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); + const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); + // @ts-ignore + const [reqTcap, liqReward] = await signer.ethcallProvider?.all([reqTcapCall, liqRewardCall]); + + const reqTcapText = ethers.utils.formatEther(reqTcap); + const liqRewardText = ethers.utils.formatUnits(liqReward, decimals); + const currentLiqFee = await cVault?.getFee(reqTcap); + const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + + return ( + toUSD(liqRewardText, vaultPrice) - + toUSD(reqTcapText, prices.tcapOraclePrice) - + toUSD(ethFee, prices.wethOraclePrice) + ); + } catch (error) { + if (error.code !== "UNPREDICTABLE_GAS_LIMIT") { + console.log(error.code); + } + return 0; + } + }; + + const calculateVaultData = ( + collateralWei: ethers.BigNumberish, + debtWei: ethers.BigNumberish, + symbol: string, + isHardVault: boolean, + decimals: number + ) => { + const collateralText = ethers.utils.formatUnits(collateralWei, decimals); + const debtText = ethers.utils.formatEther(debtWei); + const collateralPrice = getCollateralPrice(prices, symbol); + const collateralUSD = toUSD(collateralText, collateralPrice); + const debtUSD = toUSD(debtText, prices.tcapOraclePrice || "0"); + const minRatio = getMinRatio(ratios, symbol, isHardVault); + + const ratio = getRatio2( + collateralText, + collateralPrice, + debtText, + prices.tcapOraclePrice || "1" + ); + + let status = VAULT_STATUS.liquidation; + if (parseFloat(collateralText) < 0.0000000001) { + status = VAULT_STATUS.empty; + } else if (parseFloat(collateralText) >= 0.0000000001 && parseFloat(debtText) < 0.0000000001) { + status = VAULT_STATUS.ready; + } else if (ratio >= minRatio) { + status = VAULT_STATUS.active; + } + return { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status }; + }; + + const confPagination = (vData: Array, itemsPerPage: number) => { + if (vData.length > 0) { + const lastVaultId = vData[vData.length - 1].blockTS; + const itemsCount = vData.length; + const pages = Math.ceil(itemsCount / itemsPerPage); + const lastDataPage = Math.ceil(itemsCount / itemsPerPage); + const pag = { + previous: 0, + current: 1, + next: 2, + pages, + lastDataPage, + itemsPerPage, + itemsCount, + lastId: lastVaultId, + }; + setPagination(pag); + } else { + setPagination(pagDefault); + } + }; + + const loadVaults = async (vaultsData: any, cStatus: string) => { + const vData = new Array(); + const vLiquidables = new Array(); + const totals = { ...totalsDefault }; + const minFilterRatio = getMinRangeRatio(); + const maxFilterRatio = getMaxRangeRatio(); + + setLoadMore(false); + setFilteringRatios(true); + console.log("Current: ", currentStatus); + // setLiqLoaded(currentStatus !== VAULT_STATUS.liquidation); + // @ts-ignore + vaultsData.vaults.forEach((v) => { + const cVaultDecimals = v.underlyingProtocol.underlyingToken.decimals; + const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = + calculateVaultData(v.collateral, v.debt, v.tokenSymbol, v.hardVault, cVaultDecimals); + + let addVault = true; + if (cStatus === VAULT_STATUS.active || cStatus === VAULT_STATUS.liquidation) { + addVault = cStatus === status; + } + // filter ratio + if (cStatus !== VAULT_STATUS.empty && cStatus !== VAULT_STATUS.ready) { + addVault = addVault && ratio >= minFilterRatio && ratio <= maxFilterRatio; + } + + if (!showAllVaults) { + addVault = v.tokenSymbol === "WETH" || v.tokenSymbol === "DAI"; + } + if (addVault && v.tokenSymbol !== "WBTC") { + let vaultUrl = ""; + const symbol = v.tokenSymbol === "WETH" ? "ETH" : v.tokenSymbol; + if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { + vaultUrl = window.location.origin.concat("/vault/").concat(symbol); + } + if (cStatus === VAULT_STATUS.liquidation) { + vLiquidables.push({ + vaultId: v.vaultId, + vaultType: v.tokenSymbol, + decimals: cVaultDecimals, + hardVault: v.hardVault, + }); + } + + vData.push({ + id: v.vaultId, + collateralSymbol: v.tokenSymbol, + collateralValue: collateralText, + collateralUsd: collateralUSD.toFixed(2), + debt: debtText, + debtUsd: debtUSD.toFixed(2), + ratio, + minRatio: minRatio.toString(), + decimals: cVaultDecimals, + isHardVault: v.hardVault, + netReward: 0, + status, + blockTS: v.blockTS, + url: vaultUrl, + }); + + totals.vaults += 1; + totals.collateral = (parseFloat(totals.collateral) + parseFloat(collateralText)).toFixed(4); + totals.collateralUSD = (parseFloat(totals.collateralUSD) + collateralUSD).toFixed(2); + totals.debt = (parseFloat(totals.debt) + parseFloat(debtText)).toFixed(4); + totals.debtUSD = (parseFloat(totals.debtUSD) + debtUSD).toFixed(2); + } + }); + + if (currentStatus !== VAULT_STATUS.liquidation) { + setVaultList(vData); + setVaultsTotals(totals); + } else { + const loadNetReward = async () => { + vLiquidables.forEach((l, index) => { + calculateNetRewardUsd(l.vaultId, l.vaultType, l.hardVault, l.decimals).then((result) => { + const newA = [...vData]; + newA[index].netReward = result; + setVaultList(newA); + }); + }); + }; + loadNetReward().then(() => { + setVaultList(vData); + setVaultsTotals(totals); + }); + } + + // Set pagination data + confPagination(vData, pagination.itemsPerPage); + setFilteringRatios(false); + }; + + const [loadVaultData, { loading }] = useLazyQuery(vaultsQuery, { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + // skip: skipQuery, + onError: (error) => { + console.log(error); + }, + onCompleted: (data: any) => { + console.log("aqui --"); + if (!isUndefined(data)) { + setVaultGraphList(data); + loadVaults(data, currentStatus); + setVaultsUpdated(true); + } + }, + }); + + useEffect( + () => { + const load = async () => { + if (signer && signer.signer) { + if (!vaultsUpdated) { + console.log("Monitoring"); + const address = await signer.signer.getAddress(); + setCurrentAddress(address); + setOwnerAddress(radioValue === "2" ? address : ""); + loadVaultData(); + } + } + }; + load(); + }, + // eslint-disable-next-line + [signer] + ); + + const tokensSymbols = (): Array => { + const symbols = [{ key: "all", name: "All" }]; + if (isInLayer1(currentNetwork.chainId)) { + symbols.push({ key: "weth", name: "ETH" }); + symbols.push({ key: "dai", name: "DAI" }); + if (showAllVaults) { + symbols.push({ key: "aave", name: "AAVE" }); + symbols.push({ key: "link", name: "LINK" }); + symbols.push({ key: "usdc", name: "USDC" }); + } + } else if (isArbitrum(currentNetwork.chainId)) { + symbols.push({ key: "weth", name: "ETH" }); + symbols.push({ key: "dai", name: "DAI" }); + } else if (isOptimism(currentNetwork.chainId)) { + symbols.push({ key: "eth", name: "ETH" }); + symbols.push({ key: "dai", name: "DAI" }); + if (showAllVaults) { + symbols.push({ key: "link", name: "LINK" }); + symbols.push({ key: "uni", name: "UNI" }); + symbols.push({ key: "snx", name: "SNX" }); + } + } else { + symbols.push({ key: "matic", name: "MATIC" }); + symbols.push({ key: "dai", name: "DAI" }); + symbols.push({ key: "wbtc", name: "WBTC" }); + } + + return symbols; + }; + + const handleItemsViewChange = (number: string) => { + confPagination(vaultList, parseInt(number)); + }; + + const handleRadioBtnChange = (value: string) => { + setRadioValue(value); + if (value === "1") { + setOwnerAddress(""); + } else { + setOwnerAddress(currentAddress); + } + }; + + const handleStatusChange = (newStatus: string) => { + if (newStatus === VAULT_STATUS.liquidation || newStatus === VAULT_STATUS.active) { + setCurrentStatus(newStatus); + if (currentStatus === "all") { + loadVaults(vaultGraphList, newStatus); + } else { + loadVaultData(); + } + } else { + setCurrentStatus(newStatus); + } + }; + + const handleTokenChange = (newToken: string) => { + setTokenSymbol(newToken); + }; + + const handleModeChange = (newMode: string) => { + setVaultMode(newMode); + }; + + const onFilterRatioClick = () => { + if (minRatioInput && maxRatioInput) { + // @ts-ignore + const minRatio = minRatioInput.current.value; + // @ts-ignore + const maxRatio = maxRatioInput.current.value; + if (isValidRatio(minRatio) && isValidRatio(maxRatio)) { + setCurrentMinRatio(minRatio.concat("%")); + setCurrentMaxRatio(maxRatio.concat("%")); + // @ts-ignore + loadVaults(vaultGraphList); + if (ratioRangeDropdown !== null) { + // @ts-ignore + ratioRangeDropdown.current.click(); + } + } + } + }; + + const onPageSelected = (pageNumber: number) => { + const nextPage = pageNumber === pagination.pages ? 0 : pageNumber + 1; + const newPagination = { + ...pagination, + previous: pageNumber === 1 ? 0 : pageNumber - 1, + current: pageNumber, + next: nextPage, + }; + setPagination(newPagination); + }; + + const updateLiquidatedVault = async ( + index: number, + symbol: string, + vaultId: string, + collateral: ethers.BigNumberish, + debt: ethers.BigNumberish + ) => { + const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = + calculateVaultData( + collateral, + debt, + symbol, + vaultList[index].isHardVault, + vaultList[index].decimals + ); + const allVaults = vaultList; + const v = { + id: vaultId, + collateralSymbol: symbol, + collateralValue: collateralText, + collateralUsd: collateralUSD.toFixed(2), + debt: debtText, + debtUsd: debtUSD.toFixed(2), + ratio, + minRatio: minRatio.toString(), + decimals: vaultList[index].decimals, + isHardVault: vaultList[index].isHardVault, + netReward: 0, + status, + blockTS: vaultList[index].blockTS, + url: vaultList[index].url, + }; + allVaults[index] = Object.create(v); + setVaultList(Array.from(allVaults)); + setRenderTable(!renderTable); + }; + + return ( +
+ + + + +
+ <>{t("totals")} +
+
+ +
@@ -339,12 +352,28 @@ export const Vaults = ({ )} - {myVaults && v.url !== "" && } + {myVaults && v.url !== "" && } ); })}
{vaultButtonLink(index, v)}{vaultButtonLink(v)}
+ {vaults.length === 0 && currentAddress !== "" && myVaults && ( +
+

+ No Vaults yet. Please + + your first vault. +

+
+ )} + {vaults.length === 0 && currentAddress === "" && ( +
+

No vaults found.

+
+ )} { let vaultFilter = ""; let statusFilter = ""; let modeFilter = ""; + if (radioValue === "2" && ownerAddress !== "") { ownerFilter = `, owner: "${ownerAddress}"`; } @@ -164,6 +175,9 @@ const Monitoring = ({ setVaultToUpdate }: props) => { filter = `, where: { blockTS_gt: "0" ${filter} }`; } } + + console.log("Filter: ", filter); + return filter; }; @@ -372,7 +386,6 @@ const Monitoring = ({ setVaultToUpdate }: props) => { setLoadMore(false); setFilteringRatios(true); - console.log("Current: ", currentStatus); // setLiqLoaded(currentStatus !== VAULT_STATUS.liquidation); // @ts-ignore vaultsData.vaults.forEach((v) => { @@ -464,7 +477,6 @@ const Monitoring = ({ setVaultToUpdate }: props) => { console.log(error); }, onCompleted: (data: any) => { - console.log("aqui --"); if (!isUndefined(data)) { setVaultGraphList(data); loadVaults(data, currentStatus); @@ -478,12 +490,14 @@ const Monitoring = ({ setVaultToUpdate }: props) => { const load = async () => { if (signer && signer.signer) { if (!vaultsUpdated) { - console.log("Monitoring"); const address = await signer.signer.getAddress(); setCurrentAddress(address); setOwnerAddress(radioValue === "2" ? address : ""); + loadVaultData(); } + } else { + loadVaultData(); } }; load(); @@ -495,28 +509,28 @@ const Monitoring = ({ setVaultToUpdate }: props) => { const tokensSymbols = (): Array => { const symbols = [{ key: "all", name: "All" }]; if (isInLayer1(currentNetwork.chainId)) { - symbols.push({ key: "weth", name: "ETH" }); - symbols.push({ key: "dai", name: "DAI" }); + symbols.push({ key: "weth", name: TOKENS_SYMBOLS.ETH }); + symbols.push({ key: "dai", name: TOKENS_SYMBOLS.DAI }); if (showAllVaults) { - symbols.push({ key: "aave", name: "AAVE" }); - symbols.push({ key: "link", name: "LINK" }); - symbols.push({ key: "usdc", name: "USDC" }); + symbols.push({ key: "aave", name: TOKENS_SYMBOLS.AAVE }); + symbols.push({ key: "link", name: TOKENS_SYMBOLS.LINK }); + symbols.push({ key: "usdc", name: TOKENS_SYMBOLS.USDC }); } } else if (isArbitrum(currentNetwork.chainId)) { - symbols.push({ key: "weth", name: "ETH" }); - symbols.push({ key: "dai", name: "DAI" }); + symbols.push({ key: "weth", name: TOKENS_SYMBOLS.ETH }); + symbols.push({ key: "dai", name: TOKENS_SYMBOLS.DAI }); } else if (isOptimism(currentNetwork.chainId)) { - symbols.push({ key: "eth", name: "ETH" }); - symbols.push({ key: "dai", name: "DAI" }); + symbols.push({ key: "eth", name: TOKENS_SYMBOLS.ETH }); + symbols.push({ key: "dai", name: TOKENS_SYMBOLS.DAI }); if (showAllVaults) { - symbols.push({ key: "link", name: "LINK" }); - symbols.push({ key: "uni", name: "UNI" }); - symbols.push({ key: "snx", name: "SNX" }); + symbols.push({ key: "link", name: TOKENS_SYMBOLS.LINK }); + symbols.push({ key: "uni", name: TOKENS_SYMBOLS.UNI }); + symbols.push({ key: "snx", name: TOKENS_SYMBOLS.SNX }); } } else { - symbols.push({ key: "matic", name: "MATIC" }); - symbols.push({ key: "dai", name: "DAI" }); - symbols.push({ key: "wbtc", name: "WBTC" }); + symbols.push({ key: "matic", name: TOKENS_SYMBOLS.MATIC }); + symbols.push({ key: "dai", name: TOKENS_SYMBOLS.DAI }); + symbols.push({ key: "wbtc", name: TOKENS_SYMBOLS.WBTC }); } return symbols; @@ -623,6 +637,38 @@ const Monitoring = ({ setVaultToUpdate }: props) => { setRenderTable(!renderTable); }; + const newVault = () => { + let newAssetSymbol = TOKENS_SYMBOLS.TCAP; + let newCollateralSymbol = "ETH"; + let isHardVault = false; + const createdCollaterals = []; + for (let i = 0; i < vaultList.length; i += 1) { + createdCollaterals.push(vaultList[i].collateralSymbol); + } + + if (createdCollaterals.includes(TOKENS_SYMBOLS.WETH)) { + createdCollaterals.push(TOKENS_SYMBOLS.ETH); + } + + if (isInLayer1(currentNetwork.chainId)) { + [newCollateralSymbol, isHardVault] = findNewMainnetVaultCollateral(createdCollaterals); + } + if (isOptimism(currentNetwork.chainId)) { + newCollateralSymbol = findNewOptimismVaultCollateral(createdCollaterals); + } + if (isArbitrum(currentNetwork.chainId)) { + newAssetSymbol = TOKENS_SYMBOLS.JPEGz; + newCollateralSymbol = findNewArbitrumVaultCollateral(createdCollaterals); + } + + setVaultToUpdate({ + vaultId: "0", + assetSymbol: newAssetSymbol, + collateralSymbol: newCollateralSymbol, + isHardVault, + }); + }; + return (
@@ -671,7 +717,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => {
-
+
<>{t("view")}:
@@ -698,7 +744,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => {
- <>{t("collateral")}: + <>{t("collateral")}
{ {isInLayer1(currentNetwork.chainId) && (
- <>{t("mode")}: + <>{t("mode")}
{
)} {currentAddress !== "" && ( -
- handleRadioBtnChange(val)} - name="vaults-options" - > - {radios.map((radio, idx) => ( - - {radio.name} - - ))} - -
+ <> +
+ handleRadioBtnChange(val)} + name="vaults-options" + > + {radios.map((radio, idx) => ( + + {radio.name} + + ))} + +
+
+ +
+ )}
diff --git a/src/components/Vaults/vault/Vault2.tsx b/src/components/Vaults/vault/Vault2.tsx index c9e315f..6e9a078 100644 --- a/src/components/Vaults/vault/Vault2.tsx +++ b/src/components/Vaults/vault/Vault2.tsx @@ -6,31 +6,29 @@ import { Dropdown, Form, InputGroup, - OverlayTrigger, + Spinner, ToggleButton, - Tooltip, } from "react-bootstrap/esm"; -import { FaArrowLeft } from "react-icons/fa"; import NumberFormat from "react-number-format"; import { useTranslation } from "react-i18next"; +import { FaPlus } from "react-icons/fa"; import "../../../styles/mint2.scss"; -import VaultForm from "./VaultForm"; import { useVault } from "../../../hooks"; import { networkContext, signerContext } from "../../../state"; -import { TokenIcon } from "../common"; -import { NETWORKS } from "../../../utils/constants"; +import { capitalize, TokenIcon } from "../common"; +import { NETWORKS, TOKENS_SYMBOLS } from "../../../utils/constants"; import { errorNotification, getDefaultProvider, getRatio, getSafeRemoveCollateral, getSafeMint, + isArbitrum, isInLayer1, - isOptimism, isPolygon, + isOptimism, notifyUser, toUSD, - isArbitrum, } from "../../../utils/utils"; type VaultInitType = { @@ -49,62 +47,1036 @@ type props = { const Vault2 = ({ currentAddress, vaultInitData, goBack }: props) => { const { t } = useTranslation(); const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); const [vaultMode, setVaultMode] = useState( isInLayer1(currentNetwork.chainId) ? "hard" : "normal" ); const [vaultData, setVaultData] = useState(vaultInitData); - const [loadingMode, setLoadingMode] = useState(false); const radios = [ { name: "Regular", value: "normal" }, { name: "Hard", value: "hard" }, ]; + const { + currentCollateral, + currentVault, + currentAssetRead, + currentCollateralRead, + currentVaultRead, + currentCollateralOracleRead, + currentAssetOracleRead, + } = useVault(vaultData.assetSymbol, vaultData.collateralSymbol, vaultData.isHardVault); + const actions = ["add", "remove", "mint", "burn"]; + + // Actions + const [title, setTitle] = useState(t("vault.create")); + const [text, setText] = useState(t("vault.create-text", { asset: vaultData.assetSymbol })); + const [isLoading, setIsLoading] = useState(false); + const [btnDisabled, setBtnDisabled] = useState(false); + const [activeAction, setActiveAction] = useState("add"); + + // Vault Data // Vault Data const [assetOptions, setAssetOptions] = useState>([]); const [collateralOptions, setCollateralOptions] = useState>([]); - // Inputss + const [currentVaultId, setCurrentVaultId] = useState("0"); + const [isApproved, setIsApproved] = useState(false); + const [vaultDebt, setVaultDebt] = useState("0"); + // const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); + const [vaultCollateral, setVaultCollateral] = useState("0"); + // const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); + const [vaultRatio, setVaultRatio] = useState("0"); + const [tempRatio, setTempRatio] = useState(""); + const [minRatio, setMinRatio] = useState("0"); + const [selectedVaultDecimals, setSelectedVaultDecimals] = useState(18); + + // General Data const isHardMode = () => vaultMode === "hard"; + const [assetBalance, setAssetBalance] = useState("0"); + // const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); + const [tokenBalance, setTokenBalance] = useState("0"); + const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); + + // Inputs + const [addCollateralTxt, setAddCollateralTxt] = useState("0"); + const [addCollateralUSD, setAddCollateralUSD] = useState("0"); + const [removeCollateralTxt, setRemoveCollateralTxt] = useState("0"); + const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); + const [mintTxt, setMintTxt] = useState("0"); + const [mintUSD, setMintUSD] = useState("0"); + const [burnTxt, setBurnTxt] = useState("0"); + const [burnUSD, setBurnUSD] = useState("0"); + const [burnFee, setBurnFee] = useState("0"); + const [vaultStatus, setVaultStatus] = useState(""); + // Infinite Approval + const approveValue = BigNumber.from("1157920892373161954235709850086879078532699"); + + const setCollaterals = (newMode: string) => { + if (currentAddress !== "") { + let aOptions = ["TCAP"]; + if (isArbitrum(currentNetwork.chainId)) { + aOptions = ["JPEGz"]; + } + + let cOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; + if (newMode === "hard") { + cOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; + } + if (isOptimism(currentNetwork.chainId) && !isHardMode()) { + cOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; + } + if (isPolygon(currentNetwork.chainId) && !isHardMode()) { + cOptions = ["MATIC", "DAI", "WBTC"]; + } + + setAssetOptions(aOptions); + setCollateralOptions(cOptions); + } + }; + + async function loadVault() { + setIsLoading(true); + let balance; + const provider = getDefaultProvider( + currentNetwork.chainId || NETWORKS.mainnet.chainId, + currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.goerli.name + ); + + let currentVaultData: any; + console.log("Collateral: ", vaultData.collateralSymbol); + console.log("Mode: ", vaultData.isHardVault); + console.log("Vault: ", currentVault?.address); + // @ts-ignore + const vaultID = await currentVault.userToVault(currentAddress); + setCurrentVaultId(vaultID.toString()); + console.log("vaultID: ", vaultID.toString()); + if (vaultID.toString() !== "0") { + // @ts-ignore + const cVault = await currentVault.vaults(vaultID); + currentVaultData = { + vaultId: vaultID, + collateral: cVault.Collateral, + debt: cVault.Debt, + }; + } + + if (vaultData.collateralSymbol !== "ETH") { + // @ts-ignore + balance = await currentCollateral.balanceOf(currentAddress); + } else { + balance = await provider.getBalance(currentAddress); + } + + let decimals = 18; + if (vaultData.collateralSymbol === "WBTC") { + decimals = 8; + } + if (vaultData.collateralSymbol === "USDC") { + decimals = 6; + } + + if (currentVaultData) { + const { collateral, debt } = currentVaultData; + // @ts-ignore + const allowanceCall = await currentCollateralRead.allowance( + currentAddress, + // @ts-ignore + currentVault.address + ); + // @ts-ignore + const currentRatioCall = await currentVaultRead.getVaultRatio(currentVaultData.vaultId); + + // @ts-ignore + // const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); + // @ts-ignore + // const decimalsCall = await currentCollateralRead.decimals(); + // @ts-ignore + // const currentCollateralPriceCall = await currentCollateralOracleRead.getLatestAnswer(); + // @ts-ignore + const currentMinRatioCall = await currentVaultRead.ratio(); + // @ts-ignore + const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + + // @ts-ignore + const [allowance, currentRatio, currentMinRatio, currentAssetBalance] = + await signer.ethcallProvider?.all([ + allowanceCall, + currentRatioCall, + // currentAssetPriceCall, + currentMinRatioCall, + currentAssetBalanceCall, + ]); + // currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + + const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); + setAssetBalance(cBalance); + + if (!allowance.isZero() || vaultData.collateralSymbol === "ETH") { + const safeValue = isHardMode() ? 20 : 50; + const warnValue = isHardMode() ? 10 : 30; + + setMinRatio(currentMinRatio.toString()); + setIsApproved(true); + setVaultRatio(currentRatio.toString()); + if (currentRatio.toString() === "0") { + setVaultStatus("N/A"); + } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + safeValue) { + setVaultStatus("safe"); + } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + warnValue) { + setVaultStatus("warning"); + } else { + setVaultStatus("danger"); + } + + const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); + setVaultCollateral(parsedCollateral); + // const usdCollateral = toUSD(currentCollateralPrice, parsedCollateral); + // setVaultCollateralUSD(usdCollateral.toString()); + + // const currentAssetPriceFormat = ethers.utils.formatEther(currentAssetPrice); + const parsedDebt = ethers.utils.formatEther(debt); + setVaultDebt(parsedDebt); + // const usdAsset = toUSD(currentAssetPriceFormat, parsedDebt); + // setVaultDebtUSD(usdAsset.toString()); + } else { + setText(t("vault.approve-text", { asset: currentVaultData.assetSymbol })); + setTitle(t("vault.approve")); + setIsApproved(false); + } + } else { + // @ts-ignore + // const decimalsCall = await currentCollateralRead.decimals(); + // @ts-ignore + // const currentPriceCall = await currentCollateralOracleRead.getLatestAnswer(); + // @ts-ignore + const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + + // @ts-ignore + const [currentAssetBalance] = await signer.ethcallProvider?.all([ + // currentPriceCall, + currentAssetBalanceCall, + ]); + // currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + + const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); + setAssetBalance(cBalance); + + setText(t("vault.create-text", { asset: vaultData.assetSymbol })); + setTitle(t("vault.create")); + setIsApproved(false); + } + + setSelectedVaultDecimals(decimals); + const currentBalance = ethers.utils.formatUnits(balance, decimals); + if (parseFloat(currentBalance) < 0.09) { + setTokenBalanceDecimals(4); + } else { + setTokenBalanceDecimals(2); + } + setTokenBalance(currentBalance); + setIsLoading(false); + // const usdBalance = toUSD(currentCollateralPrice, currentBalance); + // setTokenBalanceUSD(usdBalance.toString()); + } useEffect( () => { const load = async () => { - if (currentAddress !== "") { - let aOptions = ["TCAP"]; - if (isArbitrum(currentNetwork.chainId)) { - aOptions = ["JPEGz"]; - } + setCollaterals(vaultData.isHardVault ? "hard" : "normal"); + if (currentAddress !== "" && currentCollateral !== null && currentAssetRead !== null) { + await loadVault(); + } + }; + load(); + }, + // eslint-disable-next-line + [currentAddress, currentVault] + ); + + const assetPrice = async () => { + const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentAssetPrice] = await signer.ethcallProvider?.all([currentAssetPriceCall]); + return currentAssetPrice; + }; + + const collateralPrice = async () => { + const collateralPriceCall = await currentCollateralOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentCollateralPrice] = await signer.ethcallProvider?.all([collateralPriceCall]); + return currentCollateralPrice; + }; + + const isGasAsset = () => + (!isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === "ETH") || + (isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === "MATIC"); + + const refresh = async () => { + try { + await loadVault(); + } catch (error) { + console.log(error); + } + }; + + const resetFields = () => { + setBurnFee("0"); + setAddCollateralUSD("0"); + setAddCollateralTxt("0"); + setRemoveCollateralTxt("0"); + setRemoveCollateralUSD("0"); + setMintTxt("0"); + setMintUSD("0"); + setBurnUSD("0"); + setBurnTxt("0"); + }; + + const changeVault = async (newRatio: number, reset = false) => { + const safeValue = isHardMode() ? 20 : 50; + const warnValue = isHardMode() ? 10 : 30; + let r = newRatio; + if (reset) { + r = parseFloat(tempRatio); + setVaultRatio(tempRatio); + setTempRatio(""); + resetFields(); + } else { + if (tempRatio === "") { + setTempRatio(vaultRatio); + } + r = newRatio; + setVaultRatio(r.toString()); + } + + if (r === 0) { + setVaultStatus(t("vault.status.na")); + } else if (r >= parseFloat(minRatio) + safeValue) { + setVaultStatus(t("vault.status.safe")); + } else if (r >= parseFloat(minRatio) + warnValue) { + setVaultStatus(t("vault.status.warning")); + } else if (r >= parseFloat(minRatio)) { + setVaultStatus(t("vault.status.danger")); + } else { + setVaultRatio("0"); + setVaultStatus(t("vault.status.error")); + } + }; + + // forms + const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { + if (isHardMode()) { + const d = parseFloat(vaultDebt); + let newDebt = 0; + if (isMint) { + newDebt = amount + d; + } else { + newDebt = d - amount; + } + return newDebt >= 20 || newDebt === 0; + } + return true; + }; + + const onChangeAddCollateral = async (event: React.ChangeEvent) => { + setAddCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); + const r = await getRatio( + newCollateral.toString(), + currentPrice, + vaultDebt, + currentAssetPrice + ); + changeVault(r); + setAddCollateralUSD(usd.toString()); + } else { + changeVault(0, false); + setAddCollateralUSD("0"); + } + }; + + const onFocusAddCollateral = () => { + if (addCollateralTxt && parseFloat(addCollateralTxt) === 0) { + setAddCollateralTxt(""); + } + }; + + const onBlurAddCollateral = () => { + if (!addCollateralTxt) { + setAddCollateralTxt("0"); + } + }; + + const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { + setRemoveCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); + const r = await getRatio( + newCollateral.toString(), + currentPrice, + vaultDebt, + currentAssetPrice + ); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + } else { + changeVault(0, false); + setRemoveCollateralUSD("0"); + } + }; + + const onFocusRemoveCollateral = () => { + if (removeCollateralTxt && parseFloat(removeCollateralTxt) === 0) { + setRemoveCollateralTxt(""); + } + }; + + const onBlurRemoveCollateral = () => { + if (!removeCollateralTxt) { + setRemoveCollateralTxt("0"); + } + }; + + const onChangeMint = async (event: React.ChangeEvent) => { + setMintTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentAssetPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); + const r = await getRatio( + vaultCollateral, + currentPrice, + newDebt.toString(), + currentAssetPrice + ); + changeVault(r); + setMintUSD(usd.toString()); + } else { + changeVault(0, false); + setMintUSD("0"); + } + }; + + const onFocusMint = () => { + if (mintTxt && parseFloat(mintTxt) === 0) { + setMintTxt(""); + } + }; + + const onBlurMint = () => { + if (!mintTxt) { + setMintTxt("0"); + } + }; - let cOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; - if (isHardMode()) { - cOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; + const onChangeBurn = async (event: React.ChangeEvent) => { + try { + setBurnTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentAssetPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); + const r = await getRatio( + vaultCollateral, + currentPrice, + newDebt.toString(), + currentAssetPrice + ); + changeVault(r); + setBurnUSD(usd.toString()); + const currentBurnFee = await currentVaultRead?.getFee( + ethers.utils.parseEther(event.target.value) + ); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + changeVault(0, false); + setBurnUSD("0"); + setBurnFee("0"); + } + } catch (error) { + console.error(error); + changeVault(0, true); + setBurnUSD("0"); + setBurnFee("0"); + } + }; + + const onFocusBurn = () => { + if (burnTxt && parseFloat(burnTxt) === 0) { + setBurnTxt(""); + } + }; + + const onBlurBurn = () => { + if (!burnTxt) { + setBurnTxt("0"); + } + }; + + const addCollateral = async () => { + if (addCollateralTxt && parseFloat(addCollateralTxt) > 0) { + setBtnDisabled(true); + // fix decimals + const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); + try { + if (isGasAsset()) { + let tx; + if (vaultData.collateralSymbol === "ETH") { + tx = await currentVault?.addCollateralETH({ + value: amount, + }); + } else { + tx = await currentVault?.addCollateralMATIC({ + value: amount, + }); } - if (isOptimism(currentNetwork.chainId) && !isHardMode()) { - cOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; + notifyUser(tx, refresh); + } else { + const tx = await currentVault?.addCollateral(amount); + notifyUser(tx, refresh); + } + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("errors.no-funds")); + } + } + setBtnDisabled(false); + setAddCollateralTxt("0"); + setAddCollateralUSD("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const maxAddCollateral = async (e: React.MouseEvent) => { + e.preventDefault(); + let balance = "0"; + if (vaultData.collateralSymbol === "ETH") { + const provider = getDefaultProvider(currentNetwork.chainId, currentNetwork.name); + balance = ethers.utils.formatEther(await provider.getBalance(currentAddress)); + } else if (currentCollateral) { + const value = BigNumber.from(await currentCollateral.balanceOf(currentAddress)); + balance = ethers.utils.formatUnits(value, selectedVaultDecimals); + } + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + setAddCollateralTxt(balance); + let usd = toUSD(currentPrice, balance); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(balance) + parseFloat(vaultCollateral); + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); + changeVault(r); + setAddCollateralUSD(usd.toString()); + }; + + const removeCollateral = async () => { + if (removeCollateralTxt && parseFloat(removeCollateralTxt) > 0) { + const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); + setBtnDisabled(true); + try { + if (isGasAsset()) { + let tx; + if (vaultData.collateralSymbol === "ETH") { + tx = await currentVault?.removeCollateralETH(amount); + } else { + tx = await currentVault?.removeCollateralMATIC(amount); } - if (isPolygon(currentNetwork.chainId) && !isHardMode()) { - cOptions = ["MATIC", "DAI", "WBTC"]; + notifyUser(tx, refresh); + } else { + const tx = await currentVault?.removeCollateral(amount); + notifyUser(tx, refresh); + } + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.tran-rejected")); + } + } + setBtnDisabled(false); + setRemoveCollateralTxt("0"); + setRemoveCollateralUSD("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const safeRemoveCollateral = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let collateralToRemove = await getSafeRemoveCollateral( + minRatio, + vaultCollateral, + currentPrice, + currentAssetPrice, + vaultDebt, + vaultData.isHardVault + ); + if (selectedVaultDecimals === 8) { + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); + } + setRemoveCollateralTxt(collateralToRemove.toString()); + let usd = toUSD(currentPrice, collateralToRemove.toString()); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - collateralToRemove; + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + }; + + const mintTCAP = async () => { + if (mintTxt && parseFloat(mintTxt) > 0) { + if (isMinRequiredTcap(parseFloat(mintTxt), true)) { + setBtnDisabled(true); + try { + const amount = ethers.utils.parseEther(mintTxt); + console.log("WEI Amount: ", amount.toString()); + const tx = await currentVault?.mint(amount); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.no-collateral")); } + } + setBtnDisabled(false); + setMintTxt("0"); + setMintUSD("0"); + } else { + errorNotification(t("vault.errors.min-tcap")); + } + } else { + errorNotification(t("errors.empty")); + } + }; + + const safeMintTCAP = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + const safeMint = await getSafeMint( + minRatio, + vaultCollateral, + currentPrice, + currentAssetPrice, + vaultDebt, + vaultData.isHardVault + ); + setMintTxt(safeMint.toString()); + let usd = toUSD(currentAssetPrice, safeMint.toString()); + if (!usd) { + usd = 0; + } + const newDebt = safeMint + parseFloat(vaultDebt); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); + changeVault(r); + setMintUSD(usd.toString()); + }; - setAssetOptions(aOptions); - setCollateralOptions(cOptions); + const burnTCAP = async () => { + if (burnTxt && parseFloat(burnTxt) > 0) { + const amount = ethers.utils.parseEther(burnTxt); + setBtnDisabled(true); + try { + const currentBurnFee = await currentVault?.getFee(amount); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + const tx = await currentVault?.burn(amount, { value: increasedFee }); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.burn-too-high")); } - }; - load(); - }, - // eslint-disable-next-line - [currentAddress, vaultInitData] + } + setBtnDisabled(false); + setBurnTxt("0"); + setBurnUSD("0"); + setBurnFee("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const maxBurnTCAP = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + const currentBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + const currentVaultDebtCall = await currentVaultRead?.vaults(vaultData.vaultId); + + // @ts-ignore + const [currentBalance, cVault] = await signer.ethcallProvider?.all([ + currentBalanceCall, + currentVaultDebtCall, + ]); + + let balanceFormat = "0"; + let balance; + if (currentBalance.lt(cVault.Debt)) { + balanceFormat = ethers.utils.formatEther(currentBalance); + balance = currentBalance; + } else { + balanceFormat = vaultDebt; + balance = cVault.Debt; + } + setBurnTxt(balanceFormat); + let usd = toUSD(currentAssetPrice, balanceFormat); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(balanceFormat) - parseFloat(balanceFormat); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); + changeVault(r); + setBurnUSD(usd.toString()); + + if (balanceFormat !== "0") { + const currentBurnFee = await currentVault?.getFee(balance); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + setBurnFee("0"); + } + }; + + const ActionsDropdown = () => ( + setActiveAction(eventKey || "add")}> + +
+ + {capitalize(activeAction)}{" "} + {actions.slice(0, 2).includes(activeAction) + ? vaultData.collateralSymbol + : vaultData.assetSymbol.toUpperCase()} + +
+
+ + {actions.map((action, index) => ( + + {capitalize(action)}{" "} + {index < 2 ? vaultData.collateralSymbol : vaultData.assetSymbol.toUpperCase()} + + ))} + +
+ ); + + const AddCollateral = () => ( + + + + + + + + + + ); + + const RemoveCollateral = () => ( + + + + + + + + + + ); + + const MintAsset = () => ( + + + + + + + + + + ); + + const BurnAsset = () => ( + + + + + + + + + + ); + + const ActionControls = () => { + if (activeAction === "add") { + return AddCollateral(); + } + if (activeAction === "remove") { + return RemoveCollateral(); + } + if (activeAction === "mint") { + return MintAsset(); + } + return BurnAsset(); + }; + + const MaxButton = () => { + if (activeAction === "add") { + return ( + + ); + } + if (activeAction === "remove") { + return ( + + ); + } + if (activeAction === "mint") { + return ( + + ); + } + return ( + + ); + }; + + const AssetBalance = (isCollateral: boolean) => { + const aBalance = isCollateral ? tokenBalance : assetBalance; + + return ( +
+ Wallet Balance: + + + +
+ ); + }; + + const CollateralAmount = () => ( +
+ Collateral: + + + +
+ ); + + const MintedAmount = () => ( +
+ Debt: + + + +
+ ); + + const creatOrApprovee = async () => { + console.log(" Create Vault: ", currentVault?.address); + console.log(" currentVaultId: ", currentVaultId); + if (currentVaultId === "0") { + setBtnDisabled(true); + try { + const tx = await currentVault?.createVault(); + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification(t("errors.tran-rejected")); + } + } + setBtnDisabled(false); + } else { + setBtnDisabled(true); + try { + const tx = await currentCollateral?.approve(currentVault?.address, approveValue); + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification(t("errors.tran-rejected")); + } + } + setBtnDisabled(false); + } + }; + + const RenderCreateVault = () => ( +
+ {isLoading ? ( + + ) : ( + <> +

+ <>{text} +

+ + + )} +
); const handleRadioBtnChange = async (value: string) => { - setLoadingMode(true); setVaultMode(value); + // setCollaterals(value); + setVaultData({ + vaultId: "0", + assetSymbol: vaultData.assetSymbol, + collateralSymbol: + vaultData.collateralSymbol === TOKENS_SYMBOLS.ETH + ? TOKENS_SYMBOLS.WETH + : TOKENS_SYMBOLS.ETH, + isHardVault: value === "hard", + }); }; const handleTokenChange = async (value: string) => { - console.log(" bb ", value); + let keepVaultId = false; + if (vaultData.collateralSymbol === "ETH" || vaultData.collateralSymbol === "WETH") { + keepVaultId = value === "ETH" || value === "WETH"; + } + setVaultData({ - vaultId: "0", + vaultId: !keepVaultId ? "0" : vaultData.vaultId, assetSymbol: vaultData.assetSymbol, collateralSymbol: value, isHardVault: vaultData.isHardVault, @@ -118,7 +1090,7 @@ const Vault2 = ({ currentAddress, vaultInitData, goBack }: props) => {
- TCAP + {vaultData.assetSymbol}
@@ -160,38 +1132,106 @@ const Vault2 = ({ currentAddress, vaultInitData, goBack }: props) => {
- -
Vault
-
-
- - {radios.map((radio, idx) => ( - handleRadioBtnChange(e.currentTarget.value)} - > - {radio.name} - - ))} - +
+ + {radios.map((radio, idx) => ( + handleRadioBtnChange(e.currentTarget.value)} + > + {radio.name} + + ))} + +
+
- - +
+ + {AssetBalance(false)} + {isApproved && } +
+
+ + {AssetBalance(true)} + {isApproved && } +
- + {isLoading ? ( + + ) : ( +
+ {!isApproved ? ( + + ) : ( + <> +
+
+
+ + +
+ {activeAction === actions[3] && ( +
+ + <>{t("vault.debt.fee")}: + + {" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} +
+ )} +
+
{ActionControls()}
+
+
+
+
Ratio:
+
+
+
+

+ +

+
+ - +

+ + {vaultStatus.toLocaleUpperCase()} + +

+
+
+ + )} +
+ )}
diff --git a/src/components/Vaults/vault/VaultForm.tsx b/src/components/Vaults/vault/VaultForm.tsx index e75f351..9b00c41 100644 --- a/src/components/Vaults/vault/VaultForm.tsx +++ b/src/components/Vaults/vault/VaultForm.tsx @@ -1,12 +1,12 @@ import React, { useContext, useState, useEffect } from "react"; import { ethers, BigNumber } from "ethers"; -import { Button, Dropdown, Form, InputGroup } from "react-bootstrap/esm"; +import { Button, Dropdown, Form, InputGroup, Spinner } from "react-bootstrap/esm"; import NumberFormat from "react-number-format"; import { useTranslation } from "react-i18next"; import "../../../styles/mint2.scss"; import { useVault } from "../../../hooks"; import { networkContext, signerContext } from "../../../state"; -import { TokenIcon } from "../common"; +import { capitalize } from "../common"; import { NETWORKS } from "../../../utils/constants"; import { errorNotification, @@ -14,12 +14,9 @@ import { getRatio, getSafeRemoveCollateral, getSafeMint, - isInLayer1, - isOptimism, isPolygon, notifyUser, toUSD, - isArbitrum, } from "../../../utils/utils"; type VaultInitType = { @@ -38,10 +35,7 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { const { t } = useTranslation(); const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); - const [vaultMode, setVaultMode] = useState( - isInLayer1(currentNetwork.chainId) ? "hard" : "normal" - ); - + const { isHardVault } = vaultData; const { currentCollateral, currentVault, @@ -51,28 +45,22 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { currentCollateralOracleRead, currentAssetOracleRead, } = useVault(vaultData.assetSymbol, vaultData.collateralSymbol, vaultData.isHardVault); - const [loadingMode, setLoadingMode] = useState(false); const actions = ["add", "remove", "mint", "burn"]; - const radios = [ - { name: "Regular", value: "normal" }, - { name: "Hard", value: "hard" }, - ]; // Actions const [title, setTitle] = useState(t("vault.create")); const [text, setText] = useState(t("vault.create-text", { asset: vaultData.assetSymbol })); - const [isApproved, setIsApproved] = useState(false); - const [isLoading, setIsLoading] = useState(true); + const [isLoading, setIsLoading] = useState(false); const [btnDisabled, setBtnDisabled] = useState(false); - const [activeAction, setActiveAction] = useState(""); + const [activeAction, setActiveAction] = useState("add"); // Vault Data - const [assetOptions, setAssetOptions] = useState>([]); - const [collateralOptions, setCollateralOptions] = useState>([]); + const [currentVaultId, setCurrentVaultId] = useState("0"); + const [isApproved, setIsApproved] = useState(false); const [vaultDebt, setVaultDebt] = useState("0"); - const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); + // const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); const [vaultCollateral, setVaultCollateral] = useState("0"); - const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); + // const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); const [vaultRatio, setVaultRatio] = useState("0"); const [tempRatio, setTempRatio] = useState(""); const [minRatio, setMinRatio] = useState("0"); @@ -80,7 +68,7 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { // General Data const [assetBalance, setAssetBalance] = useState("0"); - const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); + // const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); const [tokenBalance, setTokenBalance] = useState("0"); const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); @@ -95,7 +83,6 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { const [burnUSD, setBurnUSD] = useState("0"); const [burnFee, setBurnFee] = useState("0"); const [vaultStatus, setVaultStatus] = useState(""); - const isHardMode = () => vaultMode === "hard"; // Infinite Approval const approveValue = BigNumber.from("1157920892373161954235709850086879078532699"); @@ -103,21 +90,15 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { let balance; const provider = getDefaultProvider( currentNetwork.chainId || NETWORKS.mainnet.chainId, - currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.rinkeby.name + currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.goerli.name ); let currentVaultData: any; - if (vaultData.vaultId !== "0") { - // @ts-ignore - const vault = await currentVault.vaults(BigNumber.from(vaultData.vaultId)); - currentVaultData = { - vaultId: vaultData.vaultId, - collateral: vault.Collateral, - debt: vault.Debt, - }; - } else { - // @ts-ignore - const vaultID = await currentVault.userToVault(currentAddress); + + console.log("isHard: ", isHardVault); + // @ts-ignore + const vaultID = await currentVault.userToVault(currentAddress); + if (vaultID.toString() !== "0") { // @ts-ignore const cVault = await currentVault.vaults(vaultID); currentVaultData = { @@ -125,7 +106,7 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { collateral: cVault.Collateral, debt: cVault.Debt, }; - console.log("-- aa --", vaultID.toString()); + setCurrentVaultId(vaultID.toString()); } if (vaultData.collateralSymbol !== "ETH") { @@ -136,7 +117,13 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { } let decimals = 18; - let currentCollateralPrice; + if (vaultData.collateralSymbol === "WBTC") { + decimals = 8; + } + if (vaultData.collateralSymbol === "USDC") { + console.log("USDC: ", vaultData.collateralSymbol); + decimals = 6; + } if (currentVaultData) { const { collateral, debt } = currentVaultData; @@ -150,44 +137,33 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { const currentRatioCall = await currentVaultRead.getVaultRatio(currentVaultData.vaultId); // @ts-ignore - const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); + // const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); // @ts-ignore - const decimalsCall = await currentCollateralRead.decimals(); + // const decimalsCall = await currentCollateralRead.decimals(); // @ts-ignore - const currentCollateralPriceCall = await currentCollateralOracleRead.getLatestAnswer(); + // const currentCollateralPriceCall = await currentCollateralOracleRead.getLatestAnswer(); // @ts-ignore const currentMinRatioCall = await currentVaultRead.ratio(); // @ts-ignore const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); // @ts-ignore - const [ - allowance, - currentRatio, - currentAssetPrice, - decimalsVal, - currentCollateralPriceVal, - currentMinRatio, - currentAssetBalance, - ] = await signer.ethcallProvider?.all([ - allowanceCall, - currentRatioCall, - currentAssetPriceCall, - decimalsCall, - currentCollateralPriceCall, - currentMinRatioCall, - currentAssetBalanceCall, - ]); - - decimals = decimalsVal; - currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + const [allowance, currentRatio, currentMinRatio, currentAssetBalance] = + await signer.ethcallProvider?.all([ + allowanceCall, + currentRatioCall, + // currentAssetPriceCall, + currentMinRatioCall, + currentAssetBalanceCall, + ]); + // currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); setAssetBalance(cBalance); - if (!allowance.isZero() || currentVaultData.collateralSymbol === "ETH") { - const safeValue = currentVaultData.isHardVault ? 20 : 50; - const warnValue = currentVaultData.isHardVault ? 10 : 30; + if (!allowance.isZero() || vaultData.collateralSymbol === "ETH") { + const safeValue = isHardVault ? 20 : 50; + const warnValue = isHardVault ? 10 : 30; setMinRatio(currentMinRatio.toString()); setIsApproved(true); @@ -204,14 +180,14 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); setVaultCollateral(parsedCollateral); - const usdCollateral = toUSD(currentCollateralPrice, parsedCollateral); - setVaultCollateralUSD(usdCollateral.toString()); + // const usdCollateral = toUSD(currentCollateralPrice, parsedCollateral); + // setVaultCollateralUSD(usdCollateral.toString()); - const currentAssetPriceFormat = ethers.utils.formatEther(currentAssetPrice); + // const currentAssetPriceFormat = ethers.utils.formatEther(currentAssetPrice); const parsedDebt = ethers.utils.formatEther(debt); setVaultDebt(parsedDebt); - const usdAsset = toUSD(currentAssetPriceFormat, parsedDebt); - setVaultDebtUSD(usdAsset.toString()); + // const usdAsset = toUSD(currentAssetPriceFormat, parsedDebt); + // setVaultDebtUSD(usdAsset.toString()); } else { setText(t("vault.approve-text", { asset: currentVaultData.assetSymbol })); setTitle(t("vault.approve")); @@ -219,25 +195,23 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { } } else { // @ts-ignore - const decimalsCall = await currentCollateralRead.decimals(); + // const decimalsCall = await currentCollateralRead.decimals(); // @ts-ignore - const currentPriceCall = await currentCollateralOracleRead.getLatestAnswer(); + // const currentPriceCall = await currentCollateralOracleRead.getLatestAnswer(); // @ts-ignore const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + // @ts-ignore - const [decimalsVal, currentCollateralPriceVal, currentAssetBalance] = - await signer.ethcallProvider?.all([ - decimalsCall, - currentPriceCall, - currentAssetBalanceCall, - ]); - decimals = decimalsVal; - currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + const [currentAssetBalance] = await signer.ethcallProvider?.all([ + // currentPriceCall, + currentAssetBalanceCall, + ]); + // currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); setAssetBalance(cBalance); - setText(t("vault.create-text")); + setText(t("vault.create-text", { asset: vaultData.assetSymbol })); setTitle(t("vault.create")); setIsApproved(false); } @@ -250,41 +224,23 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { setTokenBalanceDecimals(2); } setTokenBalance(currentBalance); - const usdBalance = toUSD(currentCollateralPrice, currentBalance); - setTokenBalanceUSD(usdBalance.toString()); - setLoadingMode(false); + // const usdBalance = toUSD(currentCollateralPrice, currentBalance); + // setTokenBalanceUSD(usdBalance.toString()); } useEffect( () => { const load = async () => { if (currentAddress !== "" && currentCollateral !== null && currentAssetRead !== null) { + setIsLoading(true); await loadVault(); - - let aOptions = ["TCAP"]; - if (isArbitrum(currentNetwork.chainId)) { - aOptions = ["JPEGz"]; - } - - let cOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; - if (isHardMode()) { - cOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; - } - if (isOptimism(currentNetwork.chainId) && !isHardMode()) { - cOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; - } - if (isPolygon(currentNetwork.chainId) && !isHardMode()) { - cOptions = ["MATIC", "DAI", "WBTC"]; - } - - setAssetOptions(aOptions); - setCollateralOptions(cOptions); + setIsLoading(false); } }; load(); }, // eslint-disable-next-line - [currentAddress, currentCollateral, vaultData] + [currentAddress, currentCollateral, isHardVault] ); const assetPrice = async () => { @@ -327,22 +283,11 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { setBurnTxt("0"); }; - const handleRadioBtnChange = async (value: string) => { - setLoadingMode(true); - setVaultMode(value); - setIsApproved(false); - setTokenBalance("0"); - setTokenBalanceUSD("0"); - - resetFields(); - await loadVault(); - }; - const changeVault = async (newRatio: number, reset = false) => { - const safeValue = vaultData.isHardVault ? 20 : 50; - const warnValue = vaultData.isHardVault ? 10 : 30; + const safeValue = isHardVault ? 20 : 50; + const warnValue = isHardVault ? 10 : 30; let r = newRatio; - + console.log("Rratio: ", r); if (reset) { r = parseFloat(tempRatio); setVaultRatio(tempRatio); @@ -372,7 +317,7 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { // forms const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { - if (vaultData.isHardVault) { + if (isHardVault) { const d = parseFloat(vaultDebt); let newDebt = 0; if (isMint) { @@ -612,13 +557,13 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { if (isGasAsset()) { let tx; if (vaultData.collateralSymbol === "ETH") { - tx = await currentCollateral?.removeCollateralETH(amount); + tx = await currentVault?.removeCollateralETH(amount); } else { - tx = await currentCollateral?.removeCollateralMATIC(amount); + tx = await currentVault?.removeCollateralMATIC(amount); } notifyUser(tx, refresh); } else { - const tx = await currentCollateral?.removeCollateral(amount); + const tx = await currentVault?.removeCollateral(amount); notifyUser(tx, refresh); } } catch (error) { @@ -784,37 +729,23 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { } }; - const handleTokenChange = async (value: string) => { - setIsApproved(false); - setTokenBalance("0"); - setTokenBalanceUSD("0"); - - // Clean form - setAddCollateralTxt(""); - setAddCollateralUSD("0"); - setRemoveCollateralTxt(""); - setRemoveCollateralUSD("0"); - setMintTxt(""); - setMintUSD("0"); - setBurnTxt(""); - setBurnUSD("0"); - setBurnFee("0"); - - // Load values - // await loadVault(); - }; - const ActionsDropdown = () => ( setActiveAction(eventKey || "add")}>
- {activeAction !== "" ? activeAction.toUpperCase() : "Actions"} + + {capitalize(activeAction)}{" "} + {actions.slice(0, 2).includes(activeAction) + ? vaultData.collateralSymbol + : vaultData.assetSymbol.toUpperCase()} +
- {actions.map((action) => ( + {actions.map((action, index) => ( - {action.toUpperCase()} + {capitalize(action)}{" "} + {index < 2 ? vaultData.collateralSymbol : vaultData.assetSymbol.toUpperCase()} ))} @@ -939,15 +870,15 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { const ActionControls = () => { if (activeAction === "add") { - return ; + return AddCollateral(); } if (activeAction === "remove") { - return ; + return RemoveCollateral(); } if (activeAction === "mint") { - return ; + return MintAsset(); } - return ; + return BurnAsset(); }; const MaxButton = () => { @@ -979,50 +910,6 @@ const VaultForm = ({ currentAddress, vaultData }: props) => { ); }; - const AssetDropdown = () => ( -
-
Asset
- - -
- - TCAP -
-
- - {assetOptions.map((item) => ( - - - {item} - - ))} - -
-
- ); - - const CollateralDropdown = () => ( -
-
Collateral
- handleTokenChange(eventKey || "ETH")}> - -
- - {vaultData.collateralSymbol.toUpperCase()} -
-
- - {collateralOptions.map((item) => ( - - - {item} - - ))} - -
-
- ); - const AssetBalance = (isCollateral: boolean) => { const aBalance = isCollateral ? tokenBalance : assetBalance; @@ -1072,14 +959,46 @@ const VaultForm = ({ currentAddress, vaultData }: props) => {
); + const creatOrApprovee = async () => { + if (currentVaultId === "0") { + setBtnDisabled(true); + try { + const tx = await currentVault?.createVault(); + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification(t("errors.tran-rejected")); + } + } + setBtnDisabled(false); + } else { + setBtnDisabled(true); + try { + const tx = await currentCollateral?.approve(currentVault?.address, approveValue); + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification(t("errors.tran-rejected")); + } + } + setBtnDisabled(false); + } + }; + const RenderCreateVault = () => (
-

- <>{text} -

- + {isLoading ? ( + + ) : ( + <> +

+ <>{text} +

+ + + )}
); @@ -1103,7 +1022,7 @@ const VaultForm = ({ currentAddress, vaultData }: props) => {
- {activeAction !== "" && } +
{activeAction === actions[3] && (
@@ -1121,11 +1040,7 @@ const VaultForm = ({ currentAddress, vaultData }: props) => {
)}
- {activeAction !== "" && ( -
- - - )} +
{ActionControls()}
diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 72689fb..d9b3ddb 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -1,36 +1,11 @@ import React, { useContext, useState, useEffect } from "react"; -import { ethers, BigNumber } from "ethers"; -import { - Button, - ButtonGroup, - Dropdown, - Form, - InputGroup, - OverlayTrigger, - ToggleButton, - Tooltip, -} from "react-bootstrap/esm"; -import { FaArrowLeft } from "react-icons/fa"; -import NumberFormat from "react-number-format"; -import { useTranslation } from "react-i18next"; -import "../../../styles/mintindex.scss"; -import { useVault } from "../../../hooks"; -import { networkContext, signerContext } from "../../../state"; +import { Button, ButtonGroup, Dropdown, Spinner, ToggleButton } from "react-bootstrap/esm"; +import { FaPlus } from "react-icons/fa"; +import "../../../styles/mint2.scss"; +import VaultForm from "./VaultForm"; +import { networkContext } from "../../../state"; import { TokenIcon } from "../common"; -import { NETWORKS } from "../../../utils/constants"; -import { - errorNotification, - getDefaultProvider, - getRatio, - getSafeRemoveCollateral, - getSafeMint, - isInLayer1, - isOptimism, - isPolygon, - notifyUser, - toUSD, - isArbitrum, -} from "../../../utils/utils"; +import { isInLayer1, isOptimism, isPolygon, isArbitrum } from "../../../utils/utils"; type VaultInitType = { vaultId: string; @@ -42,946 +17,84 @@ type VaultInitType = { type props = { currentAddress: string; vaultInitData: VaultInitType; - updateInitVaultData: (data: VaultInitType) => void; goBack: () => void; }; -const Vault = ({ currentAddress, vaultInitData, updateInitVaultData, goBack }: props) => { - const { t } = useTranslation(); +const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const currentNetwork = useContext(networkContext); - const signer = useContext(signerContext); const [vaultMode, setVaultMode] = useState( isInLayer1(currentNetwork.chainId) ? "hard" : "normal" ); - - const { - currentCollateral, - currentVault, - currentAssetRead, - currentCollateralRead, - currentVaultRead, - currentCollateralOracleRead, - currentAssetOracleRead, - } = useVault( - vaultInitData.assetSymbol, - vaultInitData.collateralSymbol, - vaultInitData.isHardVault - ); - const [loadingMode, setLoadingMode] = useState(false); - const actions = ["add", "remove", "mint", "burn"]; + const [loading, setLoading] = useState(true); + const [vaultData, setVaultData] = useState(vaultInitData); const radios = [ { name: "Regular", value: "normal" }, { name: "Hard", value: "hard" }, ]; - // Actions - const [title, setTitle] = useState(t("vault.create")); - const [text, setText] = useState(t("vault.create-text", { asset: vaultInitData.assetSymbol })); - const [isApproved, setIsApproved] = useState(false); - const [isLoading, setIsLoading] = useState(true); - const [btnDisabled, setBtnDisabled] = useState(false); - const [activeAction, setActiveAction] = useState(""); - // Vault Data const [assetOptions, setAssetOptions] = useState>([]); const [collateralOptions, setCollateralOptions] = useState>([]); - const [vaultDebt, setVaultDebt] = useState("0"); - const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); - const [vaultCollateral, setVaultCollateral] = useState("0"); - const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); - const [vaultRatio, setVaultRatio] = useState("0"); - const [tempRatio, setTempRatio] = useState(""); - const [minRatio, setMinRatio] = useState("0"); - const [selectedVaultDecimals, setSelectedVaultDecimals] = useState(18); - // General Data - const [assetBalance, setAssetBalance] = useState("0"); - const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); - const [tokenBalance, setTokenBalance] = useState("0"); - const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); - - // Inputs - const [addCollateralTxt, setAddCollateralTxt] = useState("0"); - const [addCollateralUSD, setAddCollateralUSD] = useState("0"); - const [removeCollateralTxt, setRemoveCollateralTxt] = useState("0"); - const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); - const [mintTxt, setMintTxt] = useState("0"); - const [mintUSD, setMintUSD] = useState("0"); - const [burnTxt, setBurnTxt] = useState("0"); - const [burnUSD, setBurnUSD] = useState("0"); - const [burnFee, setBurnFee] = useState("0"); - const [vaultStatus, setVaultStatus] = useState(""); + // Inputss const isHardMode = () => vaultMode === "hard"; - // Infinite Approval - const approveValue = BigNumber.from("1157920892373161954235709850086879078532699"); - - async function loadVault() { - let balance; - const provider = getDefaultProvider( - currentNetwork.chainId || NETWORKS.mainnet.chainId, - currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.rinkeby.name - ); - - let currentVaultData: any; - if (currentVaultData.vaultId !== "0") { - // @ts-ignore - const vault = await currentVault.vaults(BigNumber.from(currentVaultData.vaultId)); - currentVaultData = { - vaultId: currentVaultData.vaultId, - collateral: vault.Collateral, - debt: vault.Debt, - }; - } - - if (currentVaultData.collateralSymbol !== "ETH") { - // @ts-ignore - balance = await currentCollateral.balanceOf(currentAddress); - } else { - balance = await provider.getBalance(currentAddress); - } - - let decimals = 18; - let currentCollateralPrice; - - if (currentVaultData) { - const { collateral, debt } = currentVaultData; - // @ts-ignore - const allowanceCall = await currentCollateralRead.allowance( - currentAddress, - // @ts-ignore - currentVault.address - ); - // @ts-ignore - const currentRatioCall = await currentVaultRead.getVaultRatio(currentVaultData.vaultId); - // @ts-ignore - const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); - // @ts-ignore - const decimalsCall = await currentCollateralRead.decimals(); - // @ts-ignore - const currentCollateralPriceCall = await currentCollateralOracleRead.getLatestAnswer(); - // @ts-ignore - const currentMinRatioCall = await currentVaultRead.ratio(); - // @ts-ignore - const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); - - // @ts-ignore - const [ - allowance, - currentRatio, - currentAssetPrice, - decimalsVal, - currentCollateralPriceVal, - currentMinRatio, - currentAssetBalance, - ] = await signer.ethcallProvider?.all([ - allowanceCall, - currentRatioCall, - currentAssetPriceCall, - decimalsCall, - currentCollateralPriceCall, - currentMinRatioCall, - currentAssetBalanceCall, - ]); - - decimals = decimalsVal; - currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); - - const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); - setAssetBalance(cBalance); - - if (!allowance.isZero() || currentVaultData.collateralSymbol === "ETH") { - const safeValue = currentVaultData.isHardVault ? 20 : 50; - const warnValue = currentVaultData.isHardVault ? 10 : 30; - - setMinRatio(currentMinRatio.toString()); - setIsApproved(true); - setVaultRatio(currentRatio.toString()); - if (currentRatio.toString() === "0") { - setVaultStatus("N/A"); - } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + safeValue) { - setVaultStatus("safe"); - } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + warnValue) { - setVaultStatus("warning"); - } else { - setVaultStatus("danger"); - } - - const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); - setVaultCollateral(parsedCollateral); - const usdCollateral = toUSD(currentCollateralPrice, parsedCollateral); - setVaultCollateralUSD(usdCollateral.toString()); - - const currentAssetPriceFormat = ethers.utils.formatEther(currentAssetPrice); - const parsedDebt = ethers.utils.formatEther(debt); - setVaultDebt(parsedDebt); - const usdAsset = toUSD(currentAssetPriceFormat, parsedDebt); - setVaultDebtUSD(usdAsset.toString()); - } else { - setText(t("vault.approve-text", { asset: currentVaultData.assetSymbol })); - setTitle(t("vault.approve")); - setIsApproved(false); + const setCollaterals = (newMode: string) => { + if (currentAddress !== "") { + let aOptions = ["TCAP"]; + if (isArbitrum(currentNetwork.chainId)) { + aOptions = ["JPEGz"]; } - } else { - // @ts-ignore - const decimalsCall = await currentCollateralRead.decimals(); - // @ts-ignore - const currentPriceCall = await currentCollateralOracleRead.getLatestAnswer(); - // @ts-ignore - const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); - // @ts-ignore - const [decimalsVal, currentCollateralPriceVal, currentAssetBalance] = - await signer.ethcallProvider?.all([ - decimalsCall, - currentPriceCall, - currentAssetBalanceCall, - ]); - decimals = decimalsVal; - currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); - - const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); - setAssetBalance(cBalance); - setText(t("vault.create-text")); - setTitle(t("vault.create")); - setIsApproved(false); - } + let cOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; + if (newMode === "hard") { + cOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; + } + if (isOptimism(currentNetwork.chainId) && !isHardMode()) { + cOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; + } + if (isPolygon(currentNetwork.chainId) && !isHardMode()) { + cOptions = ["MATIC", "DAI", "WBTC"]; + } - setSelectedVaultDecimals(decimals); - const currentBalance = ethers.utils.formatUnits(balance, decimals); - if (parseFloat(currentBalance) < 0.09) { - setTokenBalanceDecimals(4); - } else { - setTokenBalanceDecimals(2); + setAssetOptions(aOptions); + setCollateralOptions(cOptions); } - setTokenBalance(currentBalance); - const usdBalance = toUSD(currentCollateralPrice, currentBalance); - setTokenBalanceUSD(usdBalance.toString()); - setLoadingMode(false); - } + setLoading(false); + }; useEffect( () => { - const load = async () => { - if (currentAddress !== "" && currentCollateral !== null && currentAssetRead !== null) { - await loadVault(); - - let aOptions = ["TCAP"]; - if (isArbitrum(currentNetwork.chainId)) { - aOptions = ["JPEGz"]; - } - - let cOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; - if (isHardMode()) { - cOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; - } - if (isOptimism(currentNetwork.chainId) && !isHardMode()) { - cOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; - } - if (isPolygon(currentNetwork.chainId) && !isHardMode()) { - cOptions = ["MATIC", "DAI", "WBTC"]; - } - - setAssetOptions(aOptions); - setCollateralOptions(cOptions); - } - }; - load(); + setCollaterals("hard"); }, // eslint-disable-next-line - [currentAddress, currentCollateral, vaultInitData] + [currentAddress, vaultInitData] ); - const assetPrice = async () => { - const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); - - // @ts-ignore - const [currentAssetPrice] = await signer.ethcallProvider?.all([currentAssetPriceCall]); - return currentAssetPrice; - }; - - const collateralPrice = async () => { - const collateralPriceCall = await currentCollateralOracleRead?.getLatestAnswer(); - - // @ts-ignore - const [currentCollateralPrice] = await signer.ethcallProvider?.all([collateralPriceCall]); - return currentCollateralPrice; - }; - - const isGasAsset = () => - (!isPolygon(currentNetwork.chainId) && vaultInitData.collateralSymbol === "ETH") || - (isPolygon(currentNetwork.chainId) && vaultInitData.collateralSymbol === "MATIC"); - - const refresh = async () => { - try { - await loadVault(); - } catch (error) { - console.log(error); - } - }; - - const resetFields = () => { - setBurnFee("0"); - setAddCollateralUSD("0"); - setAddCollateralTxt("0"); - setRemoveCollateralTxt("0"); - setRemoveCollateralUSD("0"); - setMintTxt("0"); - setMintUSD("0"); - setBurnUSD("0"); - setBurnTxt("0"); - }; - const handleRadioBtnChange = async (value: string) => { - setLoadingMode(true); + setLoading(true); setVaultMode(value); - setIsApproved(false); - setTokenBalance("0"); - setTokenBalanceUSD("0"); - - resetFields(); - await loadVault(); - }; - - const changeVault = async (newRatio: number, reset = false) => { - const safeValue = vaultInitData.isHardVault ? 20 : 50; - const warnValue = vaultInitData.isHardVault ? 10 : 30; - let r = newRatio; - - if (reset) { - r = parseFloat(tempRatio); - setVaultRatio(tempRatio); - setTempRatio(""); - resetFields(); - } else { - if (tempRatio === "") { - setTempRatio(vaultRatio); - } - r = newRatio; - setVaultRatio(r.toString()); - } - - if (r === 0) { - setVaultStatus(t("vault.status.na")); - } else if (r >= parseFloat(minRatio) + safeValue) { - setVaultStatus(t("vault.status.safe")); - } else if (r >= parseFloat(minRatio) + warnValue) { - setVaultStatus(t("vault.status.warning")); - } else if (r >= parseFloat(minRatio)) { - setVaultStatus(t("vault.status.danger")); - } else { - setVaultRatio("0"); - setVaultStatus(t("vault.status.error")); - } - }; - - // forms - const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { - if (vaultInitData.isHardVault) { - const d = parseFloat(vaultDebt); - let newDebt = 0; - if (isMint) { - newDebt = amount + d; - } else { - newDebt = d - amount; - } - return newDebt >= 20 || newDebt === 0; - } - return true; - }; - - const onChangeAddCollateral = async (event: React.ChangeEvent) => { - setAddCollateralTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); - const r = await getRatio( - newCollateral.toString(), - currentPrice, - vaultDebt, - currentAssetPrice - ); - changeVault(r); - setAddCollateralUSD(usd.toString()); - } else { - changeVault(0, false); - setAddCollateralUSD("0"); - } - }; - - const onFocusAddCollateral = () => { - if (addCollateralTxt && parseFloat(addCollateralTxt) === 0) { - setAddCollateralTxt(""); - } - }; - - const onBlurAddCollateral = () => { - if (!addCollateralTxt) { - setAddCollateralTxt("0"); - } - }; - - const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { - setRemoveCollateralTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); - const r = await getRatio( - newCollateral.toString(), - currentPrice, - vaultDebt, - currentAssetPrice - ); - changeVault(r); - setRemoveCollateralUSD(usd.toString()); - } else { - changeVault(0, false); - setRemoveCollateralUSD("0"); - } - }; - - const onFocusRemoveCollateral = () => { - if (removeCollateralTxt && parseFloat(removeCollateralTxt) === 0) { - setRemoveCollateralTxt(""); - } - }; - - const onBlurRemoveCollateral = () => { - if (!removeCollateralTxt) { - setRemoveCollateralTxt("0"); - } - }; - - const onChangeMint = async (event: React.ChangeEvent) => { - setMintTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentAssetPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); - const r = await getRatio( - vaultCollateral, - currentPrice, - newDebt.toString(), - currentAssetPrice - ); - changeVault(r); - setMintUSD(usd.toString()); - } else { - changeVault(0, false); - setMintUSD("0"); - } - }; - - const onFocusMint = () => { - if (mintTxt && parseFloat(mintTxt) === 0) { - setMintTxt(""); - } - }; - - const onBlurMint = () => { - if (!mintTxt) { - setMintTxt("0"); - } - }; - - const onChangeBurn = async (event: React.ChangeEvent) => { - try { - setBurnTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentAssetPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); - const r = await getRatio( - vaultCollateral, - currentPrice, - newDebt.toString(), - currentAssetPrice - ); - changeVault(r); - setBurnUSD(usd.toString()); - const currentBurnFee = await currentVaultRead?.getFee( - ethers.utils.parseEther(event.target.value) - ); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - } else { - changeVault(0, false); - setBurnUSD("0"); - setBurnFee("0"); - } - } catch (error) { - console.error(error); - changeVault(0, true); - setBurnUSD("0"); - setBurnFee("0"); - } - }; - - const onFocusBurn = () => { - if (burnTxt && parseFloat(burnTxt) === 0) { - setBurnTxt(""); - } - }; - - const onBlurBurn = () => { - if (!burnTxt) { - setBurnTxt("0"); - } - }; - - const addCollateral = async () => { - if (addCollateralTxt && parseFloat(addCollateralTxt) > 0) { - setBtnDisabled(true); - // fix decimals - const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); - try { - if (isGasAsset()) { - let tx; - if (vaultInitData.collateralSymbol === "ETH") { - tx = await currentVault?.addCollateralETH({ - value: amount, - }); - } else { - tx = await currentVault?.addCollateralMATIC({ - value: amount, - }); - } - notifyUser(tx, refresh); - } else { - const tx = await currentVault?.addCollateral(amount); - notifyUser(tx, refresh); - } - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("errors.no-funds")); - } - } - setBtnDisabled(false); - setAddCollateralTxt("0"); - setAddCollateralUSD("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const maxAddCollateral = async (e: React.MouseEvent) => { - e.preventDefault(); - let balance = "0"; - if (vaultInitData.collateralSymbol === "ETH") { - const provider = getDefaultProvider(currentNetwork.chainId, currentNetwork.name); - balance = ethers.utils.formatEther(await provider.getBalance(currentAddress)); - } else if (currentCollateral) { - const value = BigNumber.from(await currentCollateral.balanceOf(currentAddress)); - balance = ethers.utils.formatUnits(value, selectedVaultDecimals); - } - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - setAddCollateralTxt(balance); - let usd = toUSD(currentPrice, balance); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(balance) + parseFloat(vaultCollateral); - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); - changeVault(r); - setAddCollateralUSD(usd.toString()); - }; - - const removeCollateral = async () => { - if (removeCollateralTxt && parseFloat(removeCollateralTxt) > 0) { - const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); - setBtnDisabled(true); - try { - if (isGasAsset()) { - let tx; - if (vaultInitData.collateralSymbol === "ETH") { - tx = await currentCollateral?.removeCollateralETH(amount); - } else { - tx = await currentCollateral?.removeCollateralMATIC(amount); - } - notifyUser(tx, refresh); - } else { - const tx = await currentCollateral?.removeCollateral(amount); - notifyUser(tx, refresh); - } - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.tran-rejected")); - } - } - setBtnDisabled(false); - setRemoveCollateralTxt("0"); - setRemoveCollateralUSD("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const safeRemoveCollateral = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let collateralToRemove = await getSafeRemoveCollateral( - minRatio, - vaultCollateral, - currentPrice, - currentAssetPrice, - vaultDebt, - vaultInitData.isHardVault - ); - if (selectedVaultDecimals === 8) { - collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; - collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); - } - setRemoveCollateralTxt(collateralToRemove.toString()); - let usd = toUSD(currentPrice, collateralToRemove.toString()); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(vaultCollateral) - collateralToRemove; - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); - changeVault(r); - setRemoveCollateralUSD(usd.toString()); - }; - - const mintTCAP = async () => { - if (mintTxt && parseFloat(mintTxt) > 0) { - if (isMinRequiredTcap(parseFloat(mintTxt), true)) { - setBtnDisabled(true); - try { - const amount = ethers.utils.parseEther(mintTxt); - const tx = await currentVault?.mint(amount); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.no-collateral")); - } - } - setBtnDisabled(false); - setMintTxt("0"); - setMintUSD("0"); - } else { - errorNotification(t("vault.errors.min-tcap")); - } - } else { - errorNotification(t("errors.empty")); - } - }; - - const safeMintTCAP = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - const safeMint = await getSafeMint( - minRatio, - vaultCollateral, - currentPrice, - currentAssetPrice, - vaultDebt, - vaultInitData.isHardVault - ); - setMintTxt(safeMint.toString()); - let usd = toUSD(currentAssetPrice, safeMint.toString()); - if (!usd) { - usd = 0; - } - const newDebt = safeMint + parseFloat(vaultDebt); - const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); - changeVault(r); - setMintUSD(usd.toString()); - }; - - const burnTCAP = async () => { - if (burnTxt && parseFloat(burnTxt) > 0) { - const amount = ethers.utils.parseEther(burnTxt); - setBtnDisabled(true); - try { - const currentBurnFee = await currentVault?.getFee(amount); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - const tx = await currentVault?.burn(amount, { value: increasedFee }); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.burn-too-high")); - } - } - setBtnDisabled(false); - setBurnTxt("0"); - setBurnUSD("0"); - setBurnFee("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const maxBurnTCAP = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - const currentBalanceCall = await currentAssetRead?.balanceOf(currentAddress); - const currentVaultDebtCall = await currentVaultRead?.vaults(vaultInitData.vaultId); - - // @ts-ignore - const [currentBalance, cVault] = await signer.ethcallProvider?.all([ - currentBalanceCall, - currentVaultDebtCall, - ]); - - let balanceFormat = "0"; - let balance; - if (currentBalance.lt(cVault.Debt)) { - balanceFormat = ethers.utils.formatEther(currentBalance); - balance = currentBalance; - } else { - balanceFormat = vaultDebt; - balance = cVault.Debt; - } - setBurnTxt(balanceFormat); - let usd = toUSD(currentAssetPrice, balanceFormat); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(balanceFormat) - parseFloat(balanceFormat); - const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); - changeVault(r); - setBurnUSD(usd.toString()); - - if (balanceFormat !== "0") { - const currentBurnFee = await currentVault?.getFee(balance); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - } else { - setBurnFee("0"); - } + setCollaterals(value); + setVaultData({ + vaultId: "0", + assetSymbol: vaultData.assetSymbol, + collateralSymbol: "ETH", + isHardVault: value === "hard", + }); }; const handleTokenChange = async (value: string) => { - setIsApproved(false); - setTokenBalance("0"); - setTokenBalanceUSD("0"); - - // Clean form - setAddCollateralTxt(""); - setAddCollateralUSD("0"); - setRemoveCollateralTxt(""); - setRemoveCollateralUSD("0"); - setMintTxt(""); - setMintUSD("0"); - setBurnTxt(""); - setBurnUSD("0"); - setBurnFee("0"); - - // Load values - await loadVault(); - }; - - const ActionsDropdown = () => ( - setActiveAction(eventKey || "add")}> - -
- {activeAction !== "" ? activeAction.toUpperCase() : "Actions"} -
-
- - {actions.map((action) => ( - - {action.toUpperCase()} - - ))} - -
- ); - - const AddCollateral = () => ( - - - - - - - - - - ); - - const RemoveCollateral = () => ( - - - - - - - - - - ); - - const MintAsset = () => ( - - - - - - - - - - ); - - const BurnAsset = () => ( - - - - - - - - - - ); - - const ActionControls = () => { - if (activeAction === "add") { - return ; - } - if (activeAction === "remove") { - return ; - } - if (activeAction === "mint") { - return ; + let keepVaultId = false; + if (vaultData.collateralSymbol === "ETH" || vaultData.collateralSymbol === "WETH") { + keepVaultId = value === "ETH" || value === "WETH"; } - return ; - }; - const MaxButton = () => { - if (activeAction === "add") { - return ( - - ); - } - if (activeAction === "remove") { - return ( - - ); - } - if (activeAction === "mint") { - return ( - - ); - } - return ( - - ); + setVaultData({ + vaultId: !keepVaultId ? "0" : vaultData.vaultId, + assetSymbol: vaultData.assetSymbol, + collateralSymbol: value, + isHardVault: vaultData.isHardVault, + }); }; const AssetDropdown = () => ( @@ -990,14 +103,14 @@ const Vault = ({ currentAddress, vaultInitData, updateInitVaultData, goBack }: p
- - TCAP + + {vaultData.assetSymbol}
{assetOptions.map((item) => ( - + {item} ))} @@ -1012,8 +125,8 @@ const Vault = ({ currentAddress, vaultInitData, updateInitVaultData, goBack }: p handleTokenChange(eventKey || "ETH")}>
- - {vaultInitData.collateralSymbol.toUpperCase()} + + {vaultData.collateralSymbol.toUpperCase()}
@@ -1028,166 +141,47 @@ const Vault = ({ currentAddress, vaultInitData, updateInitVaultData, goBack }: p
); - const AssetBalance = (isCollateral: boolean) => { - const aBalance = isCollateral ? tokenBalance : assetBalance; - - return ( -
- Balance: - - - -
- ); - }; - - const CollateralAmount = () => ( -
- Collateral: - - - -
- ); - - const MintedAmount = () => ( -
- Debt: - - - -
- ); - - const RenderCreateVault = () => ( -
-

- <>{text} -

- -
- ); - return ( -
+
- -
Vault
-
-
- - {radios.map((radio, idx) => ( - handleRadioBtnChange(e.currentTarget.value)} - > - {radio.name} - - ))} - +
+ + {radios.map((radio, idx) => ( + handleRadioBtnChange(e.currentTarget.value)} + > + {radio.name} + + ))} + +
+
-
-
- - {AssetBalance(false)} - {isApproved && } -
-
- - {AssetBalance(true)} - {isApproved && } -
+
+ +
- {!isApproved ? ( - + {loading ? ( +
+ +
) : ( - <> -
-
-
- - {activeAction !== "" && } -
- {activeAction === actions[3] && ( -
- - <>{t("vault.debt.fee")}: - - {" "} - {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} -
- )} -
- {activeAction !== "" && ( -
- - - )} -
-
-
-
Ratio:
-
-
-
-

- -

-
- - -

- {vaultStatus} -

-
-
- + )}
diff --git a/src/components/Welcome/Protocol.tsx b/src/components/Welcome/Protocol.tsx index 4b06bc6..943697c 100644 --- a/src/components/Welcome/Protocol.tsx +++ b/src/components/Welcome/Protocol.tsx @@ -126,7 +126,6 @@ const Protocol = ({ data }: props) => { usdcOraclePrice, ] = await signer.ethcallProvider?.all(ethcalls); } else if (isArbitrum(currentNetwork.chainId)) { - console.log("Entra aqui"); // @ts-ignore [daiOraclePrice, currentTotalSupply, wethOraclePrice] = await signer.ethcallProvider?.all( ethcalls @@ -148,10 +147,6 @@ const Protocol = ({ data }: props) => { ); } - console.log("DAI: ", daiOraclePrice.toString()); - console.log("wethOraclePrice: ", wethOraclePrice.toString()); - console.log("currentTotalSupply: ", currentTotalSupply.toString()); - let currentDAIStake = BigNumber.from(0); let currentWETHStake = BigNumber.from(0); let currentAAVEStake = BigNumber.from(0); @@ -169,8 +164,8 @@ const Protocol = ({ data }: props) => { case NETWORKS.mainnet.chainId: contracts = cryptexJson[1].mainnet.contracts; break; - case NETWORKS.rinkeby.chainId: - contracts = cryptexJson[4].rinkeby.contracts; + case NETWORKS.goerli.chainId: + contracts = cryptexJson[5].goerli.contracts; break; case NETWORKS.optimism.chainId: contracts = cryptexJson[10].optimism.contracts; @@ -191,7 +186,7 @@ const Protocol = ({ data }: props) => { contracts = cryptexJson[80001].mumbai.contracts; break; default: - contracts = cryptexJson[4].rinkeby.contracts; + contracts = cryptexJson[5].goerli.contracts; break; } diff --git a/src/components/Welcome/Summary.tsx b/src/components/Welcome/Summary.tsx index 8de1565..deb03a1 100644 --- a/src/components/Welcome/Summary.tsx +++ b/src/components/Welcome/Summary.tsx @@ -17,7 +17,13 @@ import { tokensContext, Web3ModalContext, } from "../../state"; -import { makeShortAddress, getPriceInUSDFromPair, getENS, isInLayer1 } from "../../utils/utils"; +import { + makeShortAddress, + getPriceInUSDFromPair, + getENS, + isInLayer1, + isGoerli, +} from "../../utils/utils"; import "../../styles/summary.scss"; import Protocol from "./Protocol"; import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; @@ -75,7 +81,10 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { setTcapPrice(tPrice); let currentPriceCTX = 0; - if (signerAddress === "" || isInLayer1(currentNetwork.chainId)) { + if ( + !isGoerli(currentNetwork.chainId) && + (signerAddress === "" || isInLayer1(currentNetwork.chainId)) + ) { const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); // @ts-ignore diff --git a/src/components/Welcome/index.tsx b/src/components/Welcome/index.tsx index ce86665..d880987 100644 --- a/src/components/Welcome/index.tsx +++ b/src/components/Welcome/index.tsx @@ -19,7 +19,7 @@ const WelcomeWrapper = ({ signerAddress, loadingContracts }: props) => { const currentNetwork = useContext(networkContext); const [apolloClient, setApolloClient] = useState( clientOracle( - process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.rinkeby + process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.goerli ) ); @@ -28,8 +28,8 @@ const WelcomeWrapper = ({ signerAddress, loadingContracts }: props) => { case NETWORKS.mainnet.chainId: setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); break; - case NETWORKS.rinkeby.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.rinkeby)); + case NETWORKS.goerli.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.goerli)); break; case NETWORKS.arbitrum.chainId: setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum)); diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index 88c58df..74a6bd0 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -21592,13 +21592,13 @@ } } }, - "4": { - "rinkeby": { - "name": "rinkeby", - "chainId": "4", + "5": { + "goerli": { + "name": "goerli", + "chainId": "5", "contracts": { "AAVE": { - "address": "0x8B4A041A619aC26B33e5BAEe9585e569387ec837", + "address": "0xFc000421075072aB30e288246FAc183916fa47fE", "abi": [ { "inputs": [], @@ -21914,7 +21914,7 @@ ] }, "AaveOracle": { - "address": "0x73Ebb8b08f056F451c2aA53dCAd7A35ce6aD52D0", + "address": "0x59c7a429f38239902C415F031A4087D7E379C35f", "abi": [ { "inputs": [ @@ -22155,7 +22155,7 @@ ] }, "AaveVaultHandler": { - "address": "0x119D37aFc784C81626b08813D83598b8673EEE66", + "address": "0xEc835efca3A67D7efA7F1b7a84dBf0A3CCe9e9E5", "abi": [ { "inputs": [ @@ -23324,914 +23324,101 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userToVault", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "vaults", - "outputs": [ - { - "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Debt", - "type": "uint256" - }, - { - "internalType": "address", - "name": "Owner", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ] - }, - "WBTCOracle": { - "address": "0x6941264Cb2cB98F62d6014C6edcB24740e4592dE", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_aggregator", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "getLatestAnswer", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLatestRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLatestTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousAnswer", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_aggregator", - "type": "address" - } - ], - "name": "setReferenceContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "WBTCRewardHandler": { - "address": "0x386e8b1eDe61BDaAB9EFE5d999145fDDbd10A64C", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardsToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_vault", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "reward", - "type": "uint256" - } - ], - "name": "RewardAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "reward", - "type": "uint256" - } - ], - "name": "RewardPaid", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "newDuration", - "type": "uint256" - } - ], - "name": "RewardsDurationUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Staked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Unpaused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Withdrawn", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "earned", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_staker", - "type": "address" - } - ], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getReward", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getRewardForDuration", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_staker", - "type": "address" - } - ], - "name": "getRewardFromVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastUpdateTime", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_a", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_b", - "type": "uint256" - } - ], - "name": "min", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_reward", - "type": "uint256" - } - ], - "name": "notifyRewardAmount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "userToVault", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "periodFinish", - "outputs": [ + "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + "name": "vaults", + "outputs": [ { - "internalType": "address", - "name": "_tokenAddress", - "type": "address" + "internalType": "uint256", + "name": "Id", + "type": "uint256" }, { "internalType": "uint256", - "name": "_tokenAmount", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - }, + } + ] + }, + "WBTCOracle": { + "address": "0x16aDe09b5844FA8096521649F15F77CEBFDC49A4", + "abi": [ { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "_aggregator", "type": "address" } ], - "name": "renounceRole", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "account", + "name": "newOwner", "type": "address" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { "inputs": [], - "name": "rewardPerToken", + "name": "getLatestAnswer", "outputs": [ { - "internalType": "uint256", + "internalType": "int256", "name": "", - "type": "uint256" + "type": "int256" } ], "stateMutability": "view", @@ -24239,12 +23426,32 @@ }, { "inputs": [], - "name": "rewardPerTokenStored", + "name": "getLatestRound", "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, { "internalType": "uint256", "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], "stateMutability": "view", @@ -24252,7 +23459,7 @@ }, { "inputs": [], - "name": "rewardRate", + "name": "getLatestTimestamp", "outputs": [ { "internalType": "uint256", @@ -24266,43 +23473,36 @@ { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "rewards", + "name": "getPreviousAnswer", "outputs": [ { - "internalType": "uint256", + "internalType": "int256", "name": "", - "type": "uint256" + "type": "int256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "rewardsDuration", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardsToken", + "name": "getPreviousTimestamp", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -24311,56 +23511,71 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_rewardsDuration", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "setRewardsDuration", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "getRound", + "outputs": [ { - "internalType": "address", - "name": "_staker", - "type": "address" + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" }, { "internalType": "uint256", - "name": "_amount", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "stake", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "totalSupply", + "name": "owner", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { "internalType": "address", - "name": "newOwner", + "name": "_aggregator", "type": "address" } ], - "name": "transferOwnership", + "name": "setReferenceContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -24368,49 +23583,31 @@ { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userRewardPerTokenPaid", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "vault", + "name": "supportsInterface", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_staker", + "name": "newOwner", "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" } ], - "name": "withdraw", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -24418,7 +23615,7 @@ ] }, "WBTCVaultHandler": { - "address": "0x1b9cd5A9acC56405806D0E4618616f761001eB62", + "address": "0x4b1d93F7318e78d2B895A98a302b31c61886C39A", "abi": [ { "inputs": [ @@ -25642,7 +24839,7 @@ ] }, "Ctx": { - "address": "0xAa715DbD2ED909B7B7727dC864F3B78276D14A19", + "address": "0xa400D66cE877f572c31Bb5483f17Fee4328da468", "abi": [ { "inputs": [ @@ -27188,7 +26385,7 @@ ] }, "DAI": { - "address": "0x118a4238E4086FAE2621D0336C0E6cdC1257BE82", + "address": "0xD2a7627C992Dc37554c7c79bBCcC9875550D9259", "abi": [ { "inputs": [], @@ -27504,7 +26701,7 @@ ] }, "DAIOracle": { - "address": "0xb50365a53EB0d8f214FFD0Cc0F2936BD877B3e17", + "address": "0xFA306c9C3d8ED101b331024dDabF53321BCcb40e", "abi": [ { "inputs": [ @@ -27740,7 +26937,7 @@ ] }, "DAIRewardHandler": { - "address": "0x423eDDfAA00fE22945739070BB911AcBF1fDf4D4", + "address": "0x92A04c468Da411D43F4Aec977F32F36751B82CeC", "abi": [ { "inputs": [ @@ -28543,7 +27740,7 @@ ] }, "DAIVaultHandler": { - "address": "0x7fF4580aD66a3C0F62DDa843674A3811ac062211", + "address": "0x7933380EbB0e1c14b21160e7Fb56fAfcb3555f55", "abi": [ { "inputs": [ @@ -31245,7 +30442,7 @@ ] }, "GovernorAlpha": { - "address": "0x6f0663fb471c8329De64fb86a2c1b741bb02cB20", + "address": "0xc27e8BfB7a85f54498b2378d2a533126800d14E3", "abi": [ { "inputs": [ @@ -31881,7 +31078,7 @@ ] }, "LINK": { - "address": "0x5717DC7Cc0489dCc00316bcDB7e752aec664673e", + "address": "0xD4B24c3056aA82E300eb5Dac115324E5EBc360A0", "abi": [ { "inputs": [], @@ -32197,7 +31394,7 @@ ] }, "LinkOracle": { - "address": "0xEecF07643384C689C7AB804887ef2187cE75D5Ec", + "address": "0x800b69270c7AF09F19c6B5a25f67A30E392A2a66", "abi": [ { "inputs": [ @@ -32438,7 +31635,7 @@ ] }, "LinkVaultHandler": { - "address": "0xBd4a21cC2D12157765a8861A83FC4cfd216630b1", + "address": "0x7Ccb3Cd07cb2461190E4EF2A5D9c846203CC12f4", "abi": [ { "inputs": [ @@ -33662,7 +32859,7 @@ ] }, "Orchestrator": { - "address": "0x32ac6dBaf90A4C45f160D13B32fDD10D75D09976", + "address": "0xf6bbed61b6118f5f6df4DF1bDc6e8fd598057F14", "abi": [ { "inputs": [ @@ -34035,7 +33232,7 @@ ] }, "TCAP": { - "address": "0x565224C2b5Bdf33f3970d35f82945075F90128F4", + "address": "0xE181E0E3254c061E65F1Ad32DD2c3e1Da192fb48", "abi": [ { "inputs": [ @@ -34616,7 +33813,7 @@ ] }, "TCAPOracle": { - "address": "0x87388c142a3848F966FBA7Db22663D9CCa7d8a86", + "address": "0xFe36935D83109D389E0a71A3b83464D5905131Ac", "abi": [ { "inputs": [ @@ -34852,7 +34049,7 @@ ] }, "Timelock": { - "address": "0x65a2B1B48b7997a50947E83aaf58E29a54a0B735", + "address": "0xeCfaAE58487B64d777cDc8fb9f9e3B154f5563F1", "abi": [ { "inputs": [ @@ -35305,7 +34502,7 @@ ] }, "WBTC": { - "address": "0x81A345e4627C614DaBA4E862A8c317023E935506", + "address": "0xfE4e1A6E857a143A7C425Fd89305d2567b791fc2", "abi": [ { "inputs": [], @@ -35621,7 +34818,7 @@ ] }, "WETH": { - "address": "0x5D3E425A099c2863224d6D63b330Df0F22B299b9", + "address": "0x9a87De45A1bA9973fb457623Dc86ED992C0BDEe3", "abi": [ { "anonymous": false, @@ -35906,7 +35103,7 @@ ] }, "WETHOracle": { - "address": "0x731Aa03C683Afb292732C31c1d50C491B8d8043F", + "address": "0x73e29C6b575d371E63CCA22D1894966699CC5c19", "abi": [ { "inputs": [ @@ -36142,7 +35339,7 @@ ] }, "WETHRewardHandler": { - "address": "0x39347a6328e1D4601A389d4dB0B26aC305886fb0", + "address": "0x9c0cA2795d023483879adf7671Aa80Cd4fBe15EB", "abi": [ { "inputs": [ @@ -36945,7 +36142,7 @@ ] }, "WETHVaultHandler": { - "address": "0x093f8F7C7fCC6edf991309A5056feB5cA9579292", + "address": "0x18bE4DAB1D2158D5f4c43D7c9c12D417E65F179d", "abi": [ { "inputs": [ @@ -38193,7 +37390,7 @@ ] }, "HardWETHVaultHandler": { - "address": "0x6E3B4E276f22C30085882dD1342995773AE76414", + "address": "0x6cd97e6322d39Fea04E66a2C02b41ae22d914384", "abi": [ { "inputs": [ @@ -39499,7 +38696,7 @@ ] }, "HardDaiVaultHandler": { - "address": "0x95ac341B6492954DF1341A33cAC9AB3273179232", + "address": "0x734777faCE6d6B459F3C2C5a952308041D9985fc", "abi": [ { "inputs": [ @@ -40781,7 +39978,7 @@ ] }, "USDC": { - "address": "0x360294ded58EA73A10e04b97A069052Bb2d88a1E", + "address": "0xF027880989ebc4b2084cB43281b18bc58ca45ABA", "abi": [ { "inputs": [], @@ -41097,7 +40294,7 @@ ] }, "USDCOracle": { - "address": "0x1b793DBc38B94E5C81ee383934404f84a7acE01E", + "address": "0x0e7D0a817Ad6693d7ccd9c13389394F8E4F48248", "abi": [ { "inputs": [ @@ -41338,7 +40535,7 @@ ] }, "HardUSDCVaultHandler": { - "address": "0xB34756f8D9682ab6C26F77f9461207a65c52c8bC", + "address": "0x64D2566363d19b817645933b8E503235fFf9b6A7", "abi": [ { "inputs": [ diff --git a/src/hooks/usePrices.tsx b/src/hooks/usePrices.tsx index e269ee6..7769837 100644 --- a/src/hooks/usePrices.tsx +++ b/src/hooks/usePrices.tsx @@ -23,7 +23,6 @@ export const usePrices = (): OraclePricesType => { const loadPrices = async () => { if (signer && oracles && validOracles(currentNetwork.chainId || 1, oracles)) { - console.log("4. usePrices"); const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); @@ -78,6 +77,7 @@ export const usePrices = (): OraclePricesType => { usdcOraclePrice, wbtcOraclePrice, ] = await signer.ethcallProvider?.all(ethcalls); + console.log("4. usePrices"); } else if (isOptimism(currentNetwork.chainId)) { // @ts-ignore [ diff --git a/src/hooks/useVault.tsx b/src/hooks/useVault.tsx index 7f20c4f..35ba890 100644 --- a/src/hooks/useVault.tsx +++ b/src/hooks/useVault.tsx @@ -63,7 +63,7 @@ export const useVault = ( cAssetRead = tokens.tcapTokenRead; cAssetOracleRead = oracles.tcapOracleRead; } - + console.log("UseVault: ", isHardVault); switch (collateralSymbol) { case "DAI": if (isHardVault) { diff --git a/src/state/Web3ModalContext.tsx b/src/state/Web3ModalContext.tsx index 749d83a..0d85a11 100644 --- a/src/state/Web3ModalContext.tsx +++ b/src/state/Web3ModalContext.tsx @@ -17,9 +17,6 @@ switch (process.env.REACT_APP_NETWORK_ID) { case "3": network = "ropsten"; break; - case "4": - network = "rinkeby"; - break; case "5": network = "goerli"; break; @@ -56,7 +53,7 @@ const providerOptions = { rpcUrl: process.env.REACT_APP_NETWORK_ID === "1" ? NETWORKS.mainnet.infuraFortmaticRpcUrl - : NETWORKS.rinkeby.infuraFortmaticRpcUrl, + : NETWORKS.goerli.infuraFortmaticRpcUrl, }, // if we don't pass it, it will default to localhost:8454 }, }, diff --git a/src/styles/app.scss b/src/styles/app.scss index e5bb329..0324d9e 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -61,12 +61,12 @@ body { .btn { color: $white; font-family: "Nineteen Ninety Seven"; - border-width: 1px; + border-width: 1.2px; background-color: transparent; } .btn:disabled { - color: $dark; + color: $lighter; } .btn:hover { @@ -137,7 +137,7 @@ body { align-items: center; justify-content: space-between; height: 2.5rem; - width: 170px; + width: 100%; border: 1px solid #dfd1ea; padding-right: 0.8rem; border-radius: 5px; @@ -197,15 +197,15 @@ body { } .number.neon-orange, .danger { - text-shadow: 0px 4px 13px $orange; + text-shadow: 0px 2px 13px $orange; } .number.error { - text-shadow: 0px 4px 13px red; + text-shadow: 0px 2px 13px red; } .number.neon-blue, .safe { - text-shadow: 0px 4px 13px rgb(6, 136, 255); + text-shadow: 0px 2px 13px rgb(6, 136, 255); } .number.neon-dark-blue { diff --git a/src/styles/header.scss b/src/styles/header.scss index 6c74a8a..b032cc1 100644 --- a/src/styles/header.scss +++ b/src/styles/header.scss @@ -58,7 +58,6 @@ border-right: 0.5em solid transparent; border-bottom: 0; border-left: 0.5em solid transparent; - margin-top: -17px; margin-left: 155px; } diff --git a/src/styles/mint2.scss b/src/styles/mint2.scss index c2ba95f..88d000f 100644 --- a/src/styles/mint2.scss +++ b/src/styles/mint2.scss @@ -1,12 +1,18 @@ @import "./colors"; @import "./fonts"; +.wrapper::before { + background-image: none; + background-color: black; +} + .vault2 { display: flex; flex-direction: column; align-items: center; width: 100%; padding-bottom: 0px; + margin-left: -1.5rem; .alert-warning { margin-top: 0rem; @@ -24,19 +30,17 @@ display: flex; flex-direction: column; margin-top: 4rem; - width: 30%; + width: 33%; background-color: $darker; } .vault { - &-header { display: flex; flex-direction: row; align-items: center; justify-content: space-between; - height: 4rem; - padding: 1.5rem 0.8rem; + padding: 2rem 2rem 1.5rem 2rem; background-color: $darker; border-bottom: 0.5px solid $dark; .header-col1 { @@ -46,9 +50,14 @@ .go-back { // background-color: transparent; border: none; + padding-top: 0px; + padding-bottom: 0px; + margin-top: -2rem; + margin-right: -1.2rem; } svg { color: white; + transform: rotate(45deg); } } @@ -71,7 +80,7 @@ .text-muted { position: absolute; text-align: left; - font-size: .85rem; + font-size: .9rem; margin-top: -1.7rem; padding-left: 1rem; } @@ -82,19 +91,19 @@ border-radius: 5px; input[type="number"] { - font-size: 1rem; + font-size: 1.3rem; padding-bottom: 1.8rem; border-top-left-radius: 5px; border-bottom-left-radius: 5px; border-color: transparent; color: $white; - height: 3.7rem; + height: 4.1rem; } .btn { background-color: $darker; width: 7.5rem; - height: 3.7rem; + height: 4.1rem; border-top-right-radius: 5px; border-bottom-right-radius: 5px; } @@ -127,6 +136,7 @@ flex-direction: column; border-radius: 10px; margin-bottom: 1rem; + width: 95%; h6 { color: $white; @@ -200,16 +210,15 @@ } .vault-actions { - margin-top: 2rem; background-color: $darker; .btn-max { display: flex; padding: 0.4rem 0.8rem; border: 1px solid $green; - border-radius: 20px; + border-radius: 5px; background-color: $darkest; - font-size: 0.7rem; + font-size: 0.9rem; color: $green; &.orange { @@ -248,18 +257,18 @@ .dropdown { height: 100%; - width: 110px; + width: 140px; margin-right: 0.5rem; .dropdown-toggle { padding-right: 1rem; - border-radius: 20px; + border-radius: 5px; width: 100%; height: 100%; span { font-family: "space mono"; - font-size: 0.7rem; + font-size: 1rem; } } } @@ -294,7 +303,7 @@ .btn-secondary { margin-bottom: 0rem; - font-size: 0.7rem; + font-size: 0.8rem; background-color: #281e31; } @@ -314,7 +323,6 @@ } .create-vault { - .btn { width: 13.4375rem; height: 3.875rem; @@ -417,7 +425,14 @@ justify-content: space-between; padding: 0rem 1rem; } + .asset-box { + width: 100%; + &.right { + align-items: flex-end; + } + } .vault-form { + margin-top: 3.5rem; padding: 0rem 1rem; } .assets-balance { @@ -468,6 +483,7 @@ background-color: $darker; padding: 2rem 1.5rem; margin-bottom: 1rem; + h6 { color: $white; @@ -486,12 +502,13 @@ .asset-box-balance { display: flex; justify-content: space-between; - width: 100%; + width: 94%; padding: 0.2rem 0.2rem; &-title { color: $lighter; font-size: 0.8rem; + margin-right: 0.5rem; } &-value { @@ -512,7 +529,7 @@ border-radius: 5px; h6 { - font-size: 0.9rem; + font-size: 1rem; color: $white; align-self: center; margin-bottom: 0rem; @@ -540,4 +557,9 @@ } } + @media (max-width: 1400px) { + .vault-container { + width: 43%; + } + } } diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 7488219..e688ce3 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -2,7 +2,8 @@ @import "./fonts"; .vault-monitoring { - padding: 1rem 3rem; + margin-left: 1.5rem; + padding: 1rem 2rem; .btn:active { background-color: transparent; @@ -21,6 +22,8 @@ } .actions { display: flex; + align-items: flex-end; + .dropdown { .dropdown-toggle { display: flex; @@ -51,7 +54,7 @@ border-right: 0.4em solid transparent; border-bottom: 0; border-left: 0.4em solid transparent; - margin-top: 7px; + margin-top: 2px; margin-left: 70%; } .dropdown-menu { @@ -109,19 +112,24 @@ .dd { &-container { display: flex; - flex-direction: row; - align-items: center; - margin-left: 1rem; + flex-direction: column; + align-items: flex-start; + justify-content: flex-end; + margin-left: 1.2rem; h6 { margin-right: 5px; } + + &.view { + flex-direction: row; + align-items: center; + } + .btn-create-vault { + font-size: 0.9rem; + } } @media (max-width: 1670px) { &-container { - display: flex; - flex-direction: column; - align-items: flex-start; - justify-content: flex-end; margin-left: 1rem; } } @@ -161,8 +169,8 @@ margin-bottom: 0rem; font-size: 0.8rem; background-color: #281e31; - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; + border-top-left-radius: 0px; + border-bottom-left-radius: 0px; } .btn-check:checked + .btn { background-color: $neon-highlight; @@ -336,7 +344,7 @@ .liquidated { text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; } - } + } } .pag-container{ display: flex; @@ -360,6 +368,23 @@ } } } + .no-vaults-box { + display: flex; + justify-content: center; + width: 100%; + padding-top: 2rem; + padding-bottom: 1rem; + + p { + font-size: 1.2rem; + } + .btn-create-vault { + border: none; + padding-top: 0rem; + padding-bottom: 0.25rem; + color: $highlight; + } + } } .card.totals { .totals-container { diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 064595a..87ce8a4 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -12,6 +12,9 @@ export const NETWORKS = { daiPool: "", ctxPool: "0x2a93167ed63a31f35ca4788e2eb9fbd9fa6089d0", lpUrl: "https://app.sushi.com", + alchemyUrl: "https://eth-mainnet.g.alchemy.com/v2/".concat( + process.env.REACT_APP_ALCHEMY_KEY || "" + ), infuraRpcUrl: "https://mainnet.infura.io/v3/".concat(process.env.REACT_APP_INFURA_ID || ""), infuraFortmaticRpcUrl: "https://mainnet.infura.io/v3/".concat( process.env.REACT_APP_FORTMATIC_INFURA_ID || "" @@ -21,30 +24,18 @@ export const NETWORKS = { chainId: 5, hexChainId: "0x5", name: "goerli", - eth: "0x7f86C79c1D458B03c14e5a6C658100283a1c3cc1", - weth: "0x7f86C79c1D458B03c14e5a6C658100283a1c3cc1", + dai: "0xD2a7627C992Dc37554c7c79bBCcC9875550D9259", + eth: "0xFfb99f4A02712C909d8F7cC44e67C87Ea1E71E83", + weth: "0x9a87De45A1bA9973fb457623Dc86ED992C0BDEe3", mushroomNft: "0x209c23db16298504354112fa4210d368e1d564da", + alchemyUrl: "https://eth-goerli.g.alchemy.com/v2/".concat( + process.env.REACT_APP_ALCHEMY_KEY_GOERLI || "" + ), infuraRpcUrl: "https://goerli.infura.io/v3/".concat(process.env.REACT_APP_INFURA_ID || ""), infuraFortmaticRpcUrl: "https://goerli.infura.io/v3/".concat( process.env.REACT_APP_FORTMATIC_INFURA_ID || "" ), }, - rinkeby: { - chainId: 4, - hexChainId: "0x4", - name: "rinkeby", - eth: "0x5D3E425A099c2863224d6D63b330Df0F22B299b9", - weth: "0x5D3E425A099c2863224d6D63b330Df0F22B299b9", - dai: "0x118a4238E4086FAE2621D0336C0E6cdC1257BE82", - ethPool: "0x7d7db1ba4bc85f7d4ea43bad63acece407364aff", - ethUniPool: "0x3436d87664964df8a1825f826f127dec13117b0b", - daiPool: "0xb9625c0ec3dd89b00d20d1e3ea03d5b4072f03b4", - ctxPool: "0x9c4438470b1593cf4efe0f85108e7416c3b582f8", - infuraRpcUrl: "https://rinkeby.infura.io/v3/".concat(process.env.REACT_APP_INFURA_ID || ""), - infuraFortmaticRpcUrl: "https://rinkeby.infura.io/v3/".concat( - process.env.REACT_APP_FORTMATIC_INFURA_ID || "" - ), - }, arbitrum: { chainId: 42161, hexChainId: "0xA4B1", @@ -106,7 +97,7 @@ export const API_ENDPOINT = "https://api.cryptex.finance"; export const GRAPHQL_ENDPOINT = { mainnet: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-graph", - rinkeby: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-rinkeby-two", + goerli: "https://api.thegraph.com/subgraphs/name/jdestephen/cryptex-goerli-demo", arbitrum: "https://api.thegraph.com/subgraphs/name/jdestephen/arbitrum-goerli-demo", arbitrum_goerli: "https://api.thegraph.com/subgraphs/name/jdestephen/arbitrum-goerli-demo", optimism: "https://api.thegraph.com/subgraphs/name/cryptexfinance/cryptex-optimism", @@ -116,7 +107,6 @@ export const GRAPHQL_ENDPOINT = { }; export const OS_API_URL = { - // mainnet: "https://testnets-api.opensea.io/api/v1/assets", mainnet: "https://deep-index.moralis.io/api/v2", goerli: "https://deep-index.moralis.io/api/v2", }; @@ -127,3 +117,18 @@ export const FEATURES = { OPTIMISM: true, POLYGON: false, }; + +export const TOKENS_SYMBOLS = { + AAVE: "AAVE", + DAI: "DAI", + ETH: "ETH", + JPEGz: "JPEGz", + LINK: "LINK", + MATIC: "MATIC", + SNX: "SNX", + TCAP: "TCAP", + UNI: "UNI", + USDC: "USDC", + WETH: "WETH", + WBTC: "WBTC", +}; diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 9ac936e..3fe8a6b 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -279,7 +279,7 @@ export const isValidNetwork = (chainId: number) => { ); } return ( - chainId === NETWORKS.rinkeby.chainId || + chainId === NETWORKS.goerli.chainId || chainId === NETWORKS.arbitrum_goerli.chainId || (FEATURES.OPTIMISM && chainId === NETWORKS.okovan.chainId) || (FEATURES.POLYGON && chainId === NETWORKS.mumbai.chainId) @@ -288,11 +288,7 @@ export const isValidNetwork = (chainId: number) => { export const isInLayer1 = (chainId: number | undefined) => { if (!isUndefined(chainId)) { - return ( - chainId === NETWORKS.mainnet.chainId || - chainId === NETWORKS.rinkeby.chainId || - chainId === NETWORKS.goerli.chainId - ); + return chainId === NETWORKS.mainnet.chainId || chainId === NETWORKS.goerli.chainId; } return false; }; @@ -338,8 +334,8 @@ export const getDefaultProvider = (chainId: number | undefined, name: string | u case NETWORKS.mainnet.chainId: alchemyKey = process.env.REACT_APP_ALCHEMY_KEY; break; - case NETWORKS.rinkeby.chainId: - alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_RINKEBY; + case NETWORKS.goerli.chainId: + alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_GOERLI; break; case NETWORKS.polygon.chainId: alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_POLYGON; diff --git a/yarn.lock b/yarn.lock index 4be69f6..67bf8bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2114,9 +2114,9 @@ integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== "@sinonjs/commons@^1.7.0": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.5.tgz#e280c94c95f206dcfd5aca00a43f2156b758c764" - integrity sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA== + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== dependencies: type-detect "4.0.8" @@ -2319,9 +2319,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz#235bf339d17185bdec25e024ca19cce257cc7309" - integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== + version "7.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== dependencies: "@babel/types" "^7.3.0" @@ -2613,9 +2613,9 @@ "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.14.tgz#0943473052c24bd8cf2d1de25f1a710259327237" - integrity sha512-9Pj7abXoW1RSTcZaL2Hk6G2XyLMlp5ECdVC/Zf2p/KBjC3srijLGgRAXOBjtFrJoIrvxdTKyKDA14bEcbxBaWw== + version "17.0.15" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.15.tgz#5b62c89fb049e2fc8378394a2861a593055f0866" + integrity sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg== dependencies: "@types/yargs-parser" "*" From f2c9108c16ea88a39bd9632d7bfd5b1d5714953d Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 2 Dec 2022 09:55:12 -0600 Subject: [PATCH 187/278] remove console.log --- src/App.tsx | 1 - src/components/Farm/UniV3Rewards/Rewards.tsx | 4 ++-- src/components/Vaults/monitoring/index.tsx | 2 -- src/components/Vaults/vault/Vault2.tsx | 7 ------- src/hooks/usePrices.tsx | 1 - src/hooks/useVault.tsx | 2 +- 6 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 5b71fbe..75fccd7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -901,7 +901,6 @@ const App = () => { const currentSigner = currentProvider.getSigner(); signer.setCurrentSigner(currentSigner); const ethcallProvider = new Provider(currentProvider); - if (isArbitrum(network.chainId)) { await setArbitrumContracts(network.chainId, currentSigner, ethcallProvider); } else if (isPolygon(network.chainId)) { diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index b8c6a5f..8eb89b6 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -86,7 +86,7 @@ const Rewards = ({ const confIncetive = (): any => { let ethTcapPool = UNIV3.mainnet.tcapPool; switch (currentNetwork.chainId) { - case NETWORKS.rinkeby.chainId: + case NETWORKS.goerli.chainId: ethTcapPool = UNIV3.rinkeby.tcapPool; break; default: @@ -229,7 +229,7 @@ const Rewards = ({ const tcapAddress = tokens.tcapToken?.address; let { feeTier } = UNIV3.mainnet.tcapPool; let wethAddress = NETWORKS.mainnet.eth; - if (currentNetwork.chainId === NETWORKS.rinkeby.chainId) { + if (currentNetwork.chainId === NETWORKS.goerli.chainId) { feeTier = UNIV3.rinkeby.tcapPool.feeTier; wethAddress = "0xc778417E063141139Fce010982780140Aa0cD5Ab"; } diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index 25cb7de..8793d08 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -176,8 +176,6 @@ const Monitoring = ({ setVaultToUpdate }: props) => { } } - console.log("Filter: ", filter); - return filter; }; diff --git a/src/components/Vaults/vault/Vault2.tsx b/src/components/Vaults/vault/Vault2.tsx index 6e9a078..66dd0b5 100644 --- a/src/components/Vaults/vault/Vault2.tsx +++ b/src/components/Vaults/vault/Vault2.tsx @@ -144,13 +144,9 @@ const Vault2 = ({ currentAddress, vaultInitData, goBack }: props) => { ); let currentVaultData: any; - console.log("Collateral: ", vaultData.collateralSymbol); - console.log("Mode: ", vaultData.isHardVault); - console.log("Vault: ", currentVault?.address); // @ts-ignore const vaultID = await currentVault.userToVault(currentAddress); setCurrentVaultId(vaultID.toString()); - console.log("vaultID: ", vaultID.toString()); if (vaultID.toString() !== "0") { // @ts-ignore const cVault = await currentVault.vaults(vaultID); @@ -665,7 +661,6 @@ const Vault2 = ({ currentAddress, vaultInitData, goBack }: props) => { setBtnDisabled(true); try { const amount = ethers.utils.parseEther(mintTxt); - console.log("WEI Amount: ", amount.toString()); const tx = await currentVault?.mint(amount); notifyUser(tx, refresh); } catch (error) { @@ -1011,8 +1006,6 @@ const Vault2 = ({ currentAddress, vaultInitData, goBack }: props) => { ); const creatOrApprovee = async () => { - console.log(" Create Vault: ", currentVault?.address); - console.log(" currentVaultId: ", currentVaultId); if (currentVaultId === "0") { setBtnDisabled(true); try { diff --git a/src/hooks/usePrices.tsx b/src/hooks/usePrices.tsx index 7769837..b6250a8 100644 --- a/src/hooks/usePrices.tsx +++ b/src/hooks/usePrices.tsx @@ -77,7 +77,6 @@ export const usePrices = (): OraclePricesType => { usdcOraclePrice, wbtcOraclePrice, ] = await signer.ethcallProvider?.all(ethcalls); - console.log("4. usePrices"); } else if (isOptimism(currentNetwork.chainId)) { // @ts-ignore [ diff --git a/src/hooks/useVault.tsx b/src/hooks/useVault.tsx index 35ba890..7f20c4f 100644 --- a/src/hooks/useVault.tsx +++ b/src/hooks/useVault.tsx @@ -63,7 +63,7 @@ export const useVault = ( cAssetRead = tokens.tcapTokenRead; cAssetOracleRead = oracles.tcapOracleRead; } - console.log("UseVault: ", isHardVault); + switch (collateralSymbol) { case "DAI": if (isHardVault) { From c28dcf0e0bf34550cb3af96df2c0c61d47f1decf Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 2 Dec 2022 10:20:45 -0600 Subject: [PATCH 188/278] test --- src/App.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/App.tsx b/src/App.tsx index 75fccd7..9eb37ad 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -888,6 +888,7 @@ const App = () => { }; web3Modal.on("connect", async (networkProvider) => { + console.log("2. web3Modal"); setLoadingContracts(true); const currentProvider = new ethers.providers.Web3Provider(networkProvider); const network = await currentProvider.getNetwork(); @@ -937,6 +938,7 @@ const App = () => { useEffect(() => { async function loadProvider() { + console.log("1. entra"); if (web3Modal.cachedProvider && !signer.signer) { if (!isLoadingContracts) { await web3Modal.connect(); From bd737d18ec8d7bd2f9f7b344b2336c5251eb62a7 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 2 Dec 2022 16:27:51 -0600 Subject: [PATCH 189/278] fixing details --- src/components/Vaults/index.tsx | 4 +- src/components/Vaults/monitoring/Vaults.tsx | 2 +- src/components/Vaults/monitoring/index.tsx | 175 +-- src/components/Vaults/vault/Vault2.tsx | 1235 ------------------- src/components/Vaults/vault/VaultForm.tsx | 1074 ---------------- src/components/Vaults/vault/index.tsx | 1081 +++++++++++++++- 6 files changed, 1152 insertions(+), 2419 deletions(-) delete mode 100644 src/components/Vaults/vault/Vault2.tsx delete mode 100644 src/components/Vaults/vault/VaultForm.tsx diff --git a/src/components/Vaults/index.tsx b/src/components/Vaults/index.tsx index 3576cab..967db10 100644 --- a/src/components/Vaults/index.tsx +++ b/src/components/Vaults/index.tsx @@ -1,6 +1,6 @@ import React, { useContext, useEffect, useState } from "react"; import Monitoring from "./monitoring"; -import Vault2 from "./vault/Vault2"; +import Vault from "./vault"; import { signerContext } from "../../state"; import { VaultToUpdateType } from "./types"; @@ -41,7 +41,7 @@ const Vaults = () => { if (isMinting) { return ( - setMinting(false)} diff --git a/src/components/Vaults/monitoring/Vaults.tsx b/src/components/Vaults/monitoring/Vaults.tsx index 18d43c0..07d47f5 100644 --- a/src/components/Vaults/monitoring/Vaults.tsx +++ b/src/components/Vaults/monitoring/Vaults.tsx @@ -186,7 +186,7 @@ export const Vaults = ({ }; return ( ); }; diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index 8793d08..3422c67 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -1,14 +1,5 @@ import React, { useContext, useEffect, useRef, useState } from "react"; -import { - Button, - Card, - Col, - Dropdown, - Form, - Row, - ToggleButton, - ToggleButtonGroup, -} from "react-bootstrap/esm"; +import { Button, Card, Col, Dropdown, Form, Row } from "react-bootstrap/esm"; import Spinner from "react-bootstrap/Spinner"; import { FaArrowsAltH } from "react-icons/fa"; import { ethers, BigNumber } from "ethers"; @@ -87,6 +78,10 @@ const Monitoring = ({ setVaultToUpdate }: props) => { const hardVaults = useContext(hardVaultsContext); const prices = usePrices(); const ratios = useRatios(); + const vaultsOwnerFilter = [ + { name: t("all-vaults"), value: "0" }, + { name: t("my-vaults"), value: "1" }, + ]; const [vaultsUpdated, setVaultsUpdated] = useState(false); const [vaultsTotals, setVaultsTotals] = useState(totalsDefault); const [vaultList, setVaultList] = useState>([]); @@ -96,7 +91,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { const [filteringRatios, setFilteringRatios] = useState(false); const [currentAddress, setCurrentAddress] = useState(""); const [ownerAddress, setOwnerAddress] = useState(""); - const [radioValue, setRadioValue] = useState("2"); + const [currentOwnerFilter, setCurrentOwnerFilter] = useState(vaultsOwnerFilter[1]); const [tokenSymbol, setTokenSymbol] = useState("all"); const [currentStatus, setCurrentStatus] = useState("all"); const [vaultMode, setVaultMode] = useState("all"); @@ -106,10 +101,6 @@ const Monitoring = ({ setVaultToUpdate }: props) => { const ratioRangeDropdown = useRef(null); const minRatioInput = useRef(null); const maxRatioInput = useRef(null); - const radios = [ - { name: t("all-vaults"), value: "1" }, - { name: t("my-vaults"), value: "2" }, - ]; const viewsList = [ { key: "5", name: "5" }, { key: "10", name: "10" }, @@ -139,7 +130,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { let statusFilter = ""; let modeFilter = ""; - if (radioValue === "2" && ownerAddress !== "") { + if (currentOwnerFilter.value === "1" && ownerAddress !== "") { ownerFilter = `, owner: "${ownerAddress}"`; } if (tokenSymbol !== "all") { @@ -490,11 +481,12 @@ const Monitoring = ({ setVaultToUpdate }: props) => { if (!vaultsUpdated) { const address = await signer.signer.getAddress(); setCurrentAddress(address); - setOwnerAddress(radioValue === "2" ? address : ""); + setOwnerAddress(currentOwnerFilter.value === "1" ? address : ""); loadVaultData(); } } else { + setCurrentOwnerFilter(vaultsOwnerFilter[0]); loadVaultData(); } }; @@ -538,9 +530,9 @@ const Monitoring = ({ setVaultToUpdate }: props) => { confPagination(vaultList, parseInt(number)); }; - const handleRadioBtnChange = (value: string) => { - setRadioValue(value); - if (value === "1") { + const handleVaultOwnerFilterChange = (value: string) => { + setCurrentOwnerFilter(vaultsOwnerFilter[parseInt(value)]); + if (value === "0") { setOwnerAddress(""); } else { setOwnerAddress(currentAddress); @@ -816,74 +808,83 @@ const Monitoring = ({ setVaultToUpdate }: props) => {
)} - {currentStatus !== VAULT_STATUS.empty && currentStatus !== VAULT_STATUS.ready && ( -
-
Ratio Range
- - +
Ratio Range
+ + +
+ + {currentMinRatio} {currentMaxRatio} + +
+
+ +
+ + + +
+ +
+
+
+
+
Vaults
+ handleVaultOwnerFilterChange(eventKey || "1")} + > + +
+ {capitalize(currentOwnerFilter.name)} +
+
+ + -
- - {currentMinRatio} {currentMaxRatio} - -
- - -
- - - -
- -
-
-
- )} - {currentAddress !== "" && ( - <> -
- handleRadioBtnChange(val)} - name="vaults-options" + {vaultsOwnerFilter[0].name} + + - {radios.map((radio, idx) => ( - - {radio.name} - - ))} - -
-
- -
- - )} + {vaultsOwnerFilter[1].name} + + + +
+
+ +
{loading || filteringRatios ? ( @@ -897,7 +898,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { pagination={pagination} refresh={updateLiquidatedVault} setVaultToUpdate={setVaultToUpdate} - myVaults={radioValue === "2"} + myVaults={currentOwnerFilter.value === "1"} /> )} diff --git a/src/components/Vaults/vault/Vault2.tsx b/src/components/Vaults/vault/Vault2.tsx deleted file mode 100644 index 66dd0b5..0000000 --- a/src/components/Vaults/vault/Vault2.tsx +++ /dev/null @@ -1,1235 +0,0 @@ -import React, { useContext, useState, useEffect } from "react"; -import { ethers, BigNumber } from "ethers"; -import { - Button, - ButtonGroup, - Dropdown, - Form, - InputGroup, - Spinner, - ToggleButton, -} from "react-bootstrap/esm"; -import NumberFormat from "react-number-format"; -import { useTranslation } from "react-i18next"; -import { FaPlus } from "react-icons/fa"; -import "../../../styles/mint2.scss"; -import { useVault } from "../../../hooks"; -import { networkContext, signerContext } from "../../../state"; -import { capitalize, TokenIcon } from "../common"; -import { NETWORKS, TOKENS_SYMBOLS } from "../../../utils/constants"; -import { - errorNotification, - getDefaultProvider, - getRatio, - getSafeRemoveCollateral, - getSafeMint, - isArbitrum, - isInLayer1, - isPolygon, - isOptimism, - notifyUser, - toUSD, -} from "../../../utils/utils"; - -type VaultInitType = { - vaultId: string; - assetSymbol: string; - collateralSymbol: string; - isHardVault: boolean; -}; - -type props = { - currentAddress: string; - vaultInitData: VaultInitType; - goBack: () => void; -}; - -const Vault2 = ({ currentAddress, vaultInitData, goBack }: props) => { - const { t } = useTranslation(); - const currentNetwork = useContext(networkContext); - const signer = useContext(signerContext); - const [vaultMode, setVaultMode] = useState( - isInLayer1(currentNetwork.chainId) ? "hard" : "normal" - ); - const [vaultData, setVaultData] = useState(vaultInitData); - const radios = [ - { name: "Regular", value: "normal" }, - { name: "Hard", value: "hard" }, - ]; - - const { - currentCollateral, - currentVault, - currentAssetRead, - currentCollateralRead, - currentVaultRead, - currentCollateralOracleRead, - currentAssetOracleRead, - } = useVault(vaultData.assetSymbol, vaultData.collateralSymbol, vaultData.isHardVault); - const actions = ["add", "remove", "mint", "burn"]; - - // Actions - const [title, setTitle] = useState(t("vault.create")); - const [text, setText] = useState(t("vault.create-text", { asset: vaultData.assetSymbol })); - const [isLoading, setIsLoading] = useState(false); - const [btnDisabled, setBtnDisabled] = useState(false); - const [activeAction, setActiveAction] = useState("add"); - - // Vault Data - // Vault Data - const [assetOptions, setAssetOptions] = useState>([]); - const [collateralOptions, setCollateralOptions] = useState>([]); - - const [currentVaultId, setCurrentVaultId] = useState("0"); - const [isApproved, setIsApproved] = useState(false); - const [vaultDebt, setVaultDebt] = useState("0"); - // const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); - const [vaultCollateral, setVaultCollateral] = useState("0"); - // const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); - const [vaultRatio, setVaultRatio] = useState("0"); - const [tempRatio, setTempRatio] = useState(""); - const [minRatio, setMinRatio] = useState("0"); - const [selectedVaultDecimals, setSelectedVaultDecimals] = useState(18); - - // General Data - const isHardMode = () => vaultMode === "hard"; - const [assetBalance, setAssetBalance] = useState("0"); - // const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); - const [tokenBalance, setTokenBalance] = useState("0"); - const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); - - // Inputs - const [addCollateralTxt, setAddCollateralTxt] = useState("0"); - const [addCollateralUSD, setAddCollateralUSD] = useState("0"); - const [removeCollateralTxt, setRemoveCollateralTxt] = useState("0"); - const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); - const [mintTxt, setMintTxt] = useState("0"); - const [mintUSD, setMintUSD] = useState("0"); - const [burnTxt, setBurnTxt] = useState("0"); - const [burnUSD, setBurnUSD] = useState("0"); - const [burnFee, setBurnFee] = useState("0"); - const [vaultStatus, setVaultStatus] = useState(""); - // Infinite Approval - const approveValue = BigNumber.from("1157920892373161954235709850086879078532699"); - - const setCollaterals = (newMode: string) => { - if (currentAddress !== "") { - let aOptions = ["TCAP"]; - if (isArbitrum(currentNetwork.chainId)) { - aOptions = ["JPEGz"]; - } - - let cOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; - if (newMode === "hard") { - cOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; - } - if (isOptimism(currentNetwork.chainId) && !isHardMode()) { - cOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; - } - if (isPolygon(currentNetwork.chainId) && !isHardMode()) { - cOptions = ["MATIC", "DAI", "WBTC"]; - } - - setAssetOptions(aOptions); - setCollateralOptions(cOptions); - } - }; - - async function loadVault() { - setIsLoading(true); - let balance; - const provider = getDefaultProvider( - currentNetwork.chainId || NETWORKS.mainnet.chainId, - currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.goerli.name - ); - - let currentVaultData: any; - // @ts-ignore - const vaultID = await currentVault.userToVault(currentAddress); - setCurrentVaultId(vaultID.toString()); - if (vaultID.toString() !== "0") { - // @ts-ignore - const cVault = await currentVault.vaults(vaultID); - currentVaultData = { - vaultId: vaultID, - collateral: cVault.Collateral, - debt: cVault.Debt, - }; - } - - if (vaultData.collateralSymbol !== "ETH") { - // @ts-ignore - balance = await currentCollateral.balanceOf(currentAddress); - } else { - balance = await provider.getBalance(currentAddress); - } - - let decimals = 18; - if (vaultData.collateralSymbol === "WBTC") { - decimals = 8; - } - if (vaultData.collateralSymbol === "USDC") { - decimals = 6; - } - - if (currentVaultData) { - const { collateral, debt } = currentVaultData; - // @ts-ignore - const allowanceCall = await currentCollateralRead.allowance( - currentAddress, - // @ts-ignore - currentVault.address - ); - // @ts-ignore - const currentRatioCall = await currentVaultRead.getVaultRatio(currentVaultData.vaultId); - - // @ts-ignore - // const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); - // @ts-ignore - // const decimalsCall = await currentCollateralRead.decimals(); - // @ts-ignore - // const currentCollateralPriceCall = await currentCollateralOracleRead.getLatestAnswer(); - // @ts-ignore - const currentMinRatioCall = await currentVaultRead.ratio(); - // @ts-ignore - const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); - - // @ts-ignore - const [allowance, currentRatio, currentMinRatio, currentAssetBalance] = - await signer.ethcallProvider?.all([ - allowanceCall, - currentRatioCall, - // currentAssetPriceCall, - currentMinRatioCall, - currentAssetBalanceCall, - ]); - // currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); - - const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); - setAssetBalance(cBalance); - - if (!allowance.isZero() || vaultData.collateralSymbol === "ETH") { - const safeValue = isHardMode() ? 20 : 50; - const warnValue = isHardMode() ? 10 : 30; - - setMinRatio(currentMinRatio.toString()); - setIsApproved(true); - setVaultRatio(currentRatio.toString()); - if (currentRatio.toString() === "0") { - setVaultStatus("N/A"); - } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + safeValue) { - setVaultStatus("safe"); - } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + warnValue) { - setVaultStatus("warning"); - } else { - setVaultStatus("danger"); - } - - const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); - setVaultCollateral(parsedCollateral); - // const usdCollateral = toUSD(currentCollateralPrice, parsedCollateral); - // setVaultCollateralUSD(usdCollateral.toString()); - - // const currentAssetPriceFormat = ethers.utils.formatEther(currentAssetPrice); - const parsedDebt = ethers.utils.formatEther(debt); - setVaultDebt(parsedDebt); - // const usdAsset = toUSD(currentAssetPriceFormat, parsedDebt); - // setVaultDebtUSD(usdAsset.toString()); - } else { - setText(t("vault.approve-text", { asset: currentVaultData.assetSymbol })); - setTitle(t("vault.approve")); - setIsApproved(false); - } - } else { - // @ts-ignore - // const decimalsCall = await currentCollateralRead.decimals(); - // @ts-ignore - // const currentPriceCall = await currentCollateralOracleRead.getLatestAnswer(); - // @ts-ignore - const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); - - // @ts-ignore - const [currentAssetBalance] = await signer.ethcallProvider?.all([ - // currentPriceCall, - currentAssetBalanceCall, - ]); - // currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); - - const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); - setAssetBalance(cBalance); - - setText(t("vault.create-text", { asset: vaultData.assetSymbol })); - setTitle(t("vault.create")); - setIsApproved(false); - } - - setSelectedVaultDecimals(decimals); - const currentBalance = ethers.utils.formatUnits(balance, decimals); - if (parseFloat(currentBalance) < 0.09) { - setTokenBalanceDecimals(4); - } else { - setTokenBalanceDecimals(2); - } - setTokenBalance(currentBalance); - setIsLoading(false); - // const usdBalance = toUSD(currentCollateralPrice, currentBalance); - // setTokenBalanceUSD(usdBalance.toString()); - } - - useEffect( - () => { - const load = async () => { - setCollaterals(vaultData.isHardVault ? "hard" : "normal"); - if (currentAddress !== "" && currentCollateral !== null && currentAssetRead !== null) { - await loadVault(); - } - }; - load(); - }, - // eslint-disable-next-line - [currentAddress, currentVault] - ); - - const assetPrice = async () => { - const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); - - // @ts-ignore - const [currentAssetPrice] = await signer.ethcallProvider?.all([currentAssetPriceCall]); - return currentAssetPrice; - }; - - const collateralPrice = async () => { - const collateralPriceCall = await currentCollateralOracleRead?.getLatestAnswer(); - - // @ts-ignore - const [currentCollateralPrice] = await signer.ethcallProvider?.all([collateralPriceCall]); - return currentCollateralPrice; - }; - - const isGasAsset = () => - (!isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === "ETH") || - (isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === "MATIC"); - - const refresh = async () => { - try { - await loadVault(); - } catch (error) { - console.log(error); - } - }; - - const resetFields = () => { - setBurnFee("0"); - setAddCollateralUSD("0"); - setAddCollateralTxt("0"); - setRemoveCollateralTxt("0"); - setRemoveCollateralUSD("0"); - setMintTxt("0"); - setMintUSD("0"); - setBurnUSD("0"); - setBurnTxt("0"); - }; - - const changeVault = async (newRatio: number, reset = false) => { - const safeValue = isHardMode() ? 20 : 50; - const warnValue = isHardMode() ? 10 : 30; - let r = newRatio; - if (reset) { - r = parseFloat(tempRatio); - setVaultRatio(tempRatio); - setTempRatio(""); - resetFields(); - } else { - if (tempRatio === "") { - setTempRatio(vaultRatio); - } - r = newRatio; - setVaultRatio(r.toString()); - } - - if (r === 0) { - setVaultStatus(t("vault.status.na")); - } else if (r >= parseFloat(minRatio) + safeValue) { - setVaultStatus(t("vault.status.safe")); - } else if (r >= parseFloat(minRatio) + warnValue) { - setVaultStatus(t("vault.status.warning")); - } else if (r >= parseFloat(minRatio)) { - setVaultStatus(t("vault.status.danger")); - } else { - setVaultRatio("0"); - setVaultStatus(t("vault.status.error")); - } - }; - - // forms - const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { - if (isHardMode()) { - const d = parseFloat(vaultDebt); - let newDebt = 0; - if (isMint) { - newDebt = amount + d; - } else { - newDebt = d - amount; - } - return newDebt >= 20 || newDebt === 0; - } - return true; - }; - - const onChangeAddCollateral = async (event: React.ChangeEvent) => { - setAddCollateralTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); - const r = await getRatio( - newCollateral.toString(), - currentPrice, - vaultDebt, - currentAssetPrice - ); - changeVault(r); - setAddCollateralUSD(usd.toString()); - } else { - changeVault(0, false); - setAddCollateralUSD("0"); - } - }; - - const onFocusAddCollateral = () => { - if (addCollateralTxt && parseFloat(addCollateralTxt) === 0) { - setAddCollateralTxt(""); - } - }; - - const onBlurAddCollateral = () => { - if (!addCollateralTxt) { - setAddCollateralTxt("0"); - } - }; - - const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { - setRemoveCollateralTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); - const r = await getRatio( - newCollateral.toString(), - currentPrice, - vaultDebt, - currentAssetPrice - ); - changeVault(r); - setRemoveCollateralUSD(usd.toString()); - } else { - changeVault(0, false); - setRemoveCollateralUSD("0"); - } - }; - - const onFocusRemoveCollateral = () => { - if (removeCollateralTxt && parseFloat(removeCollateralTxt) === 0) { - setRemoveCollateralTxt(""); - } - }; - - const onBlurRemoveCollateral = () => { - if (!removeCollateralTxt) { - setRemoveCollateralTxt("0"); - } - }; - - const onChangeMint = async (event: React.ChangeEvent) => { - setMintTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentAssetPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); - const r = await getRatio( - vaultCollateral, - currentPrice, - newDebt.toString(), - currentAssetPrice - ); - changeVault(r); - setMintUSD(usd.toString()); - } else { - changeVault(0, false); - setMintUSD("0"); - } - }; - - const onFocusMint = () => { - if (mintTxt && parseFloat(mintTxt) === 0) { - setMintTxt(""); - } - }; - - const onBlurMint = () => { - if (!mintTxt) { - setMintTxt("0"); - } - }; - - const onChangeBurn = async (event: React.ChangeEvent) => { - try { - setBurnTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentAssetPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); - const r = await getRatio( - vaultCollateral, - currentPrice, - newDebt.toString(), - currentAssetPrice - ); - changeVault(r); - setBurnUSD(usd.toString()); - const currentBurnFee = await currentVaultRead?.getFee( - ethers.utils.parseEther(event.target.value) - ); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - } else { - changeVault(0, false); - setBurnUSD("0"); - setBurnFee("0"); - } - } catch (error) { - console.error(error); - changeVault(0, true); - setBurnUSD("0"); - setBurnFee("0"); - } - }; - - const onFocusBurn = () => { - if (burnTxt && parseFloat(burnTxt) === 0) { - setBurnTxt(""); - } - }; - - const onBlurBurn = () => { - if (!burnTxt) { - setBurnTxt("0"); - } - }; - - const addCollateral = async () => { - if (addCollateralTxt && parseFloat(addCollateralTxt) > 0) { - setBtnDisabled(true); - // fix decimals - const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); - try { - if (isGasAsset()) { - let tx; - if (vaultData.collateralSymbol === "ETH") { - tx = await currentVault?.addCollateralETH({ - value: amount, - }); - } else { - tx = await currentVault?.addCollateralMATIC({ - value: amount, - }); - } - notifyUser(tx, refresh); - } else { - const tx = await currentVault?.addCollateral(amount); - notifyUser(tx, refresh); - } - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("errors.no-funds")); - } - } - setBtnDisabled(false); - setAddCollateralTxt("0"); - setAddCollateralUSD("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const maxAddCollateral = async (e: React.MouseEvent) => { - e.preventDefault(); - let balance = "0"; - if (vaultData.collateralSymbol === "ETH") { - const provider = getDefaultProvider(currentNetwork.chainId, currentNetwork.name); - balance = ethers.utils.formatEther(await provider.getBalance(currentAddress)); - } else if (currentCollateral) { - const value = BigNumber.from(await currentCollateral.balanceOf(currentAddress)); - balance = ethers.utils.formatUnits(value, selectedVaultDecimals); - } - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - setAddCollateralTxt(balance); - let usd = toUSD(currentPrice, balance); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(balance) + parseFloat(vaultCollateral); - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); - changeVault(r); - setAddCollateralUSD(usd.toString()); - }; - - const removeCollateral = async () => { - if (removeCollateralTxt && parseFloat(removeCollateralTxt) > 0) { - const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); - setBtnDisabled(true); - try { - if (isGasAsset()) { - let tx; - if (vaultData.collateralSymbol === "ETH") { - tx = await currentVault?.removeCollateralETH(amount); - } else { - tx = await currentVault?.removeCollateralMATIC(amount); - } - notifyUser(tx, refresh); - } else { - const tx = await currentVault?.removeCollateral(amount); - notifyUser(tx, refresh); - } - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.tran-rejected")); - } - } - setBtnDisabled(false); - setRemoveCollateralTxt("0"); - setRemoveCollateralUSD("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const safeRemoveCollateral = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let collateralToRemove = await getSafeRemoveCollateral( - minRatio, - vaultCollateral, - currentPrice, - currentAssetPrice, - vaultDebt, - vaultData.isHardVault - ); - if (selectedVaultDecimals === 8) { - collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; - collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); - } - setRemoveCollateralTxt(collateralToRemove.toString()); - let usd = toUSD(currentPrice, collateralToRemove.toString()); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(vaultCollateral) - collateralToRemove; - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); - changeVault(r); - setRemoveCollateralUSD(usd.toString()); - }; - - const mintTCAP = async () => { - if (mintTxt && parseFloat(mintTxt) > 0) { - if (isMinRequiredTcap(parseFloat(mintTxt), true)) { - setBtnDisabled(true); - try { - const amount = ethers.utils.parseEther(mintTxt); - const tx = await currentVault?.mint(amount); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.no-collateral")); - } - } - setBtnDisabled(false); - setMintTxt("0"); - setMintUSD("0"); - } else { - errorNotification(t("vault.errors.min-tcap")); - } - } else { - errorNotification(t("errors.empty")); - } - }; - - const safeMintTCAP = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - const safeMint = await getSafeMint( - minRatio, - vaultCollateral, - currentPrice, - currentAssetPrice, - vaultDebt, - vaultData.isHardVault - ); - setMintTxt(safeMint.toString()); - let usd = toUSD(currentAssetPrice, safeMint.toString()); - if (!usd) { - usd = 0; - } - const newDebt = safeMint + parseFloat(vaultDebt); - const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); - changeVault(r); - setMintUSD(usd.toString()); - }; - - const burnTCAP = async () => { - if (burnTxt && parseFloat(burnTxt) > 0) { - const amount = ethers.utils.parseEther(burnTxt); - setBtnDisabled(true); - try { - const currentBurnFee = await currentVault?.getFee(amount); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - const tx = await currentVault?.burn(amount, { value: increasedFee }); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.burn-too-high")); - } - } - setBtnDisabled(false); - setBurnTxt("0"); - setBurnUSD("0"); - setBurnFee("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const maxBurnTCAP = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - const currentBalanceCall = await currentAssetRead?.balanceOf(currentAddress); - const currentVaultDebtCall = await currentVaultRead?.vaults(vaultData.vaultId); - - // @ts-ignore - const [currentBalance, cVault] = await signer.ethcallProvider?.all([ - currentBalanceCall, - currentVaultDebtCall, - ]); - - let balanceFormat = "0"; - let balance; - if (currentBalance.lt(cVault.Debt)) { - balanceFormat = ethers.utils.formatEther(currentBalance); - balance = currentBalance; - } else { - balanceFormat = vaultDebt; - balance = cVault.Debt; - } - setBurnTxt(balanceFormat); - let usd = toUSD(currentAssetPrice, balanceFormat); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(balanceFormat) - parseFloat(balanceFormat); - const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); - changeVault(r); - setBurnUSD(usd.toString()); - - if (balanceFormat !== "0") { - const currentBurnFee = await currentVault?.getFee(balance); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - } else { - setBurnFee("0"); - } - }; - - const ActionsDropdown = () => ( - setActiveAction(eventKey || "add")}> - -
- - {capitalize(activeAction)}{" "} - {actions.slice(0, 2).includes(activeAction) - ? vaultData.collateralSymbol - : vaultData.assetSymbol.toUpperCase()} - -
-
- - {actions.map((action, index) => ( - - {capitalize(action)}{" "} - {index < 2 ? vaultData.collateralSymbol : vaultData.assetSymbol.toUpperCase()} - - ))} - -
- ); - - const AddCollateral = () => ( - - - - - - - - - - ); - - const RemoveCollateral = () => ( - - - - - - - - - - ); - - const MintAsset = () => ( - - - - - - - - - - ); - - const BurnAsset = () => ( - - - - - - - - - - ); - - const ActionControls = () => { - if (activeAction === "add") { - return AddCollateral(); - } - if (activeAction === "remove") { - return RemoveCollateral(); - } - if (activeAction === "mint") { - return MintAsset(); - } - return BurnAsset(); - }; - - const MaxButton = () => { - if (activeAction === "add") { - return ( - - ); - } - if (activeAction === "remove") { - return ( - - ); - } - if (activeAction === "mint") { - return ( - - ); - } - return ( - - ); - }; - - const AssetBalance = (isCollateral: boolean) => { - const aBalance = isCollateral ? tokenBalance : assetBalance; - - return ( -
- Wallet Balance: - - - -
- ); - }; - - const CollateralAmount = () => ( -
- Collateral: - - - -
- ); - - const MintedAmount = () => ( -
- Debt: - - - -
- ); - - const creatOrApprovee = async () => { - if (currentVaultId === "0") { - setBtnDisabled(true); - try { - const tx = await currentVault?.createVault(); - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification(t("errors.tran-rejected")); - } - } - setBtnDisabled(false); - } else { - setBtnDisabled(true); - try { - const tx = await currentCollateral?.approve(currentVault?.address, approveValue); - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification(t("errors.tran-rejected")); - } - } - setBtnDisabled(false); - } - }; - - const RenderCreateVault = () => ( -
- {isLoading ? ( - - ) : ( - <> -

- <>{text} -

- - - )} -
- ); - - const handleRadioBtnChange = async (value: string) => { - setVaultMode(value); - // setCollaterals(value); - setVaultData({ - vaultId: "0", - assetSymbol: vaultData.assetSymbol, - collateralSymbol: - vaultData.collateralSymbol === TOKENS_SYMBOLS.ETH - ? TOKENS_SYMBOLS.WETH - : TOKENS_SYMBOLS.ETH, - isHardVault: value === "hard", - }); - }; - - const handleTokenChange = async (value: string) => { - let keepVaultId = false; - if (vaultData.collateralSymbol === "ETH" || vaultData.collateralSymbol === "WETH") { - keepVaultId = value === "ETH" || value === "WETH"; - } - - setVaultData({ - vaultId: !keepVaultId ? "0" : vaultData.vaultId, - assetSymbol: vaultData.assetSymbol, - collateralSymbol: value, - isHardVault: vaultData.isHardVault, - }); - }; - - const AssetDropdown = () => ( -
-
Asset
- - -
- - {vaultData.assetSymbol} -
-
- - {assetOptions.map((item) => ( - - - {item} - - ))} - -
-
- ); - - const CollateralDropdown = () => ( -
-
Collateral
- handleTokenChange(eventKey || "ETH")}> - -
- - {vaultData.collateralSymbol.toUpperCase()} -
-
- - {collateralOptions.map((item) => ( - - - {item} - - ))} - -
-
- ); - - return ( -
-
-
-
-
- - {radios.map((radio, idx) => ( - handleRadioBtnChange(e.currentTarget.value)} - > - {radio.name} - - ))} - -
-
- -
-
-
-
-
- - {AssetBalance(false)} - {isApproved && } -
-
- - {AssetBalance(true)} - {isApproved && } -
-
- {isLoading ? ( - - ) : ( -
- {!isApproved ? ( - - ) : ( - <> -
-
-
- - -
- {activeAction === actions[3] && ( -
- - <>{t("vault.debt.fee")}: - - {" "} - {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} -
- )} -
-
{ActionControls()}
-
-
-
-
Ratio:
-
-
-
-

- -

-
- - -

- - {vaultStatus.toLocaleUpperCase()} - -

-
-
- - )} -
- )} -
-
-
-
- ); -}; - -export default Vault2; diff --git a/src/components/Vaults/vault/VaultForm.tsx b/src/components/Vaults/vault/VaultForm.tsx deleted file mode 100644 index 9b00c41..0000000 --- a/src/components/Vaults/vault/VaultForm.tsx +++ /dev/null @@ -1,1074 +0,0 @@ -import React, { useContext, useState, useEffect } from "react"; -import { ethers, BigNumber } from "ethers"; -import { Button, Dropdown, Form, InputGroup, Spinner } from "react-bootstrap/esm"; -import NumberFormat from "react-number-format"; -import { useTranslation } from "react-i18next"; -import "../../../styles/mint2.scss"; -import { useVault } from "../../../hooks"; -import { networkContext, signerContext } from "../../../state"; -import { capitalize } from "../common"; -import { NETWORKS } from "../../../utils/constants"; -import { - errorNotification, - getDefaultProvider, - getRatio, - getSafeRemoveCollateral, - getSafeMint, - isPolygon, - notifyUser, - toUSD, -} from "../../../utils/utils"; - -type VaultInitType = { - vaultId: string; - assetSymbol: string; - collateralSymbol: string; - isHardVault: boolean; -}; - -type props = { - currentAddress: string; - vaultData: VaultInitType; -}; - -const VaultForm = ({ currentAddress, vaultData }: props) => { - const { t } = useTranslation(); - const currentNetwork = useContext(networkContext); - const signer = useContext(signerContext); - const { isHardVault } = vaultData; - const { - currentCollateral, - currentVault, - currentAssetRead, - currentCollateralRead, - currentVaultRead, - currentCollateralOracleRead, - currentAssetOracleRead, - } = useVault(vaultData.assetSymbol, vaultData.collateralSymbol, vaultData.isHardVault); - const actions = ["add", "remove", "mint", "burn"]; - - // Actions - const [title, setTitle] = useState(t("vault.create")); - const [text, setText] = useState(t("vault.create-text", { asset: vaultData.assetSymbol })); - const [isLoading, setIsLoading] = useState(false); - const [btnDisabled, setBtnDisabled] = useState(false); - const [activeAction, setActiveAction] = useState("add"); - - // Vault Data - const [currentVaultId, setCurrentVaultId] = useState("0"); - const [isApproved, setIsApproved] = useState(false); - const [vaultDebt, setVaultDebt] = useState("0"); - // const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); - const [vaultCollateral, setVaultCollateral] = useState("0"); - // const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); - const [vaultRatio, setVaultRatio] = useState("0"); - const [tempRatio, setTempRatio] = useState(""); - const [minRatio, setMinRatio] = useState("0"); - const [selectedVaultDecimals, setSelectedVaultDecimals] = useState(18); - - // General Data - const [assetBalance, setAssetBalance] = useState("0"); - // const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); - const [tokenBalance, setTokenBalance] = useState("0"); - const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); - - // Inputs - const [addCollateralTxt, setAddCollateralTxt] = useState("0"); - const [addCollateralUSD, setAddCollateralUSD] = useState("0"); - const [removeCollateralTxt, setRemoveCollateralTxt] = useState("0"); - const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); - const [mintTxt, setMintTxt] = useState("0"); - const [mintUSD, setMintUSD] = useState("0"); - const [burnTxt, setBurnTxt] = useState("0"); - const [burnUSD, setBurnUSD] = useState("0"); - const [burnFee, setBurnFee] = useState("0"); - const [vaultStatus, setVaultStatus] = useState(""); - // Infinite Approval - const approveValue = BigNumber.from("1157920892373161954235709850086879078532699"); - - async function loadVault() { - let balance; - const provider = getDefaultProvider( - currentNetwork.chainId || NETWORKS.mainnet.chainId, - currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.goerli.name - ); - - let currentVaultData: any; - - console.log("isHard: ", isHardVault); - // @ts-ignore - const vaultID = await currentVault.userToVault(currentAddress); - if (vaultID.toString() !== "0") { - // @ts-ignore - const cVault = await currentVault.vaults(vaultID); - currentVaultData = { - vaultId: vaultID, - collateral: cVault.Collateral, - debt: cVault.Debt, - }; - setCurrentVaultId(vaultID.toString()); - } - - if (vaultData.collateralSymbol !== "ETH") { - // @ts-ignore - balance = await currentCollateral.balanceOf(currentAddress); - } else { - balance = await provider.getBalance(currentAddress); - } - - let decimals = 18; - if (vaultData.collateralSymbol === "WBTC") { - decimals = 8; - } - if (vaultData.collateralSymbol === "USDC") { - console.log("USDC: ", vaultData.collateralSymbol); - decimals = 6; - } - - if (currentVaultData) { - const { collateral, debt } = currentVaultData; - // @ts-ignore - const allowanceCall = await currentCollateralRead.allowance( - currentAddress, - // @ts-ignore - currentVault.address - ); - // @ts-ignore - const currentRatioCall = await currentVaultRead.getVaultRatio(currentVaultData.vaultId); - - // @ts-ignore - // const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); - // @ts-ignore - // const decimalsCall = await currentCollateralRead.decimals(); - // @ts-ignore - // const currentCollateralPriceCall = await currentCollateralOracleRead.getLatestAnswer(); - // @ts-ignore - const currentMinRatioCall = await currentVaultRead.ratio(); - // @ts-ignore - const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); - - // @ts-ignore - const [allowance, currentRatio, currentMinRatio, currentAssetBalance] = - await signer.ethcallProvider?.all([ - allowanceCall, - currentRatioCall, - // currentAssetPriceCall, - currentMinRatioCall, - currentAssetBalanceCall, - ]); - // currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); - - const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); - setAssetBalance(cBalance); - - if (!allowance.isZero() || vaultData.collateralSymbol === "ETH") { - const safeValue = isHardVault ? 20 : 50; - const warnValue = isHardVault ? 10 : 30; - - setMinRatio(currentMinRatio.toString()); - setIsApproved(true); - setVaultRatio(currentRatio.toString()); - if (currentRatio.toString() === "0") { - setVaultStatus("N/A"); - } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + safeValue) { - setVaultStatus("safe"); - } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + warnValue) { - setVaultStatus("warning"); - } else { - setVaultStatus("danger"); - } - - const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); - setVaultCollateral(parsedCollateral); - // const usdCollateral = toUSD(currentCollateralPrice, parsedCollateral); - // setVaultCollateralUSD(usdCollateral.toString()); - - // const currentAssetPriceFormat = ethers.utils.formatEther(currentAssetPrice); - const parsedDebt = ethers.utils.formatEther(debt); - setVaultDebt(parsedDebt); - // const usdAsset = toUSD(currentAssetPriceFormat, parsedDebt); - // setVaultDebtUSD(usdAsset.toString()); - } else { - setText(t("vault.approve-text", { asset: currentVaultData.assetSymbol })); - setTitle(t("vault.approve")); - setIsApproved(false); - } - } else { - // @ts-ignore - // const decimalsCall = await currentCollateralRead.decimals(); - // @ts-ignore - // const currentPriceCall = await currentCollateralOracleRead.getLatestAnswer(); - // @ts-ignore - const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); - - // @ts-ignore - const [currentAssetBalance] = await signer.ethcallProvider?.all([ - // currentPriceCall, - currentAssetBalanceCall, - ]); - // currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); - - const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); - setAssetBalance(cBalance); - - setText(t("vault.create-text", { asset: vaultData.assetSymbol })); - setTitle(t("vault.create")); - setIsApproved(false); - } - - setSelectedVaultDecimals(decimals); - const currentBalance = ethers.utils.formatUnits(balance, decimals); - if (parseFloat(currentBalance) < 0.09) { - setTokenBalanceDecimals(4); - } else { - setTokenBalanceDecimals(2); - } - setTokenBalance(currentBalance); - // const usdBalance = toUSD(currentCollateralPrice, currentBalance); - // setTokenBalanceUSD(usdBalance.toString()); - } - - useEffect( - () => { - const load = async () => { - if (currentAddress !== "" && currentCollateral !== null && currentAssetRead !== null) { - setIsLoading(true); - await loadVault(); - setIsLoading(false); - } - }; - load(); - }, - // eslint-disable-next-line - [currentAddress, currentCollateral, isHardVault] - ); - - const assetPrice = async () => { - const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); - - // @ts-ignore - const [currentAssetPrice] = await signer.ethcallProvider?.all([currentAssetPriceCall]); - return currentAssetPrice; - }; - - const collateralPrice = async () => { - const collateralPriceCall = await currentCollateralOracleRead?.getLatestAnswer(); - - // @ts-ignore - const [currentCollateralPrice] = await signer.ethcallProvider?.all([collateralPriceCall]); - return currentCollateralPrice; - }; - - const isGasAsset = () => - (!isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === "ETH") || - (isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === "MATIC"); - - const refresh = async () => { - try { - await loadVault(); - } catch (error) { - console.log(error); - } - }; - - const resetFields = () => { - setBurnFee("0"); - setAddCollateralUSD("0"); - setAddCollateralTxt("0"); - setRemoveCollateralTxt("0"); - setRemoveCollateralUSD("0"); - setMintTxt("0"); - setMintUSD("0"); - setBurnUSD("0"); - setBurnTxt("0"); - }; - - const changeVault = async (newRatio: number, reset = false) => { - const safeValue = isHardVault ? 20 : 50; - const warnValue = isHardVault ? 10 : 30; - let r = newRatio; - console.log("Rratio: ", r); - if (reset) { - r = parseFloat(tempRatio); - setVaultRatio(tempRatio); - setTempRatio(""); - resetFields(); - } else { - if (tempRatio === "") { - setTempRatio(vaultRatio); - } - r = newRatio; - setVaultRatio(r.toString()); - } - - if (r === 0) { - setVaultStatus(t("vault.status.na")); - } else if (r >= parseFloat(minRatio) + safeValue) { - setVaultStatus(t("vault.status.safe")); - } else if (r >= parseFloat(minRatio) + warnValue) { - setVaultStatus(t("vault.status.warning")); - } else if (r >= parseFloat(minRatio)) { - setVaultStatus(t("vault.status.danger")); - } else { - setVaultRatio("0"); - setVaultStatus(t("vault.status.error")); - } - }; - - // forms - const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { - if (isHardVault) { - const d = parseFloat(vaultDebt); - let newDebt = 0; - if (isMint) { - newDebt = amount + d; - } else { - newDebt = d - amount; - } - return newDebt >= 20 || newDebt === 0; - } - return true; - }; - - const onChangeAddCollateral = async (event: React.ChangeEvent) => { - setAddCollateralTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); - const r = await getRatio( - newCollateral.toString(), - currentPrice, - vaultDebt, - currentAssetPrice - ); - changeVault(r); - setAddCollateralUSD(usd.toString()); - } else { - changeVault(0, false); - setAddCollateralUSD("0"); - } - }; - - const onFocusAddCollateral = () => { - if (addCollateralTxt && parseFloat(addCollateralTxt) === 0) { - setAddCollateralTxt(""); - } - }; - - const onBlurAddCollateral = () => { - if (!addCollateralTxt) { - setAddCollateralTxt("0"); - } - }; - - const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { - setRemoveCollateralTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); - const r = await getRatio( - newCollateral.toString(), - currentPrice, - vaultDebt, - currentAssetPrice - ); - changeVault(r); - setRemoveCollateralUSD(usd.toString()); - } else { - changeVault(0, false); - setRemoveCollateralUSD("0"); - } - }; - - const onFocusRemoveCollateral = () => { - if (removeCollateralTxt && parseFloat(removeCollateralTxt) === 0) { - setRemoveCollateralTxt(""); - } - }; - - const onBlurRemoveCollateral = () => { - if (!removeCollateralTxt) { - setRemoveCollateralTxt("0"); - } - }; - - const onChangeMint = async (event: React.ChangeEvent) => { - setMintTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentAssetPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); - const r = await getRatio( - vaultCollateral, - currentPrice, - newDebt.toString(), - currentAssetPrice - ); - changeVault(r); - setMintUSD(usd.toString()); - } else { - changeVault(0, false); - setMintUSD("0"); - } - }; - - const onFocusMint = () => { - if (mintTxt && parseFloat(mintTxt) === 0) { - setMintTxt(""); - } - }; - - const onBlurMint = () => { - if (!mintTxt) { - setMintTxt("0"); - } - }; - - const onChangeBurn = async (event: React.ChangeEvent) => { - try { - setBurnTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentAssetPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); - const r = await getRatio( - vaultCollateral, - currentPrice, - newDebt.toString(), - currentAssetPrice - ); - changeVault(r); - setBurnUSD(usd.toString()); - const currentBurnFee = await currentVaultRead?.getFee( - ethers.utils.parseEther(event.target.value) - ); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - } else { - changeVault(0, false); - setBurnUSD("0"); - setBurnFee("0"); - } - } catch (error) { - console.error(error); - changeVault(0, true); - setBurnUSD("0"); - setBurnFee("0"); - } - }; - - const onFocusBurn = () => { - if (burnTxt && parseFloat(burnTxt) === 0) { - setBurnTxt(""); - } - }; - - const onBlurBurn = () => { - if (!burnTxt) { - setBurnTxt("0"); - } - }; - - const addCollateral = async () => { - if (addCollateralTxt && parseFloat(addCollateralTxt) > 0) { - setBtnDisabled(true); - // fix decimals - const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); - try { - if (isGasAsset()) { - let tx; - if (vaultData.collateralSymbol === "ETH") { - tx = await currentVault?.addCollateralETH({ - value: amount, - }); - } else { - tx = await currentVault?.addCollateralMATIC({ - value: amount, - }); - } - notifyUser(tx, refresh); - } else { - const tx = await currentVault?.addCollateral(amount); - notifyUser(tx, refresh); - } - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("errors.no-funds")); - } - } - setBtnDisabled(false); - setAddCollateralTxt("0"); - setAddCollateralUSD("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const maxAddCollateral = async (e: React.MouseEvent) => { - e.preventDefault(); - let balance = "0"; - if (vaultData.collateralSymbol === "ETH") { - const provider = getDefaultProvider(currentNetwork.chainId, currentNetwork.name); - balance = ethers.utils.formatEther(await provider.getBalance(currentAddress)); - } else if (currentCollateral) { - const value = BigNumber.from(await currentCollateral.balanceOf(currentAddress)); - balance = ethers.utils.formatUnits(value, selectedVaultDecimals); - } - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - setAddCollateralTxt(balance); - let usd = toUSD(currentPrice, balance); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(balance) + parseFloat(vaultCollateral); - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); - changeVault(r); - setAddCollateralUSD(usd.toString()); - }; - - const removeCollateral = async () => { - if (removeCollateralTxt && parseFloat(removeCollateralTxt) > 0) { - const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); - setBtnDisabled(true); - try { - if (isGasAsset()) { - let tx; - if (vaultData.collateralSymbol === "ETH") { - tx = await currentVault?.removeCollateralETH(amount); - } else { - tx = await currentVault?.removeCollateralMATIC(amount); - } - notifyUser(tx, refresh); - } else { - const tx = await currentVault?.removeCollateral(amount); - notifyUser(tx, refresh); - } - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.tran-rejected")); - } - } - setBtnDisabled(false); - setRemoveCollateralTxt("0"); - setRemoveCollateralUSD("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const safeRemoveCollateral = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let collateralToRemove = await getSafeRemoveCollateral( - minRatio, - vaultCollateral, - currentPrice, - currentAssetPrice, - vaultDebt, - vaultData.isHardVault - ); - if (selectedVaultDecimals === 8) { - collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; - collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); - } - setRemoveCollateralTxt(collateralToRemove.toString()); - let usd = toUSD(currentPrice, collateralToRemove.toString()); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(vaultCollateral) - collateralToRemove; - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); - changeVault(r); - setRemoveCollateralUSD(usd.toString()); - }; - - const mintTCAP = async () => { - if (mintTxt && parseFloat(mintTxt) > 0) { - if (isMinRequiredTcap(parseFloat(mintTxt), true)) { - setBtnDisabled(true); - try { - const amount = ethers.utils.parseEther(mintTxt); - const tx = await currentVault?.mint(amount); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.no-collateral")); - } - } - setBtnDisabled(false); - setMintTxt("0"); - setMintUSD("0"); - } else { - errorNotification(t("vault.errors.min-tcap")); - } - } else { - errorNotification(t("errors.empty")); - } - }; - - const safeMintTCAP = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - const safeMint = await getSafeMint( - minRatio, - vaultCollateral, - currentPrice, - currentAssetPrice, - vaultDebt, - vaultData.isHardVault - ); - setMintTxt(safeMint.toString()); - let usd = toUSD(currentAssetPrice, safeMint.toString()); - if (!usd) { - usd = 0; - } - const newDebt = safeMint + parseFloat(vaultDebt); - const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); - changeVault(r); - setMintUSD(usd.toString()); - }; - - const burnTCAP = async () => { - if (burnTxt && parseFloat(burnTxt) > 0) { - const amount = ethers.utils.parseEther(burnTxt); - setBtnDisabled(true); - try { - const currentBurnFee = await currentVault?.getFee(amount); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - const tx = await currentVault?.burn(amount, { value: increasedFee }); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.burn-too-high")); - } - } - setBtnDisabled(false); - setBurnTxt("0"); - setBurnUSD("0"); - setBurnFee("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const maxBurnTCAP = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - const currentBalanceCall = await currentAssetRead?.balanceOf(currentAddress); - const currentVaultDebtCall = await currentVaultRead?.vaults(vaultData.vaultId); - - // @ts-ignore - const [currentBalance, cVault] = await signer.ethcallProvider?.all([ - currentBalanceCall, - currentVaultDebtCall, - ]); - - let balanceFormat = "0"; - let balance; - if (currentBalance.lt(cVault.Debt)) { - balanceFormat = ethers.utils.formatEther(currentBalance); - balance = currentBalance; - } else { - balanceFormat = vaultDebt; - balance = cVault.Debt; - } - setBurnTxt(balanceFormat); - let usd = toUSD(currentAssetPrice, balanceFormat); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(balanceFormat) - parseFloat(balanceFormat); - const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); - changeVault(r); - setBurnUSD(usd.toString()); - - if (balanceFormat !== "0") { - const currentBurnFee = await currentVault?.getFee(balance); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - } else { - setBurnFee("0"); - } - }; - - const ActionsDropdown = () => ( - setActiveAction(eventKey || "add")}> - -
- - {capitalize(activeAction)}{" "} - {actions.slice(0, 2).includes(activeAction) - ? vaultData.collateralSymbol - : vaultData.assetSymbol.toUpperCase()} - -
-
- - {actions.map((action, index) => ( - - {capitalize(action)}{" "} - {index < 2 ? vaultData.collateralSymbol : vaultData.assetSymbol.toUpperCase()} - - ))} - -
- ); - - const AddCollateral = () => ( - - - - - - - - - - ); - - const RemoveCollateral = () => ( - - - - - - - - - - ); - - const MintAsset = () => ( - - - - - - - - - - ); - - const BurnAsset = () => ( - - - - - - - - - - ); - - const ActionControls = () => { - if (activeAction === "add") { - return AddCollateral(); - } - if (activeAction === "remove") { - return RemoveCollateral(); - } - if (activeAction === "mint") { - return MintAsset(); - } - return BurnAsset(); - }; - - const MaxButton = () => { - if (activeAction === "add") { - return ( - - ); - } - if (activeAction === "remove") { - return ( - - ); - } - if (activeAction === "mint") { - return ( - - ); - } - return ( - - ); - }; - - const AssetBalance = (isCollateral: boolean) => { - const aBalance = isCollateral ? tokenBalance : assetBalance; - - return ( -
- Balance: - - - -
- ); - }; - - const CollateralAmount = () => ( -
- Collateral: - - - -
- ); - - const MintedAmount = () => ( -
- Debt: - - - -
- ); - - const creatOrApprovee = async () => { - if (currentVaultId === "0") { - setBtnDisabled(true); - try { - const tx = await currentVault?.createVault(); - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification(t("errors.tran-rejected")); - } - } - setBtnDisabled(false); - } else { - setBtnDisabled(true); - try { - const tx = await currentCollateral?.approve(currentVault?.address, approveValue); - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification(t("errors.tran-rejected")); - } - } - setBtnDisabled(false); - } - }; - - const RenderCreateVault = () => ( -
- {isLoading ? ( - - ) : ( - <> -

- <>{text} -

- - - )} -
- ); - - return ( -
-
-
- {AssetBalance(false)} - {isApproved && } -
-
- {AssetBalance(true)} - {isApproved && } -
-
- {!isApproved ? ( - - ) : ( - <> -
-
-
- - -
- {activeAction === actions[3] && ( -
- - <>{t("vault.debt.fee")}: - - {" "} - {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} -
- )} -
-
{ActionControls()}
-
-
-
-
Ratio:
-
-
-
-

- -

-
- - -

- {vaultStatus} -

-
-
- - )} -
- ); -}; - -export default VaultForm; diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index d9b3ddb..c0ef2bc 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -1,11 +1,35 @@ import React, { useContext, useState, useEffect } from "react"; -import { Button, ButtonGroup, Dropdown, Spinner, ToggleButton } from "react-bootstrap/esm"; +import { ethers, BigNumber } from "ethers"; +import { + Button, + ButtonGroup, + Dropdown, + Form, + InputGroup, + Spinner, + ToggleButton, +} from "react-bootstrap/esm"; +import NumberFormat from "react-number-format"; +import { useTranslation } from "react-i18next"; import { FaPlus } from "react-icons/fa"; import "../../../styles/mint2.scss"; -import VaultForm from "./VaultForm"; -import { networkContext } from "../../../state"; -import { TokenIcon } from "../common"; -import { isInLayer1, isOptimism, isPolygon, isArbitrum } from "../../../utils/utils"; +import { useVault } from "../../../hooks"; +import { networkContext, signerContext } from "../../../state"; +import { capitalize, TokenIcon } from "../common"; +import { NETWORKS, TOKENS_SYMBOLS } from "../../../utils/constants"; +import { + errorNotification, + getDefaultProvider, + getRatio, + getSafeRemoveCollateral, + getSafeMint, + isArbitrum, + isInLayer1, + isPolygon, + isOptimism, + notifyUser, + toUSD, +} from "../../../utils/utils"; type VaultInitType = { vaultId: string; @@ -21,23 +45,72 @@ type props = { }; const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { + const { t } = useTranslation(); const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); const [vaultMode, setVaultMode] = useState( isInLayer1(currentNetwork.chainId) ? "hard" : "normal" ); - const [loading, setLoading] = useState(true); const [vaultData, setVaultData] = useState(vaultInitData); const radios = [ { name: "Regular", value: "normal" }, { name: "Hard", value: "hard" }, ]; + const { + currentCollateral, + currentVault, + currentAssetRead, + currentCollateralRead, + currentVaultRead, + currentCollateralOracleRead, + currentAssetOracleRead, + } = useVault(vaultData.assetSymbol, vaultData.collateralSymbol, vaultData.isHardVault); + const actions = ["add", "remove", "mint", "burn"]; + + // Actions + const [title, setTitle] = useState(t("vault.create")); + const [text, setText] = useState(t("vault.create-text", { asset: vaultData.assetSymbol })); + const [isLoading, setIsLoading] = useState(false); + const [btnDisabled, setBtnDisabled] = useState(false); + const [activeAction, setActiveAction] = useState("add"); + + // Vault Data // Vault Data const [assetOptions, setAssetOptions] = useState>([]); const [collateralOptions, setCollateralOptions] = useState>([]); - // Inputss + const [currentVaultId, setCurrentVaultId] = useState("0"); + const [isApproved, setIsApproved] = useState(false); + const [vaultDebt, setVaultDebt] = useState("0"); + // const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); + const [vaultCollateral, setVaultCollateral] = useState("0"); + // const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); + const [vaultRatio, setVaultRatio] = useState("0"); + const [tempRatio, setTempRatio] = useState(""); + const [minRatio, setMinRatio] = useState("0"); + const [selectedVaultDecimals, setSelectedVaultDecimals] = useState(18); + + // General Data const isHardMode = () => vaultMode === "hard"; + const [assetBalance, setAssetBalance] = useState("0"); + // const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); + const [tokenBalance, setTokenBalance] = useState("0"); + const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); + + // Inputs + const [addCollateralTxt, setAddCollateralTxt] = useState("0"); + const [addCollateralUSD, setAddCollateralUSD] = useState("0"); + const [removeCollateralTxt, setRemoveCollateralTxt] = useState("0"); + const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); + const [mintTxt, setMintTxt] = useState("0"); + const [mintUSD, setMintUSD] = useState("0"); + const [burnTxt, setBurnTxt] = useState("0"); + const [burnUSD, setBurnUSD] = useState("0"); + const [burnFee, setBurnFee] = useState("0"); + const [vaultStatus, setVaultStatus] = useState(""); + // Infinite Approval + const approveValue = BigNumber.from("1157920892373161954235709850086879078532699"); const setCollaterals = (newMode: string) => { if (currentAddress !== "") { @@ -60,25 +133,931 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setAssetOptions(aOptions); setCollateralOptions(cOptions); } - setLoading(false); }; + async function loadVault() { + setIsLoading(true); + let balance; + const provider = getDefaultProvider( + currentNetwork.chainId || NETWORKS.mainnet.chainId, + currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.goerli.name + ); + + let currentVaultData: any; + // @ts-ignore + const vaultID = await currentVault.userToVault(currentAddress); + setCurrentVaultId(vaultID.toString()); + if (vaultID.toString() !== "0") { + // @ts-ignore + const cVault = await currentVault.vaults(vaultID); + currentVaultData = { + vaultId: vaultID, + collateral: cVault.Collateral, + debt: cVault.Debt, + }; + } + + if (vaultData.collateralSymbol !== "ETH") { + // @ts-ignore + balance = await currentCollateral.balanceOf(currentAddress); + } else { + balance = await provider.getBalance(currentAddress); + } + + let decimals = 18; + if (vaultData.collateralSymbol === "WBTC") { + decimals = 8; + } + if (vaultData.collateralSymbol === "USDC") { + decimals = 6; + } + + if (currentVaultData) { + const { collateral, debt } = currentVaultData; + // @ts-ignore + const allowanceCall = await currentCollateralRead.allowance( + currentAddress, + // @ts-ignore + currentVault.address + ); + // @ts-ignore + const currentRatioCall = await currentVaultRead.getVaultRatio(currentVaultData.vaultId); + + // @ts-ignore + // const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); + // @ts-ignore + // const decimalsCall = await currentCollateralRead.decimals(); + // @ts-ignore + // const currentCollateralPriceCall = await currentCollateralOracleRead.getLatestAnswer(); + // @ts-ignore + const currentMinRatioCall = await currentVaultRead.ratio(); + // @ts-ignore + const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + + // @ts-ignore + const [allowance, currentRatio, currentMinRatio, currentAssetBalance] = + await signer.ethcallProvider?.all([ + allowanceCall, + currentRatioCall, + // currentAssetPriceCall, + currentMinRatioCall, + currentAssetBalanceCall, + ]); + // currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + + const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); + setAssetBalance(cBalance); + + if (!allowance.isZero() || vaultData.collateralSymbol === "ETH") { + const safeValue = isHardMode() ? 20 : 50; + const warnValue = isHardMode() ? 10 : 30; + + setMinRatio(currentMinRatio.toString()); + setIsApproved(true); + setVaultRatio(currentRatio.toString()); + if (currentRatio.toString() === "0") { + setVaultStatus("N/A"); + } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + safeValue) { + setVaultStatus("safe"); + } else if (currentRatio.toString() >= parseFloat(currentMinRatio.toString()) + warnValue) { + setVaultStatus("warning"); + } else { + setVaultStatus("danger"); + } + + const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); + setVaultCollateral(parsedCollateral); + // const usdCollateral = toUSD(currentCollateralPrice, parsedCollateral); + // setVaultCollateralUSD(usdCollateral.toString()); + + // const currentAssetPriceFormat = ethers.utils.formatEther(currentAssetPrice); + const parsedDebt = ethers.utils.formatEther(debt); + setVaultDebt(parsedDebt); + // const usdAsset = toUSD(currentAssetPriceFormat, parsedDebt); + // setVaultDebtUSD(usdAsset.toString()); + } else { + setText(t("vault.approve-text", { asset: currentVaultData.assetSymbol })); + setTitle(t("vault.approve")); + setIsApproved(false); + } + } else { + // @ts-ignore + // const decimalsCall = await currentCollateralRead.decimals(); + // @ts-ignore + // const currentPriceCall = await currentCollateralOracleRead.getLatestAnswer(); + // @ts-ignore + const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + + // @ts-ignore + const [currentAssetBalance] = await signer.ethcallProvider?.all([ + // currentPriceCall, + currentAssetBalanceCall, + ]); + // currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + + const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); + setAssetBalance(cBalance); + + setText(t("vault.create-text", { asset: vaultData.assetSymbol })); + setTitle(t("vault.create")); + setIsApproved(false); + } + + setSelectedVaultDecimals(decimals); + const currentBalance = ethers.utils.formatUnits(balance, decimals); + if (parseFloat(currentBalance) < 0.09) { + setTokenBalanceDecimals(4); + } else { + setTokenBalanceDecimals(2); + } + setTokenBalance(currentBalance); + setIsLoading(false); + // const usdBalance = toUSD(currentCollateralPrice, currentBalance); + // setTokenBalanceUSD(usdBalance.toString()); + } + useEffect( () => { - setCollaterals("hard"); + const load = async () => { + setCollaterals(vaultData.isHardVault ? "hard" : "normal"); + if (currentAddress !== "" && currentCollateral !== null && currentAssetRead !== null) { + await loadVault(); + } + }; + load(); }, // eslint-disable-next-line - [currentAddress, vaultInitData] + [currentAddress, currentVault] + ); + + const assetPrice = async () => { + const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentAssetPrice] = await signer.ethcallProvider?.all([currentAssetPriceCall]); + return currentAssetPrice; + }; + + const collateralPrice = async () => { + const collateralPriceCall = await currentCollateralOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentCollateralPrice] = await signer.ethcallProvider?.all([collateralPriceCall]); + return currentCollateralPrice; + }; + + const isGasAsset = () => + (!isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === "ETH") || + (isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === "MATIC"); + + const refresh = async () => { + try { + await loadVault(); + } catch (error) { + console.log(error); + } + }; + + const resetFields = () => { + setBurnFee("0"); + setAddCollateralUSD("0"); + setAddCollateralTxt("0"); + setRemoveCollateralTxt("0"); + setRemoveCollateralUSD("0"); + setMintTxt("0"); + setMintUSD("0"); + setBurnUSD("0"); + setBurnTxt("0"); + }; + + const changeVault = async (newRatio: number, reset = false) => { + const safeValue = isHardMode() ? 20 : 50; + const warnValue = isHardMode() ? 10 : 30; + let r = newRatio; + if (reset) { + r = parseFloat(tempRatio); + setVaultRatio(tempRatio); + setTempRatio(""); + resetFields(); + } else { + if (tempRatio === "") { + setTempRatio(vaultRatio); + } + r = newRatio; + setVaultRatio(r.toString()); + } + + if (r === 0) { + setVaultStatus(t("vault.status.na")); + } else if (r >= parseFloat(minRatio) + safeValue) { + setVaultStatus(t("vault.status.safe")); + } else if (r >= parseFloat(minRatio) + warnValue) { + setVaultStatus(t("vault.status.warning")); + } else if (r >= parseFloat(minRatio)) { + setVaultStatus(t("vault.status.danger")); + } else { + setVaultRatio("0"); + setVaultStatus(t("vault.status.error")); + } + }; + + // forms + const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { + if (isHardMode()) { + const d = parseFloat(vaultDebt); + let newDebt = 0; + if (isMint) { + newDebt = amount + d; + } else { + newDebt = d - amount; + } + return newDebt >= 20 || newDebt === 0; + } + return true; + }; + + const onChangeAddCollateral = async (event: React.ChangeEvent) => { + setAddCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); + const r = await getRatio( + newCollateral.toString(), + currentPrice, + vaultDebt, + currentAssetPrice + ); + changeVault(r); + setAddCollateralUSD(usd.toString()); + } else { + changeVault(0, false); + setAddCollateralUSD("0"); + } + }; + + const onFocusAddCollateral = () => { + if (addCollateralTxt && parseFloat(addCollateralTxt) === 0) { + setAddCollateralTxt(""); + } + }; + + const onBlurAddCollateral = () => { + if (!addCollateralTxt) { + setAddCollateralTxt("0"); + } + }; + + const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { + setRemoveCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); + const r = await getRatio( + newCollateral.toString(), + currentPrice, + vaultDebt, + currentAssetPrice + ); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + } else { + changeVault(0, false); + setRemoveCollateralUSD("0"); + } + }; + + const onFocusRemoveCollateral = () => { + if (removeCollateralTxt && parseFloat(removeCollateralTxt) === 0) { + setRemoveCollateralTxt(""); + } + }; + + const onBlurRemoveCollateral = () => { + if (!removeCollateralTxt) { + setRemoveCollateralTxt("0"); + } + }; + + const onChangeMint = async (event: React.ChangeEvent) => { + setMintTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentAssetPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); + const r = await getRatio( + vaultCollateral, + currentPrice, + newDebt.toString(), + currentAssetPrice + ); + changeVault(r); + setMintUSD(usd.toString()); + } else { + changeVault(0, false); + setMintUSD("0"); + } + }; + + const onFocusMint = () => { + if (mintTxt && parseFloat(mintTxt) === 0) { + setMintTxt(""); + } + }; + + const onBlurMint = () => { + if (!mintTxt) { + setMintTxt("0"); + } + }; + + const onChangeBurn = async (event: React.ChangeEvent) => { + try { + setBurnTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentAssetPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); + const r = await getRatio( + vaultCollateral, + currentPrice, + newDebt.toString(), + currentAssetPrice + ); + changeVault(r); + setBurnUSD(usd.toString()); + const currentBurnFee = await currentVaultRead?.getFee( + ethers.utils.parseEther(event.target.value) + ); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + changeVault(0, false); + setBurnUSD("0"); + setBurnFee("0"); + } + } catch (error) { + console.error(error); + changeVault(0, true); + setBurnUSD("0"); + setBurnFee("0"); + } + }; + + const onFocusBurn = () => { + if (burnTxt && parseFloat(burnTxt) === 0) { + setBurnTxt(""); + } + }; + + const onBlurBurn = () => { + if (!burnTxt) { + setBurnTxt("0"); + } + }; + + const addCollateral = async () => { + if (addCollateralTxt && parseFloat(addCollateralTxt) > 0) { + setBtnDisabled(true); + // fix decimals + const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); + try { + if (isGasAsset()) { + let tx; + if (vaultData.collateralSymbol === "ETH") { + tx = await currentVault?.addCollateralETH({ + value: amount, + }); + } else { + tx = await currentVault?.addCollateralMATIC({ + value: amount, + }); + } + notifyUser(tx, refresh); + } else { + const tx = await currentVault?.addCollateral(amount); + notifyUser(tx, refresh); + } + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("errors.no-funds")); + } + } + setBtnDisabled(false); + setAddCollateralTxt("0"); + setAddCollateralUSD("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const maxAddCollateral = async (e: React.MouseEvent) => { + e.preventDefault(); + let balance = "0"; + if (vaultData.collateralSymbol === "ETH") { + const provider = getDefaultProvider(currentNetwork.chainId, currentNetwork.name); + balance = ethers.utils.formatEther(await provider.getBalance(currentAddress)); + } else if (currentCollateral) { + const value = BigNumber.from(await currentCollateral.balanceOf(currentAddress)); + balance = ethers.utils.formatUnits(value, selectedVaultDecimals); + } + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + setAddCollateralTxt(balance); + let usd = toUSD(currentPrice, balance); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(balance) + parseFloat(vaultCollateral); + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); + changeVault(r); + setAddCollateralUSD(usd.toString()); + }; + + const removeCollateral = async () => { + if (removeCollateralTxt && parseFloat(removeCollateralTxt) > 0) { + const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); + setBtnDisabled(true); + try { + if (isGasAsset()) { + let tx; + if (vaultData.collateralSymbol === "ETH") { + tx = await currentVault?.removeCollateralETH(amount); + } else { + tx = await currentVault?.removeCollateralMATIC(amount); + } + notifyUser(tx, refresh); + } else { + const tx = await currentVault?.removeCollateral(amount); + notifyUser(tx, refresh); + } + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.tran-rejected")); + } + } + setBtnDisabled(false); + setRemoveCollateralTxt("0"); + setRemoveCollateralUSD("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const safeRemoveCollateral = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let collateralToRemove = await getSafeRemoveCollateral( + minRatio, + vaultCollateral, + currentPrice, + currentAssetPrice, + vaultDebt, + vaultData.isHardVault + ); + if (selectedVaultDecimals === 8) { + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; + collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); + } + setRemoveCollateralTxt(collateralToRemove.toString()); + let usd = toUSD(currentPrice, collateralToRemove.toString()); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - collateralToRemove; + const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + }; + + const mintTCAP = async () => { + if (mintTxt && parseFloat(mintTxt) > 0) { + if (isMinRequiredTcap(parseFloat(mintTxt), true)) { + setBtnDisabled(true); + try { + const amount = ethers.utils.parseEther(mintTxt); + const tx = await currentVault?.mint(amount); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.no-collateral")); + } + } + setBtnDisabled(false); + setMintTxt("0"); + setMintUSD("0"); + } else { + errorNotification(t("vault.errors.min-tcap")); + } + } else { + errorNotification(t("errors.empty")); + } + }; + + const safeMintTCAP = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + const safeMint = await getSafeMint( + minRatio, + vaultCollateral, + currentPrice, + currentAssetPrice, + vaultDebt, + vaultData.isHardVault + ); + setMintTxt(safeMint.toString()); + let usd = toUSD(currentAssetPrice, safeMint.toString()); + if (!usd) { + usd = 0; + } + const newDebt = safeMint + parseFloat(vaultDebt); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); + changeVault(r); + setMintUSD(usd.toString()); + }; + + const burnTCAP = async () => { + if (burnTxt && parseFloat(burnTxt) > 0) { + const amount = ethers.utils.parseEther(burnTxt); + setBtnDisabled(true); + try { + const currentBurnFee = await currentVault?.getFee(amount); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + const tx = await currentVault?.burn(amount, { value: increasedFee }); + notifyUser(tx, refresh); + } catch (error) { + console.error(error); + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("vault.errors.burn-too-high")); + } + } + setBtnDisabled(false); + setBurnTxt("0"); + setBurnUSD("0"); + setBurnFee("0"); + } else { + errorNotification(t("errors.empty")); + } + }; + + const maxBurnTCAP = async (e: React.MouseEvent) => { + e.preventDefault(); + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + const currentBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + const currentVaultDebtCall = await currentVaultRead?.vaults(vaultData.vaultId); + + // @ts-ignore + const [currentBalance, cVault] = await signer.ethcallProvider?.all([ + currentBalanceCall, + currentVaultDebtCall, + ]); + + let balanceFormat = "0"; + let balance; + if (currentBalance.lt(cVault.Debt)) { + balanceFormat = ethers.utils.formatEther(currentBalance); + balance = currentBalance; + } else { + balanceFormat = vaultDebt; + balance = cVault.Debt; + } + setBurnTxt(balanceFormat); + let usd = toUSD(currentAssetPrice, balanceFormat); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(balanceFormat) - parseFloat(balanceFormat); + const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); + changeVault(r); + setBurnUSD(usd.toString()); + + if (balanceFormat !== "0") { + const currentBurnFee = await currentVault?.getFee(balance); + const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + setBurnFee("0"); + } + }; + + const ActionsDropdown = () => ( + setActiveAction(eventKey || "add")}> + +
+ + {capitalize(activeAction)}{" "} + {actions.slice(0, 2).includes(activeAction) + ? vaultData.collateralSymbol + : vaultData.assetSymbol.toUpperCase()} + +
+
+ + {actions.map((action, index) => ( + + {capitalize(action)}{" "} + {index < 2 ? vaultData.collateralSymbol : vaultData.assetSymbol.toUpperCase()} + + ))} + +
+ ); + + const AddCollateral = () => ( + + + + + + + + + + ); + + const RemoveCollateral = () => ( + + + + + + + + + + ); + + const MintAsset = () => ( + + + + + + + + + + ); + + const BurnAsset = () => ( + + + + + + + + + + ); + + const ActionControls = () => { + if (activeAction === "add") { + return AddCollateral(); + } + if (activeAction === "remove") { + return RemoveCollateral(); + } + if (activeAction === "mint") { + return MintAsset(); + } + return BurnAsset(); + }; + + const MaxButton = () => { + if (activeAction === "add") { + return ( + + ); + } + if (activeAction === "remove") { + return ( + + ); + } + if (activeAction === "mint") { + return ( + + ); + } + return ( + + ); + }; + + const AssetBalance = (isCollateral: boolean) => { + const aBalance = isCollateral ? tokenBalance : assetBalance; + + return ( +
+ Wallet Balance: + + + +
+ ); + }; + + const CollateralAmount = () => ( +
+ Collateral: + + + +
+ ); + + const MintedAmount = () => ( +
+ Debt: + + + +
+ ); + + const creatOrApprovee = async () => { + if (currentVaultId === "0") { + setBtnDisabled(true); + try { + const tx = await currentVault?.createVault(); + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification(t("errors.tran-rejected")); + } + } + setBtnDisabled(false); + } else { + setBtnDisabled(true); + try { + const tx = await currentCollateral?.approve(currentVault?.address, approveValue); + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification(t("errors.tran-rejected")); + } + } + setBtnDisabled(false); + } + }; + + const RenderCreateVault = () => ( +
+ {isLoading ? ( + + ) : ( + <> +

+ <>{text} +

+ + + )} +
); const handleRadioBtnChange = async (value: string) => { - setLoading(true); setVaultMode(value); - setCollaterals(value); + // setCollaterals(value); setVaultData({ vaultId: "0", assetSymbol: vaultData.assetSymbol, - collateralSymbol: "ETH", + collateralSymbol: + vaultData.collateralSymbol === TOKENS_SYMBOLS.ETH + ? TOKENS_SYMBOLS.WETH + : TOKENS_SYMBOLS.ETH, isHardVault: value === "hard", }); }; @@ -99,7 +1078,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const AssetDropdown = () => (
-
Asset
+
Index
@@ -173,15 +1152,77 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => {
- - +
+ + {AssetBalance(false)} + {isApproved && } +
+
+ + {AssetBalance(true)} + {isApproved && } +
- {loading ? ( + {isLoading ? ( + + ) : (
- + {!isApproved ? ( + + ) : ( + <> +
+
+
+ + +
+ {activeAction === actions[3] && ( +
+ + <>{t("vault.debt.fee")}: + + {" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} +
+ )} +
+
{ActionControls()}
+
+
+
+
Ratio:
+
+
+
+

+ +

+
+ - +

+ + {vaultStatus.toLocaleUpperCase()} + +

+
+
+ + )}
- ) : ( - )}
From afd14ab03837354341b8b78362472d45d68d3964 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 5 Dec 2022 19:35:41 -0600 Subject: [PATCH 190/278] fixing issues on vaults --- src/App.tsx | 85 ++++++++++----------- src/components/Vaults/monitoring/Vaults.tsx | 2 +- src/components/Vaults/monitoring/index.tsx | 1 + src/components/Vaults/vault/index.tsx | 16 +++- src/hooks/index.tsx | 2 + src/hooks/useVaultsPage.tsx | 15 ++++ src/state/VaultsPageContext.tsx | 12 +++ src/state/index.tsx | 2 + src/styles/vault-monitoring.scss | 3 + 9 files changed, 89 insertions(+), 49 deletions(-) create mode 100644 src/hooks/useVaultsPage.tsx create mode 100644 src/state/VaultsPageContext.tsx diff --git a/src/App.tsx b/src/App.tsx index 9eb37ad..e176255 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -16,7 +16,6 @@ import Header from "./components/Header"; import Sidebar from "./components/Sidebar"; import Topbar from "./components/Topbar"; import WelcomeWrapper from "./components/Welcome/index"; -import { Vault, Monitoring } from "./components/Vault"; import Vaults from "./components/Vaults"; import Delegators from "./components/Governance/Delegators"; import MushroomNft from "./components/MushroomNft"; @@ -34,6 +33,7 @@ import { signerContext, tokensContext, vaultsContext, + vaultsPageContext, Web3ModalContext, } from "./state"; import cryptexJson from "./contracts/cryptex.json"; @@ -80,6 +80,7 @@ const App = () => { const governance = hooks.useGovernance(); const rewards = hooks.useRewards(); const mushroomNft = hooks.useMushroomNft(); + const vaultsPage = hooks.useVaultsPage(); const match = useRouteMatch(); setMulticallAddress(NETWORKS.optimism.chainId, "0xD0E99f15B24F265074747B2A1444eB02b9E30422"); setMulticallAddress(NETWORKS.okovan.chainId, "0x4EFBb8983D5C18A8b6B5084D936B7D12A0BEe2c9"); @@ -1014,51 +1015,47 @@ const App = () => { - - - }> - - -
- - - - - - - - - - - + + + + }> + + +
+ + + + - - + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/src/components/Vaults/monitoring/Vaults.tsx b/src/components/Vaults/monitoring/Vaults.tsx index 07d47f5..9dba845 100644 --- a/src/components/Vaults/monitoring/Vaults.tsx +++ b/src/components/Vaults/monitoring/Vaults.tsx @@ -352,7 +352,7 @@ export const Vaults = ({
)} - {myVaults && v.url !== "" && {vaultButtonLink(v)}} + {v.url !== "" && <>{vaultButtonLink(v)}} ); })} diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index 3422c67..a255e75 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -5,6 +5,7 @@ import { FaArrowsAltH } from "react-icons/fa"; import { ethers, BigNumber } from "ethers"; import { useLazyQuery, gql } from "@apollo/client"; import { useTranslation } from "react-i18next"; +import "../../../styles/vault-monitoring.scss"; import { VaultPagination } from "./Pagination"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; import { signerContext, hardVaultsContext, networkContext, vaultsContext } from "../../../state"; diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index c0ef2bc..ee79f39 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -70,7 +70,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { // Actions const [title, setTitle] = useState(t("vault.create")); - const [text, setText] = useState(t("vault.create-text", { asset: vaultData.assetSymbol })); + const [text, setText] = useState(t("vault.create-text", { asset: "Index" })); const [isLoading, setIsLoading] = useState(false); const [btnDisabled, setBtnDisabled] = useState(false); const [activeAction, setActiveAction] = useState("add"); @@ -236,7 +236,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { // const usdAsset = toUSD(currentAssetPriceFormat, parsedDebt); // setVaultDebtUSD(usdAsset.toString()); } else { - setText(t("vault.approve-text", { asset: currentVaultData.assetSymbol })); + setText(t("vault.approve-text", { asset: "Index" })); setTitle(t("vault.approve")); setIsApproved(false); } @@ -258,7 +258,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); setAssetBalance(cBalance); - setText(t("vault.create-text", { asset: vaultData.assetSymbol })); + setText(t("vault.create-text", { asset: "Index" })); setTitle(t("vault.create")); setIsApproved(false); } @@ -1038,7 +1038,15 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ) : ( <>

- <>{text} + <>{text}{" "} + + Learn More +

- {myVaults && currentAddress !== "" && } {currentStatus === "liquidation" && ( <>{t("monitoring.net-reward")} @@ -269,6 +268,7 @@ export const Vaults = ({ )} + @@ -358,7 +358,7 @@ export const Vaults = ({ })} - {vaults.length === 0 && currentAddress !== "" && myVaults && ( + {vaults.length === 0 && currentAddress !== "" && myVaults && currentStatus === "all" && (

No Vaults yet. Please @@ -369,7 +369,7 @@ export const Vaults = ({

)} - {vaults.length === 0 && currentAddress === "" && ( + {vaults.length === 0 && !myVaults && (

No vaults found.

diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index a255e75..7b51654 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -144,6 +144,9 @@ const Monitoring = ({ setVaultToUpdate }: props) => { if (currentStatus === "ready") { statusFilter = `collateral_gte: "${weiLimit}", debt_lt: "${weiLimit}"`; } + if (currentStatus === VAULT_STATUS.active || currentStatus === VAULT_STATUS.liquidation) { + statusFilter = `debt_gt: "${weiLimit}"`; + } } if (vaultMode !== "all") { const isHard = vaultMode === "hard" ? "true" : "false"; @@ -630,7 +633,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { const newVault = () => { let newAssetSymbol = TOKENS_SYMBOLS.TCAP; - let newCollateralSymbol = "ETH"; + let newCollateralSymbol = TOKENS_SYMBOLS.ETH; let isHardVault = false; const createdCollaterals = []; for (let i = 0; i < vaultList.length; i += 1) { diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index ee79f39..6e4f483 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -123,6 +123,9 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { if (newMode === "hard") { cOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; } + if (isArbitrum(currentNetwork.chainId)) { + cOptions = ["ETH", "DAI"]; + } if (isOptimism(currentNetwork.chainId) && !isHardMode()) { cOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; } @@ -1134,23 +1137,27 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => {
- - {radios.map((radio, idx) => ( - handleRadioBtnChange(e.currentTarget.value)} - > - {radio.name} - - ))} - + {!isArbitrum(currentNetwork.chainId) ? ( + + {radios.map((radio, idx) => ( + handleRadioBtnChange(e.currentTarget.value)} + > + {radio.name} + + ))} + + ) : ( +
Vault
+ )}
)}
-
- - {address !== "" ? ( - - -
-

- <>{t("welcome.title1")} -

-
-
- -
-
-
-
- <>{t("welcome.tcap-balance")} -
-
-
-
-
- -
- -
-

- -

-
-
- {isInLayer1(currentNetwork.chainId) && ( -
-
-
- <>{t("welcome.ctx-balance")} -
-
-
-
-
- -
- -
-

- -

-
-
- )} -
-
-
- ) : ( - - -

- <>{t("welcome.title3")} -

-
- - -

- <>{t("welcome.subtitle3")} -

-
- -
-
-
-
- )} - - -

- <>{t("welcome.title2")} -

-
- -

- <>{t("welcome.subtitle2")} -

- - - - - - - - - - - - -
-
+
+ + + + + diff --git a/src/components/Welcome/Summary2.tsx b/src/components/Welcome/Summary2.tsx new file mode 100644 index 0000000..deb03a1 --- /dev/null +++ b/src/components/Welcome/Summary2.tsx @@ -0,0 +1,391 @@ +import React, { useContext, useEffect, useState } from "react"; +import Button from "react-bootstrap/esm/Button"; +import Card from "react-bootstrap/esm/Card"; +import Col from "react-bootstrap/esm/Col"; +import Row from "react-bootstrap/esm/Row"; +import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; +import Tooltip from "react-bootstrap/esm/Tooltip"; +import { useHistory } from "react-router-dom"; +import { useTranslation } from "react-i18next"; +import { ethers } from "ethers"; +import NumberFormat from "react-number-format"; +import { useQuery, gql } from "@apollo/client"; +import { + networkContext, + oraclesContext, + signerContext, + tokensContext, + Web3ModalContext, +} from "../../state"; +import { + makeShortAddress, + getPriceInUSDFromPair, + getENS, + isInLayer1, + isGoerli, +} from "../../utils/utils"; +import "../../styles/summary.scss"; +import Protocol from "./Protocol"; +import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; +import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; +import Loading from "../Loading"; + +type props = { + signerAddress: string; + loadingContracts: boolean; +}; + +const Summary = ({ signerAddress, loadingContracts }: props) => { + const { t } = useTranslation(); + const history = useHistory(); + const [address, setAddress] = useState(""); + const [currentAddress, setCurrentAddress] = useState(""); + const [tcapBalance, setTcapBalance] = useState("0.0"); + const [tcapUSDBalance, setTcapUSDBalance] = useState("0.0"); + const [totalPrice, setTotalPrice] = useState("0.0"); + const [tcapPrice, setTcapPrice] = useState("0.0"); + const [ctxPrice, setCtxPrice] = useState("0.0"); + const [ctxUSDBalance, setCtxUSDBalance] = useState("0.0"); + const [ctxBalance, setCtxBalance] = useState("0.0"); + const [isLoading, setIsLoading] = useState(true); + const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); + const web3Modal = useContext(Web3ModalContext); + const tokens = useContext(tokensContext); + const oracles = useContext(oraclesContext); + + const VAULTS_STATE = gql` + { + states { + amountStaked + id + } + } + `; + + const { data } = useQuery(VAULTS_STATE, { + notifyOnNetworkStatusChange: true, + pollInterval: 35000, + fetchPolicy: "no-cache", + }); + + useEffect(() => { + const loadAddress = async () => { + if (oracles.tcapOracleRead) { + const currentTcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + // @ts-ignore + const [currentTcapPrice] = await signer.ethcallProvider?.all([currentTcapPriceCall]); + const TotalTcapPrice = currentTcapPrice.mul(10000000000); + const tPrice = ethers.utils.formatEther(TotalTcapPrice.div(10000000000)); + setTotalPrice(ethers.utils.formatEther(TotalTcapPrice)); + setTcapPrice(tPrice); + + let currentPriceCTX = 0; + if ( + !isGoerli(currentNetwork.chainId) && + (signerAddress === "" || isInLayer1(currentNetwork.chainId)) + ) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); + // @ts-ignore + const [wethOraclePrice, reservesCtxPool] = await signer.ethcallProvider?.all([ + wethOraclePriceCall, + reservesCtxPoolCall, + ]); + const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + currentPriceCTX = await getPriceInUSDFromPair( + reservesCtxPool[0], + reservesCtxPool[1], + parseFloat(currentPriceETH) + ); + setCtxPrice(currentPriceCTX.toString()); + } + + if ( + signer.signer && + tokens.tcapTokenRead && + signerAddress !== "" && + signerAddress !== currentAddress + ) { + const ens = await getENS(signerAddress); + if (ens) { + setAddress(ens); + } else { + setAddress(makeShortAddress(signerAddress)); + } + + const currentTcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(signerAddress); + // @ts-ignore + const [currentTcapBalance] = await signer.ethcallProvider?.all([currentTcapBalanceCall]); + const tcapString = ethers.utils.formatEther(currentTcapBalance); + setTcapBalance(tcapString); + const tcapUSD = parseFloat(tcapString) * parseFloat(tPrice); + if (tcapUSD < 0.0001) { + setTcapUSDBalance("0.0"); + } else { + setTcapUSDBalance(tcapUSD.toString()); + } + if (isInLayer1(currentNetwork.chainId)) { + const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(signerAddress); + // @ts-ignore + const [currentCtxBalance] = await signer.ethcallProvider?.all([currentCtxBalanceCall]); + const ctxString = ethers.utils.formatEther(currentCtxBalance); + setCtxBalance(ctxString); + const ctxUSD = parseFloat(ctxString) * currentPriceCTX; + setCtxUSDBalance(ctxUSD.toString()); + } + setCurrentAddress(signerAddress); + } + setIsLoading(false); + } + }; + loadAddress(); + + // eslint-disable-next-line + }, [signerAddress, loadingContracts]); + + if (isLoading) { + return ; + } + + return ( +
+
+
+

+ + + <>{t("welcome.tcap-info")} + + } + > + + +

+

+ <>{t("welcome.tcap")}: +

+
+
+

+ +

+

+ <>{t("welcome.tcap-price")}: +

+
+ {isInLayer1(currentNetwork.chainId) && ( +
+

+ +

+

+ <>{t("welcome.ctx-price")}: +

+
+ )} +
+
+ + {address !== "" ? ( + + +
+

+ <>{t("welcome.title1")} +

+
+
+ +
+
+
+
+ <>{t("welcome.tcap-balance")} +
+
+
+
+
+ +
+ +
+

+ +

+
+
+ {isInLayer1(currentNetwork.chainId) && ( +
+
+
+ <>{t("welcome.ctx-balance")} +
+
+
+
+
+ +
+ +
+

+ +

+
+
+ )} +
+
+
+ ) : ( + + +

+ <>{t("welcome.title3")} +

+
+ + +

+ <>{t("welcome.subtitle3")} +

+
+ +
+
+
+
+ )} + + +

+ <>{t("welcome.title2")} +

+
+ +

+ <>{t("welcome.subtitle2")} +

+ + + + + + + + + + + + +
+
+ + + + +
+
+ ); +}; + +export default Summary; diff --git a/src/styles/app.scss b/src/styles/app.scss index 0324d9e..8e1771a 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -29,7 +29,7 @@ h6 { color: $white; } -h6 { +h6, p { margin-bottom: 0rem; } diff --git a/src/styles/summary.scss b/src/styles/summary.scss index 1574b55..ca2159d 100644 --- a/src/styles/summary.scss +++ b/src/styles/summary.scss @@ -57,6 +57,7 @@ border-radius: 0; font-size: 1rem; } + .prices { display: flex; flex-direction: row; @@ -94,12 +95,14 @@ } } } - .summary2 { + + .summary-protocol { display: flex; flex-direction: row; flex-wrap: wrap; margin-top: 2rem; } + .card { padding: 1.5rem; &-header { @@ -154,6 +157,18 @@ } } + .features { + .btn-feature { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1.5rem; + padding: 0rem 2rem; + width: 100%; + height: 5rem; + } + } + .balance-section { display: flex; flex-direction: row; diff --git a/src/styles/summary2.scss b/src/styles/summary2.scss new file mode 100644 index 0000000..1574b55 --- /dev/null +++ b/src/styles/summary2.scss @@ -0,0 +1,369 @@ +@import "./colors"; +@import "./fonts"; + +.summary { + display: flex; + flex-direction: column; + padding: 3rem 2rem; + padding-bottom: 2rem; + .spinner-container { + padding-top: 3rem; + width: 100%; + } + h2 { + font-size: 1.375rem; + margin-bottom: 0rem; + } + h3 { + font-size: 1.1rem; + margin-bottom: 0rem; + } + h4 { + font-size: 0.9rem; + } + h5 { + font-size: 0.9rem; + text-align: right; + } + h6 { + color: $off-white; + } + + .btn { + background-color: $darker; + width: 7rem; + height: 2.7rem; + font-size: 0.8rem; + + &.question { + border-radius: 2px; + width: 20px; + height: 20px; + margin-right: 0px; + font-size: 10px; + padding: 2px; + margin-left: 5px; + } + } + .btn:disabled { + color: $light; + opacity: 0.8; + } + + #connect { + background-color: $pink; + width: 15rem; + height: 3rem; + border-radius: 0; + font-size: 1rem; + } + .prices { + display: flex; + flex-direction: row; + padding: 1rem; + margin: 0rem 1rem; + border: 0.7px solid #a440f2; + border-radius: 5px; + background-color: #281e31; + .token-price { + display: flex; + flex-direction: row-reverse; + align-items: center; + margin-left: 0.5rem; + margin-right: 1.5rem; + } + .number { + margin-left: 0.5rem; + display: flex; + flex-direction: row; + align-items: center; + } + h4 { + margin-bottom: 0rem; + @media (max-width: 1499px) { + font-size: 0.8rem; + } + @media (max-width: 1400px) { + font-size: 0.75rem; + } + @media (max-width: 1320px) { + font-size: 0.7rem; + } + @media (max-width: 1279px) { + font-size: 0.65rem; + } + } + } + .summary2 { + display: flex; + flex-direction: row; + flex-wrap: wrap; + margin-top: 2rem; + } + .card { + padding: 1.5rem; + &-header { + padding: 0.5rem 1rem; + } + + .cls-1 { + fill: $darker; + } + b { + font-family: "Nineteen Ninety Seven"; + color: $purple; + } + p { + margin-bottom: 1.5rem; + } + .row { + margin-top: 0rem; + } + + &.diamond { + padding-bottom: 0rem; + p { + width: 80%; + } + .btn { + width: 11.0625rem; + margin-bottom: 0.8rem; + margin-left: 0.8rem; + border-radius: 5px; + + &.neon-green { + box-shadow: 0px 0px 39px -6px rgba(63, 217, 180, 0.4); + } + &.neon-blue { + box-shadow: 0px 0px 39px -6px rgba(15, 217, 255, 0.4); + } + } + } + } + + .col-wrapper { + p { + font-size: 1rem; + } + div[class*="col-"] { + padding: 0rem; + } + .balance { + margin-bottom: 1.5rem; + padding-bottom: 0.8rem; + } + } + + .balance-section { + display: flex; + flex-direction: row; + justify-content: space-between; + p { + margin-bottom: 0rem; + margin-left: 1rem; + } + .balance-box { + display: flex; + flex-direction: column; + justify-content: space-between; + + h5 { + text-align: left; + margin-bottom: 0rem; + margin-left: 0.5rem; + } + svg { + height: 2rem; + } + .title { + display: flex; + justify-content: flex-end; + padding-top: 0.7rem; + padding-bottom: 0.9rem; + } + .values { + display: flex; + flex-direction: column; + align-items: flex-end; + h5 { + font-size: 1.2rem; + } + } + .asset-value { + display: flex; + align-items: center; + flex-direction: row-reverse; + } + } + } + + .protocol { + height: 100%; + padding-left: 1rem; + padding-right: 1rem; + .card-body { + display: flex; + } + svg { + width: 2rem; + } + .weth { + height: 2.1rem; + width: 1rem; + } + .totals { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + height: fit-content; + padding: 0.7rem; + background-color: #281e31; + border: 0.7px solid $highlight; + border-radius: 5px; + } + .detail { + display: grid; + grid-template-columns: auto auto; + gap: 1rem; + row-gap: 1.7rem; + height: fit-content; + width: 100%; + } + .asset { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + height: fit-content; + min-height: 4rem; + padding: 0.7rem; + background-color: #281e31; + border: 0.7px solid $highlight; + border-radius: 5px; + h5 { + margin-bottom: 0.5rem; + } + } + .staked { + display: flex; + flex-direction: column-reverse; + margin-left: 1rem; + h6 { + margin-bottom: 0rem; + text-align: right; + color: $light; + } + } + .card-footer { + padding-top: 2rem; + padding-bottom: 0rem; + } + .use-tcap { + display: flex; + justify-content: space-evenly; + .btn.neon-blue { + box-shadow: 0px 0px 14px -6px $blue; + } + } + @media (min-width: 1149px) and (max-width: 1320px) { + h6 { + font-size: 0.9rem; + } + } + @media (min-width: 760px) and (max-width: 1150px) { + .detail { + grid-template-columns: auto; + } + } + } + + @media (max-width: 1000px) { + padding: 3rem 1.2rem; + + .card-wrapper { + .card { + margin-bottom: 1.2rem; + + &.diamond { + p { + width: 85%; + } + } + } + } + } + @media (max-width: 769px) { + .prices { + flex-wrap: wrap; + padding: 0.5rem; + .token-price { + margin-bottom: 0.5rem; + } + h4 { + font-size: 0.68rem; + } + } + .protocol { + margin-top: 2rem; + } + } + @media (max-width: 600px) { + .prices { + .token-price.total { + flex-direction: column; + align-items: flex-start; + margin-bottom: 1rem; + .number{ + margin-left: 0rem; + margin-bottom: 0.2rem; + } + } + h4 { + font-size: 0.85rem; + } + } + } + @media (max-width: 550px) { + padding-left: 1rem; + padding-right: 1rem; + h2 { + font-size: 1.2rem; + } + .card-header { + padding: 0.5rem 0rem; + } + .card-body { + padding-left: 0rem; + padding-right: 0rem; + } + .prices { + .title { + display: none; + } + .token-price { + width: 100%; + margin-right: 0rem; + justify-content: space-between; + } + } + .balance-section { + flex-direction: column; + .balance-box { + margin-bottom: 1.2rem; + .title { + justify-content: flex-start; + } + .values { + align-items: flex-start; + } + } + } + .protocol { + .detail { + grid-template-columns: auto; + row-gap: 1rem; + } + } + } +} From 6d414e36a4957ad2b921b35a2e70b1e2daf38c6e Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 12 Dec 2022 07:10:42 -0600 Subject: [PATCH 193/278] new vaults --- src/components/Vaults/vault/index.tsx | 13 ++++--- src/contracts/cryptex.json | 56 +++++++++++++-------------- src/utils/constants.tsx | 4 +- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 6e4f483..297e37e 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -24,7 +24,6 @@ import { getSafeRemoveCollateral, getSafeMint, isArbitrum, - isInLayer1, isPolygon, isOptimism, notifyUser, @@ -48,9 +47,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const { t } = useTranslation(); const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); - const [vaultMode, setVaultMode] = useState( - isInLayer1(currentNetwork.chainId) ? "hard" : "normal" - ); + const [vaultMode, setVaultMode] = useState(vaultInitData.isHardVault ? "hard" : "normal"); const [vaultData, setVaultData] = useState(vaultInitData); const radios = [ { name: "Regular", value: "normal" }, @@ -506,7 +503,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ); changeVault(r); setBurnUSD(usd.toString()); - const currentBurnFee = await currentVaultRead?.getFee( + const currentBurnFee = await currentVault?.getFee( ethers.utils.parseEther(event.target.value) ); const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); @@ -716,8 +713,12 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const currentBurnFee = await currentVault?.getFee(amount); const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); + console.log("Amount: ", amount.toString()); + console.log("increasedFee: ", increasedFee.toString()); + console.log("Fee: ", ethFee.toString()); + setBurnFee(ethFee.toString()); - const tx = await currentVault?.burn(amount, { value: increasedFee }); + const tx = await currentVault?.burn(amount, { value: BigNumber.from(increasedFee) }); notifyUser(tx, refresh); } catch (error) { console.error(error); diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index 02c050c..bb87f46 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -21598,7 +21598,7 @@ "chainId": "5", "contracts": { "AAVE": { - "address": "0x90f860f0D8ab28e821358fa983012A5684abb48F", + "address": "0x51E4E8Deb87a72A7cF12DECa5e307Ad6E286dad8", "abi": [ { "inputs": [], @@ -21914,7 +21914,7 @@ ] }, "AaveOracle": { - "address": "0xE7958A5B90404fc16B4dDF45F8E1F0A72C384071", + "address": "0x891FbB3f9EecB3822A67B20bFf284D0D83b7C30f", "abi": [ { "inputs": [ @@ -22155,7 +22155,7 @@ ] }, "AaveVaultHandler": { - "address": "0xDbF72abD93de75C6CD056B91233b365b870b2FBA", + "address": "0xaf26aA0F3b19D156499BdC26d3fAA88530024c31", "abi": [ { "inputs": [ @@ -23379,7 +23379,7 @@ ] }, "WBTCOracle": { - "address": "0x52620D9bF02B8Abba8b759D66121210Da674D64D", + "address": "0xeDA36A1a6315A8208eE188cd45a1522A0a43598b", "abi": [ { "inputs": [ @@ -23615,7 +23615,7 @@ ] }, "WBTCVaultHandler": { - "address": "0x07e89a2A7723d4B701eE99f8D772585b88aC4D12", + "address": "0x97CC91464Bd943c3f7B56EdD5a348B41bc4b224d", "abi": [ { "inputs": [ @@ -24839,7 +24839,7 @@ ] }, "Ctx": { - "address": "0xba25Feed06c79446F2ACc15A9AE5E53163126022", + "address": "0xc1BF30f5aD5Cd8829DebA7Bc48ed7a6fDc3e618B", "abi": [ { "inputs": [ @@ -26385,7 +26385,7 @@ ] }, "DAI": { - "address": "0xB67AD4cd26B33Ec60EbA6718626FF76a41CC676F", + "address": "0x6c913fa678C81c567A11EdF19E06bE758DBeFe2D", "abi": [ { "inputs": [], @@ -26701,7 +26701,7 @@ ] }, "DAIOracle": { - "address": "0x7E574b5F8B61B71A6A1DA6127A9383F656d1a800", + "address": "0xdCc78697091f086c4C592d0c6518292Eb7337dB3", "abi": [ { "inputs": [ @@ -26937,7 +26937,7 @@ ] }, "DAIRewardHandler": { - "address": "0x92A04c468Da411D43F4Aec977F32F36751B82CeC", + "address": "0xA229c41786C977FB69ffd64C88994f6aC43A8F69", "abi": [ { "inputs": [ @@ -27740,7 +27740,7 @@ ] }, "DAIVaultHandler": { - "address": "0x7933380EbB0e1c14b21160e7Fb56fAfcb3555f55", + "address": "0xC93ff851ADD589D010cabb3a5C9BC7eB840267FA", "abi": [ { "inputs": [ @@ -30442,7 +30442,7 @@ ] }, "GovernorAlpha": { - "address": "0xc27e8BfB7a85f54498b2378d2a533126800d14E3", + "address": "0x831f5eC3cAc0De0d5211E6b8B1eFdcecac91cF39", "abi": [ { "inputs": [ @@ -31078,7 +31078,7 @@ ] }, "LINK": { - "address": "0xb72AcaD4B30eDBD8E59265eD44Bbd4D445D1725C", + "address": "0x411366c56df57C0Fe0b7e0b14fb06D3732E83c3F", "abi": [ { "inputs": [], @@ -31394,7 +31394,7 @@ ] }, "LinkOracle": { - "address": "0x96803dEd22bd51381a7b114bab1EbaC207d81811", + "address": "0xF34f381c017aD94281823c56098604C93BA95261", "abi": [ { "inputs": [ @@ -31635,7 +31635,7 @@ ] }, "LinkVaultHandler": { - "address": "0xfEab8f210a78BFE920D4808E2F7a3F7D939E129B", + "address": "0x42D56A7E778863E10C11305f01edC83Ca96489A6", "abi": [ { "inputs": [ @@ -32859,7 +32859,7 @@ ] }, "Orchestrator": { - "address": "0xf6bbed61b6118f5f6df4DF1bDc6e8fd598057F14", + "address": "0xe8BFaB95180CAAAB795cdD5c2d5Dd4F35bF3f181", "abi": [ { "inputs": [ @@ -33232,7 +33232,7 @@ ] }, "TCAP": { - "address": "0x59a47B0738203A65D085b2854EC7a22B6fee927D", + "address": "0x8Aa3A478d84d76FF762dc2eD4F4449acd4FD3351", "abi": [ { "inputs": [ @@ -33813,7 +33813,7 @@ ] }, "TCAPOracle": { - "address": "0xe13c4AFEDF1F939217E163cd841A1085e7Ff359a", + "address": "0xDB0d2fd6d01B12c9444FBdf852A80E27966bA9C9", "abi": [ { "inputs": [ @@ -34049,7 +34049,7 @@ ] }, "Timelock": { - "address": "0xbfBE2a21e0d0280B525f4212F3D004fE29597d8b", + "address": "0x00531065Af9ED99b19BD21997b3c2B6C13498f26", "abi": [ { "inputs": [ @@ -34502,7 +34502,7 @@ ] }, "WBTC": { - "address": "0xe2a460850caE5ee351608182B8534aA48545b590", + "address": "0x6A81909f4e0A46FCaC72F9f2653cbe079e008B21", "abi": [ { "inputs": [], @@ -34818,7 +34818,7 @@ ] }, "WETH": { - "address": "0xB091FCDE940d3303f7174C41e184AEDe3dd7AdBf", + "address": "0xAEb34d4C107BDa831C0B50d68eb13F2469FB21f5", "abi": [ { "anonymous": false, @@ -35103,7 +35103,7 @@ ] }, "WETHOracle": { - "address": "0x6d10A60caf2055D13900AE8742866Bcd632910f2", + "address": "0x7E1bb2f2c2773490598b9E9bA592079dD73E788b", "abi": [ { "inputs": [ @@ -35339,7 +35339,7 @@ ] }, "WETHRewardHandler": { - "address": "0x9c0cA2795d023483879adf7671Aa80Cd4fBe15EB", + "address": "0xe41E52E8c4F5A525169EaCAB50903fA4326eaDc8", "abi": [ { "inputs": [ @@ -36142,7 +36142,7 @@ ] }, "WETHVaultHandler": { - "address": "0x18bE4DAB1D2158D5f4c43D7c9c12D417E65F179d", + "address": "0x30412fa1Bdb2380157345DD58e2FE2eb375a1fF8", "abi": [ { "inputs": [ @@ -37390,7 +37390,7 @@ ] }, "HardWETHVaultHandler": { - "address": "0xfA425b8bAf51E5ab840bC521AFfB1a5F7a7A8d80", + "address": "0xFa035809A0641bEeBa50AB48cB558445E8DE7F51", "abi": [ { "inputs": [ @@ -38696,7 +38696,7 @@ ] }, "HardDaiVaultHandler": { - "address": "0x9f3a56dCEbbE9676639EF1FFBa0e45802D20d44d", + "address": "0x233Bf8abf661Cf780e1A62b3a6A9C0d28Fb46E3b", "abi": [ { "inputs": [ @@ -39978,7 +39978,7 @@ ] }, "USDC": { - "address": "0xeC8686387b85cDB589E4Ec3ceF6213Bdb333070A", + "address": "0x9727D87A69d84e747D18F2B36A4cf6cc8A55E653", "abi": [ { "inputs": [], @@ -40294,7 +40294,7 @@ ] }, "USDCOracle": { - "address": "0xE8bc5dD936A974808211C9c7A4F3020366Fd6B61", + "address": "0x78AB4F006Ffc7bbd6e058CB449983e72162197c0", "abi": [ { "inputs": [ @@ -40535,7 +40535,7 @@ ] }, "HardUSDCVaultHandler": { - "address": "0xAFc04bD31061a0c7D4B3A6ef4c7B391C3cd44F81", + "address": "0x7a6E78eA1695Dc2666145F97e7fAc78cfb51a6B8", "abi": [ { "inputs": [ diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 7658837..b4b0a65 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -24,9 +24,9 @@ export const NETWORKS = { chainId: 5, hexChainId: "0x5", name: "goerli", - dai: "0xB67AD4cd26B33Ec60EbA6718626FF76a41CC676F", + dai: "0x6c913fa678C81c567A11EdF19E06bE758DBeFe2D", eth: "0xFfb99f4A02712C909d8F7cC44e67C87Ea1E71E83", - weth: "0xB091FCDE940d3303f7174C41e184AEDe3dd7AdBf", + weth: "0xAEb34d4C107BDa831C0B50d68eb13F2469FB21f5", mushroomNft: "0x209c23db16298504354112fa4210d368e1d564da", alchemyUrl: "https://eth-goerli.g.alchemy.com/v2/".concat( process.env.REACT_APP_ALCHEMY_KEY_GOERLI || "" From 89927bb5ab2cbca9f91dd47d17d97589a2543d66 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 12 Dec 2022 11:01:33 -0600 Subject: [PATCH 194/278] fixed loading price when wallet not connected --- src/components/Vaults/monitoring/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index 7b51654..d0efe52 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -489,7 +489,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { loadVaultData(); } - } else { + } else if (prices.daiOraclePrice !== "0") { setCurrentOwnerFilter(vaultsOwnerFilter[0]); loadVaultData(); } @@ -497,7 +497,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { load(); }, // eslint-disable-next-line - [signer] + [signer, prices.daiOraclePrice] ); const tokensSymbols = (): Array => { From 102a735c8e833606517d60fd65e2a28e39e10417 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sat, 17 Dec 2022 04:48:08 -0600 Subject: [PATCH 195/278] working on summary page --- src/App.tsx | 6 +- src/components/Welcome/Features.tsx | 57 ++ src/components/Welcome/Protocol.tsx | 801 ++++++++++++++------------- src/components/Welcome/Protocol2.tsx | 550 ++++++++++++++++++ src/components/Welcome/Summary.tsx | 351 ++++-------- src/components/Welcome/Summary2.tsx | 254 +++------ src/components/Welcome/index.tsx | 65 +-- src/hooks/index.tsx | 2 + src/styles/app.scss | 1 + src/styles/summary.scss | 281 +++------- src/styles/summary2.scss | 118 +++- src/utils/utils.tsx | 4 +- 12 files changed, 1400 insertions(+), 1090 deletions(-) create mode 100644 src/components/Welcome/Features.tsx create mode 100644 src/components/Welcome/Protocol2.tsx diff --git a/src/App.tsx b/src/App.tsx index 016a981..8408bf7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -943,11 +943,7 @@ const App = () => { } else { setLoadingContracts(true); const chainId = process.env.REACT_APP_NETWORK_ID || "5"; - let networkName = NETWORKS.mainnet.name; - if (isGoerli(parseInt(chainId))) { - networkName = NETWORKS.goerli.name; - } - const provider = getDefaultProvider(parseInt(chainId), networkName); + const provider = getDefaultProvider(parseInt(chainId)); const randomSigner = ethers.Wallet.createRandom().connect(provider); const ethcallProvider = new Provider(randomSigner.provider); if (isArbitrum(parseInt(chainId))) { diff --git a/src/components/Welcome/Features.tsx b/src/components/Welcome/Features.tsx new file mode 100644 index 0000000..9c96cc4 --- /dev/null +++ b/src/components/Welcome/Features.tsx @@ -0,0 +1,57 @@ +import React from "react"; +import { Button, Card, Col } from "react-bootstrap/esm"; +import { GiSpottedMushroom } from "react-icons/gi"; +import { FaArrowRight } from "react-icons/fa"; +import { ReactComponent as VaultIcon } from "../../assets/images/welcome/vault.svg"; +import { ReactComponent as StakeIcon } from "../../assets/images/welcome/stake.svg"; +import { ReactComponent as FarmIcon } from "../../assets/images/welcome/farm.svg"; + +const Features = () => ( + + + +

Use Cryptex For

+
+ + + + + + +
+ +); + +export default Features; diff --git a/src/components/Welcome/Protocol.tsx b/src/components/Welcome/Protocol.tsx index 943697c..196de16 100644 --- a/src/components/Welcome/Protocol.tsx +++ b/src/components/Welcome/Protocol.tsx @@ -1,9 +1,10 @@ import React, { useContext, useEffect, useState } from "react"; -import Card from "react-bootstrap/esm/Card"; -import Spinner from "react-bootstrap/Spinner"; +import { Spinner } from "react-bootstrap/esm/"; import { BigNumber, ethers } from "ethers"; import { useTranslation } from "react-i18next"; import NumberFormat from "react-number-format"; +import { Provider } from "ethers-multicall"; +import { useLazyQuery, gql } from "@apollo/client"; import { networkContext, oraclesContext, signerContext, tokensContext } from "../../state"; import { ReactComponent as StakeIcon } from "../../assets/images/graph/stake.svg"; import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; @@ -17,6 +18,7 @@ import { ReactComponent as POLYGONIcon } from "../../assets/images/graph/polygon import { ReactComponent as WBTCIcon } from "../../assets/images/graph/wbtc.svg"; import { ReactComponent as USDCIcon } from "../../assets/images/graph/usdc.svg"; import cryptexJson from "../../contracts/cryptex.json"; +import { usePrices2 } from "../../hooks"; import { isArbitrum, isInLayer1, @@ -29,15 +31,17 @@ import { import { NETWORKS } from "../../utils/constants"; type props = { - data: any; + currentChainId: number; + ethCallProvider: Provider | undefined; }; -const Protocol = ({ data }: props) => { +const Protocol = ({ currentChainId, ethCallProvider }: props) => { const { t } = useTranslation(); const currentNetwork = useContext(networkContext); const tokens = useContext(tokensContext); const signer = useContext(signerContext); const oracles = useContext(oraclesContext); + const prices = usePrices2(currentChainId, ethCallProvider); const [ethStake, setETHStake] = useState("0"); const [daiStake, setDAIStake] = useState("0"); const [maticStake, setMATICStake] = useState("0"); @@ -49,7 +53,15 @@ const Protocol = ({ data }: props) => { const [usdcStake, setUSDCStake] = useState("0"); const [TotalStake, setTotalStake] = useState("0"); const [totalSupply, setTotalSupply] = useState("0.0"); - const [loading, setLoading] = useState(true); + + const VAULTS_STATE = gql` + { + states { + amountStaked + id + } + } + `; const getMaticUSD = async () => { const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); @@ -59,322 +71,385 @@ const Protocol = ({ data }: props) => { return maticUSD; }; - useEffect(() => { - const load = async () => { - if ( - oracles && - tokens && - data && - signer && - !isUndefined(tokens.tcapTokenRead) && - validOracles(currentNetwork.chainId || 1, oracles) - ) { - const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); - const currentTotalSupplyCall = await tokens.tcapTokenRead?.totalSupply(); - const ethcalls = [daiOraclePriceCall, currentTotalSupplyCall]; + const loadStaked = async (data: any) => { + if ( + oracles && + tokens && + data && + signer && + !isUndefined(tokens.tcapTokenRead) && + validOracles(currentNetwork.chainId || 1, oracles) + ) { + const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); + const currentTotalSupplyCall = await tokens.tcapTokenRead?.totalSupply(); + const ethcalls = [daiOraclePriceCall, currentTotalSupplyCall]; - if (isInLayer1(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(aaveOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(wbtcOraclePriceCall); - ethcalls.push(usdcOraclePriceCall); - } - if (isOptimism(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); - const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(snxOraclePriceCall); - ethcalls.push(uniOraclePriceCall); - } - if (isPolygon(currentNetwork.chainId)) { - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - ethcalls.push(wbtcOraclePriceCall); - } - if (isArbitrum(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - } + if (isInLayer1(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + ethcalls.push(aaveOraclePriceCall); + ethcalls.push(linkOraclePriceCall); + ethcalls.push(wbtcOraclePriceCall); + ethcalls.push(usdcOraclePriceCall); + } + if (isOptimism(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); + const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + ethcalls.push(linkOraclePriceCall); + ethcalls.push(snxOraclePriceCall); + ethcalls.push(uniOraclePriceCall); + } + if (isPolygon(currentNetwork.chainId)) { + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + ethcalls.push(wbtcOraclePriceCall); + } + if (isArbitrum(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + } - let daiOraclePrice; - let currentTotalSupply; - let wethOraclePrice; - let aaveOraclePrice; - let linkOraclePrice; - let snxOraclePrice; - let uniOraclePrice; - let wbtcOraclePrice; - let usdcOraclePrice; + let daiOraclePrice; + let currentTotalSupply; + let wethOraclePrice; + let aaveOraclePrice; + let linkOraclePrice; + let snxOraclePrice; + let uniOraclePrice; + let wbtcOraclePrice; + let usdcOraclePrice; - if (isInLayer1(currentNetwork.chainId)) { - // @ts-ignore - [ - daiOraclePrice, - currentTotalSupply, - wethOraclePrice, - aaveOraclePrice, - linkOraclePrice, - wbtcOraclePrice, - usdcOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); - } else if (isArbitrum(currentNetwork.chainId)) { - // @ts-ignore - [daiOraclePrice, currentTotalSupply, wethOraclePrice] = await signer.ethcallProvider?.all( - ethcalls - ); - } else if (isOptimism(currentNetwork.chainId)) { - // @ts-ignore - [ - daiOraclePrice, - currentTotalSupply, - wethOraclePrice, - linkOraclePrice, - snxOraclePrice, - uniOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); - } else { - // @ts-ignore - [daiOraclePrice, currentTotalSupply, wbtcOraclePrice] = await signer.ethcallProvider?.all( - ethcalls - ); - } + if (isInLayer1(currentNetwork.chainId)) { + // @ts-ignore + [ + daiOraclePrice, + currentTotalSupply, + wethOraclePrice, + aaveOraclePrice, + linkOraclePrice, + wbtcOraclePrice, + usdcOraclePrice, + ] = await signer.ethcallProvider?.all(ethcalls); + } else if (isArbitrum(currentNetwork.chainId)) { + // @ts-ignore + [daiOraclePrice, currentTotalSupply, wethOraclePrice] = await signer.ethcallProvider?.all( + ethcalls + ); + } else if (isOptimism(currentNetwork.chainId)) { + // @ts-ignore + [ + daiOraclePrice, + currentTotalSupply, + wethOraclePrice, + linkOraclePrice, + snxOraclePrice, + uniOraclePrice, + ] = await signer.ethcallProvider?.all(ethcalls); + } else { + // @ts-ignore + [daiOraclePrice, currentTotalSupply, wbtcOraclePrice] = await signer.ethcallProvider?.all( + ethcalls + ); + } + + let currentDAIStake = BigNumber.from(0); + let currentWETHStake = BigNumber.from(0); + let currentAAVEStake = BigNumber.from(0); + let currentLINKStake = BigNumber.from(0); + let currentSNXStake = BigNumber.from(0); + let currentUNIStake = BigNumber.from(0); + let currentMATICStake = BigNumber.from(0); + let currentWBTCStake = BigNumber.from(0); + let currentUSDCStake = BigNumber.from(0); - let currentDAIStake = BigNumber.from(0); - let currentWETHStake = BigNumber.from(0); - let currentAAVEStake = BigNumber.from(0); - let currentLINKStake = BigNumber.from(0); - let currentSNXStake = BigNumber.from(0); - let currentUNIStake = BigNumber.from(0); - let currentMATICStake = BigNumber.from(0); - let currentWBTCStake = BigNumber.from(0); - let currentUSDCStake = BigNumber.from(0); + const networkId = currentNetwork.chainId; + // @ts-ignore + let contracts; + switch (networkId) { + case NETWORKS.mainnet.chainId: + contracts = cryptexJson[1].mainnet.contracts; + break; + case NETWORKS.goerli.chainId: + contracts = cryptexJson[5].goerli.contracts; + break; + case NETWORKS.optimism.chainId: + contracts = cryptexJson[10].optimism.contracts; + break; + case NETWORKS.okovan.chainId: + contracts = cryptexJson[69].okovan.contracts; + break; + case NETWORKS.polygon.chainId: + contracts = cryptexJson[137].polygon.contracts; + break; + case NETWORKS.arbitrum.chainId: + contracts = cryptexJson[42161].arbitrum.contracts; + break; + case NETWORKS.arbitrum_goerli.chainId: + contracts = cryptexJson[421613].arbitrum_goerli.contracts; + break; + case NETWORKS.mumbai.chainId: + contracts = cryptexJson[80001].mumbai.contracts; + break; + default: + contracts = cryptexJson[5].goerli.contracts; + break; + } - const networkId = currentNetwork.chainId; + await data.states.forEach((s: any) => { + const cAddress = s.id.toLowerCase(); // @ts-ignore - let contracts; - switch (networkId) { - case NETWORKS.mainnet.chainId: - contracts = cryptexJson[1].mainnet.contracts; - break; - case NETWORKS.goerli.chainId: - contracts = cryptexJson[5].goerli.contracts; - break; - case NETWORKS.optimism.chainId: - contracts = cryptexJson[10].optimism.contracts; - break; - case NETWORKS.okovan.chainId: - contracts = cryptexJson[69].okovan.contracts; - break; - case NETWORKS.polygon.chainId: - contracts = cryptexJson[137].polygon.contracts; - break; - case NETWORKS.arbitrum.chainId: - contracts = cryptexJson[42161].arbitrum.contracts; - break; - case NETWORKS.arbitrum_goerli.chainId: - contracts = cryptexJson[421613].arbitrum_goerli.contracts; - break; - case NETWORKS.mumbai.chainId: - contracts = cryptexJson[80001].mumbai.contracts; - break; - default: - contracts = cryptexJson[5].goerli.contracts; - break; + if (cAddress === contracts.DAIVaultHandler.address.toLowerCase()) { + currentDAIStake = currentDAIStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); } - await data.states.forEach((s: any) => { - const cAddress = s.id.toLowerCase(); + if (isPolygon(currentNetwork.chainId)) { // @ts-ignore - if (cAddress === contracts.DAIVaultHandler.address.toLowerCase()) { - currentDAIStake = currentDAIStake.add( + if (cAddress === contracts.MATICVaultHandler.address.toLowerCase()) { + currentMATICStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + } + if (isInLayer1(currentNetwork.chainId) || isPolygon(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.HardWBTCVaultHandler.address.toLowerCase()) { + currentWBTCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + } + if (isInLayer1(currentNetwork.chainId) || isOptimism(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { + currentWETHStake = currentWETHStake.add( s.amountStaked ? s.amountStaked : BigNumber.from(0) ); } + // @ts-ignore + if (cAddress === contracts.LinkVaultHandler.address.toLowerCase()) { + currentLINKStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + } - if (isPolygon(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.MATICVaultHandler.address.toLowerCase()) { - currentMATICStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } + if (isInLayer1(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.AaveVaultHandler.address.toLowerCase()) { + currentAAVEStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); } - if (isInLayer1(currentNetwork.chainId) || isPolygon(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.HardWBTCVaultHandler.address.toLowerCase()) { - currentWBTCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } + // @ts-ignore + if (cAddress === contracts.HardUSDCVaultHandler.address.toLowerCase()) { + currentUSDCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); } - if (isInLayer1(currentNetwork.chainId) || isOptimism(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { - currentWETHStake = currentWETHStake.add( - s.amountStaked ? s.amountStaked : BigNumber.from(0) - ); - } - // @ts-ignore - if (cAddress === contracts.LinkVaultHandler.address.toLowerCase()) { - currentLINKStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } + // @ts-ignore + if (cAddress === contracts.HardWETHVaultHandler.address.toLowerCase()) { + currentWETHStake = currentWETHStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); } - - if (isInLayer1(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.AaveVaultHandler.address.toLowerCase()) { - currentAAVEStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - // @ts-ignore - if (cAddress === contracts.HardUSDCVaultHandler.address.toLowerCase()) { - currentUSDCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - // @ts-ignore - if (cAddress === contracts.HardWETHVaultHandler.address.toLowerCase()) { - currentWETHStake = currentWETHStake.add( - s.amountStaked ? s.amountStaked : BigNumber.from(0) - ); - } - // @ts-ignore - if (cAddress === contracts.HardDaiVaultHandler.address.toLowerCase()) { - currentDAIStake = currentDAIStake.add( - s.amountStaked ? s.amountStaked : BigNumber.from(0) - ); - } + // @ts-ignore + if (cAddress === contracts.HardDaiVaultHandler.address.toLowerCase()) { + currentDAIStake = currentDAIStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); } - if (isOptimism(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.SNXVaultHandler.address.toLowerCase()) { - currentSNXStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - // @ts-ignore - if (cAddress === contracts.UNIVaultHandler.address.toLowerCase()) { - currentUNIStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } + } + if (isOptimism(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.SNXVaultHandler.address.toLowerCase()) { + currentSNXStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); } - - if (isArbitrum(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { - currentWETHStake = currentWETHStake.add( - s.amountStaked ? s.amountStaked : BigNumber.from(0) - ); - } + // @ts-ignore + if (cAddress === contracts.UNIVaultHandler.address.toLowerCase()) { + currentUNIStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); } - }); - - const formatDAI = ethers.utils.formatEther(currentDAIStake); - setDAIStake(formatDAI); - const formatETH = ethers.utils.formatEther(currentWETHStake); - setETHStake(formatETH); - const formatAAVE = ethers.utils.formatEther(currentAAVEStake); - setAaveStake(formatAAVE); - const formatLINK = ethers.utils.formatEther(currentLINKStake); - setLinkStake(formatLINK); - const formatSNX = ethers.utils.formatEther(currentSNXStake); - setSNXStake(formatSNX); - const formatUNI = ethers.utils.formatEther(currentUNIStake); - setUNIStake(formatUNI); - const formatMATIC = ethers.utils.formatEther(currentMATICStake); - setMATICStake(formatMATIC); - const formatWBTC = ethers.utils.formatUnits(currentWBTCStake, 8); - setWBTCStake(formatWBTC); - const formatUSDC = ethers.utils.formatUnits(currentUSDCStake, 6); - setUSDCStake(formatUSDC); - - const daiUSD = ethers.utils.formatEther(daiOraclePrice.mul(10000000000)); - let ethUSD = "0"; - let aaveUSD = "0"; - let linkUSD = "0"; - let snxUSD = "0"; - let uniUSD = "0"; - let maticUSD = "0"; - let wbtcUSD = "0"; - let usdcUSD = "0"; - if (isInLayer1(currentNetwork.chainId)) { - ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - aaveUSD = ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)); - linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); - wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); - usdcUSD = ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)); } + if (isArbitrum(currentNetwork.chainId)) { - ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - } - if (isOptimism(currentNetwork.chainId)) { - ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); - snxUSD = ethers.utils.formatEther(snxOraclePrice.mul(10000000000)); - uniUSD = ethers.utils.formatEther(uniOraclePrice.mul(10000000000)); - } - if (isPolygon(currentNetwork.chainId)) { - maticUSD = await getMaticUSD(); - wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); + // @ts-ignore + if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { + currentWETHStake = currentWETHStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); + } } + }); - const totalUSD = - toUSD(ethUSD, formatETH) + - toUSD(daiUSD, formatDAI) + - toUSD(aaveUSD, formatAAVE) + - toUSD(linkUSD, formatLINK) + - toUSD(snxUSD, formatSNX) + - toUSD(uniUSD, formatUNI) + - toUSD(maticUSD, formatMATIC) + - toUSD(wbtcUSD, formatWBTC) + - toUSD(usdcUSD, formatUSDC); - setTotalStake(totalUSD.toString()); - setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); + const formatDAI = ethers.utils.formatEther(currentDAIStake); + setDAIStake(formatDAI); + const formatETH = ethers.utils.formatEther(currentWETHStake); + setETHStake(formatETH); + const formatAAVE = ethers.utils.formatEther(currentAAVEStake); + setAaveStake(formatAAVE); + const formatLINK = ethers.utils.formatEther(currentLINKStake); + setLinkStake(formatLINK); + const formatSNX = ethers.utils.formatEther(currentSNXStake); + setSNXStake(formatSNX); + const formatUNI = ethers.utils.formatEther(currentUNIStake); + setUNIStake(formatUNI); + const formatMATIC = ethers.utils.formatEther(currentMATICStake); + setMATICStake(formatMATIC); + const formatWBTC = ethers.utils.formatUnits(currentWBTCStake, 8); + setWBTCStake(formatWBTC); + const formatUSDC = ethers.utils.formatUnits(currentUSDCStake, 6); + setUSDCStake(formatUSDC); + + const daiUSD = ethers.utils.formatEther(daiOraclePrice.mul(10000000000)); + let ethUSD = "0"; + let aaveUSD = "0"; + let linkUSD = "0"; + let snxUSD = "0"; + let uniUSD = "0"; + let maticUSD = "0"; + let wbtcUSD = "0"; + let usdcUSD = "0"; + if (isInLayer1(currentNetwork.chainId)) { + ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + aaveUSD = ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)); + linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); + wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); + usdcUSD = ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)); + } + if (isArbitrum(currentNetwork.chainId)) { + ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); } - setLoading(false); + if (isOptimism(currentNetwork.chainId)) { + ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); + snxUSD = ethers.utils.formatEther(snxOraclePrice.mul(10000000000)); + uniUSD = ethers.utils.formatEther(uniOraclePrice.mul(10000000000)); + } + if (isPolygon(currentNetwork.chainId)) { + maticUSD = await getMaticUSD(); + wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); + } + + const totalUSD = + toUSD(ethUSD, formatETH) + + toUSD(daiUSD, formatDAI) + + toUSD(aaveUSD, formatAAVE) + + toUSD(linkUSD, formatLINK) + + toUSD(snxUSD, formatSNX) + + toUSD(uniUSD, formatUNI) + + toUSD(maticUSD, formatMATIC) + + toUSD(wbtcUSD, formatWBTC) + + toUSD(usdcUSD, formatUSDC); + setTotalStake(totalUSD.toString()); + setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); + } + }; + + const [loadStakedData, { loading }] = useLazyQuery(VAULTS_STATE, { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + // skip: skipQuery, + onError: (error) => { + console.log(error); + }, + onCompleted: (data: any) => { + if (!isUndefined(data)) { + console.log("-- data --", data); + loadStaked(data); + } + }, + }); + + useEffect(() => { + const load = async () => { + loadStakedData(); }; load(); // eslint-disable-next-line - }, [data]); + }, [currentChainId]); return ( - - -

- <>{t("welcome.summary.title")} -

-
- - {loading ? ( -
- +
+ {loading ? ( +
+ +
+ ) : ( +
+
+ +
+
+ <>{t("welcome.summary.staked-usd")} +
+
+ +
+
+
+
+ +
+
+ <>{t("welcome.summary.total-supply")} +
+
+ +
+
- ) : ( -
-
- + {!isPolygon(currentNetwork.chainId) && ( +
+
- <>{t("welcome.summary.staked-usd")} + <>{t("welcome.summary.staked-eth")}
-
+
-
- + )} +
+ +
+
+ <>{t("welcome.summary.staked-dai")} +
+
+ +
+
+
+ {isInLayer1(currentNetwork.chainId) && ( +
+
- <>{t("welcome.summary.total-supply")} + <>{t("welcome.summary.staked-aave")}
-
+
{
- {!isPolygon(currentNetwork.chainId) && ( -
- -
-
- <>{t("welcome.summary.staked-eth")} -
-
- -
-
-
- )} + )} + {!isPolygon(currentNetwork.chainId) && (
- +
- <>{t("welcome.summary.staked-dai")} + <>{t("welcome.summary.staked-link")}
-
+
{
- {isInLayer1(currentNetwork.chainId) && ( + )} + {isOptimism(currentNetwork.chainId) && ( + <>
- +
-
- <>{t("welcome.summary.staked-aave")} -
+

+ <>{t("welcome.summary.staked-uni")} +

{
- )} - {!isPolygon(currentNetwork.chainId) && (
- +
-
- <>{t("welcome.summary.staked-link")} -
+

+ <>{t("welcome.summary.staked-snx")} +

{
- )} - {isOptimism(currentNetwork.chainId) && ( - <> -
- -
-

- <>{t("welcome.summary.staked-uni")} -

-
- -
-
-
-
- -
-

- <>{t("welcome.summary.staked-snx")} -

-
- -
-
-
- - )} - {isPolygon(currentNetwork.chainId) && ( -
- -
-
- <>{t("welcome.summary.staked-matic")} -
-
- -
-
-
- )} - {!isOptimism(currentNetwork.chainId) && ( -
- -
-
- <>{t("welcome.summary.staked-wbtc")} -
-
- -
-
+ + )} + {isPolygon(currentNetwork.chainId) && ( +
+ +
+
+ <>{t("welcome.summary.staked-matic")} +
+
+ +
- )} +
+ )} + {!isOptimism(currentNetwork.chainId) && (
- +
- <>{t("welcome.summary.staked-usdc")} + <>{t("welcome.summary.staked-wbtc")}
{
+ )} +
+ +
+
+ <>{t("welcome.summary.staked-usdc")} +
+
+ +
+
- )} - - +
+ )} +
); }; diff --git a/src/components/Welcome/Protocol2.tsx b/src/components/Welcome/Protocol2.tsx new file mode 100644 index 0000000..607f03c --- /dev/null +++ b/src/components/Welcome/Protocol2.tsx @@ -0,0 +1,550 @@ +import React, { useContext, useEffect, useState } from "react"; +import Card from "react-bootstrap/esm/Card"; +import Spinner from "react-bootstrap/Spinner"; +import { BigNumber, ethers } from "ethers"; +import { useTranslation } from "react-i18next"; +import NumberFormat from "react-number-format"; +import { networkContext, oraclesContext, signerContext, tokensContext } from "../../state"; +import { ReactComponent as StakeIcon } from "../../assets/images/graph/stake.svg"; +import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; +import { ReactComponent as WETHIcon } from "../../assets/images/graph/weth.svg"; +import { ReactComponent as DAIIcon } from "../../assets/images/graph/DAI.svg"; +import { ReactComponent as AAVEIcon } from "../../assets/images/graph/aave.svg"; +import { ReactComponent as LINKIcon } from "../../assets/images/graph/chainlink.svg"; +import { ReactComponent as UNIIcon } from "../../assets/images/graph/uni.svg"; +import { ReactComponent as SNXIcon } from "../../assets/images/graph/snx.svg"; +import { ReactComponent as POLYGONIcon } from "../../assets/images/graph/polygon3.svg"; +import { ReactComponent as WBTCIcon } from "../../assets/images/graph/wbtc.svg"; +import { ReactComponent as USDCIcon } from "../../assets/images/graph/usdc.svg"; +import cryptexJson from "../../contracts/cryptex.json"; +import { + isArbitrum, + isInLayer1, + isOptimism, + isPolygon, + isUndefined, + toUSD, + validOracles, +} from "../../utils/utils"; +import { NETWORKS } from "../../utils/constants"; + +type props = { + data: any; +}; + +const Protocol2 = ({ data }: props) => { + const { t } = useTranslation(); + const currentNetwork = useContext(networkContext); + const tokens = useContext(tokensContext); + const signer = useContext(signerContext); + const oracles = useContext(oraclesContext); + const [ethStake, setETHStake] = useState("0"); + const [daiStake, setDAIStake] = useState("0"); + const [maticStake, setMATICStake] = useState("0"); + const [aaveStake, setAaveStake] = useState("0"); + const [linkStake, setLinkStake] = useState("0"); + const [snxStake, setSNXStake] = useState("0"); + const [uniStake, setUNIStake] = useState("0"); + const [wbtcStake, setWBTCStake] = useState("0"); + const [usdcStake, setUSDCStake] = useState("0"); + const [TotalStake, setTotalStake] = useState("0"); + const [totalSupply, setTotalSupply] = useState("0.0"); + const [loading, setLoading] = useState(true); + + const getMaticUSD = async () => { + const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); + // @ts-ignore + const [maticOraclePrice] = await signer.ethcallProvider?.all([maticOraclePriceCall]); + const maticUSD = ethers.utils.formatEther(maticOraclePrice.mul(10000000000)); + return maticUSD; + }; + + useEffect(() => { + const load = async () => { + if ( + oracles && + tokens && + data && + signer && + !isUndefined(tokens.tcapTokenRead) && + validOracles(currentNetwork.chainId || 1, oracles) + ) { + const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); + const currentTotalSupplyCall = await tokens.tcapTokenRead?.totalSupply(); + const ethcalls = [daiOraclePriceCall, currentTotalSupplyCall]; + + if (isInLayer1(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + ethcalls.push(aaveOraclePriceCall); + ethcalls.push(linkOraclePriceCall); + ethcalls.push(wbtcOraclePriceCall); + ethcalls.push(usdcOraclePriceCall); + } + if (isOptimism(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); + const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + ethcalls.push(linkOraclePriceCall); + ethcalls.push(snxOraclePriceCall); + ethcalls.push(uniOraclePriceCall); + } + if (isPolygon(currentNetwork.chainId)) { + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + ethcalls.push(wbtcOraclePriceCall); + } + if (isArbitrum(currentNetwork.chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + } + + let daiOraclePrice; + let currentTotalSupply; + let wethOraclePrice; + let aaveOraclePrice; + let linkOraclePrice; + let snxOraclePrice; + let uniOraclePrice; + let wbtcOraclePrice; + let usdcOraclePrice; + + if (isInLayer1(currentNetwork.chainId)) { + // @ts-ignore + [ + daiOraclePrice, + currentTotalSupply, + wethOraclePrice, + aaveOraclePrice, + linkOraclePrice, + wbtcOraclePrice, + usdcOraclePrice, + ] = await signer.ethcallProvider?.all(ethcalls); + } else if (isArbitrum(currentNetwork.chainId)) { + // @ts-ignore + [daiOraclePrice, currentTotalSupply, wethOraclePrice] = await signer.ethcallProvider?.all( + ethcalls + ); + } else if (isOptimism(currentNetwork.chainId)) { + // @ts-ignore + [ + daiOraclePrice, + currentTotalSupply, + wethOraclePrice, + linkOraclePrice, + snxOraclePrice, + uniOraclePrice, + ] = await signer.ethcallProvider?.all(ethcalls); + } else { + // @ts-ignore + [daiOraclePrice, currentTotalSupply, wbtcOraclePrice] = await signer.ethcallProvider?.all( + ethcalls + ); + } + + let currentDAIStake = BigNumber.from(0); + let currentWETHStake = BigNumber.from(0); + let currentAAVEStake = BigNumber.from(0); + let currentLINKStake = BigNumber.from(0); + let currentSNXStake = BigNumber.from(0); + let currentUNIStake = BigNumber.from(0); + let currentMATICStake = BigNumber.from(0); + let currentWBTCStake = BigNumber.from(0); + let currentUSDCStake = BigNumber.from(0); + + const networkId = currentNetwork.chainId; + // @ts-ignore + let contracts; + switch (networkId) { + case NETWORKS.mainnet.chainId: + contracts = cryptexJson[1].mainnet.contracts; + break; + case NETWORKS.goerli.chainId: + contracts = cryptexJson[5].goerli.contracts; + break; + case NETWORKS.optimism.chainId: + contracts = cryptexJson[10].optimism.contracts; + break; + case NETWORKS.okovan.chainId: + contracts = cryptexJson[69].okovan.contracts; + break; + case NETWORKS.polygon.chainId: + contracts = cryptexJson[137].polygon.contracts; + break; + case NETWORKS.arbitrum.chainId: + contracts = cryptexJson[42161].arbitrum.contracts; + break; + case NETWORKS.arbitrum_goerli.chainId: + contracts = cryptexJson[421613].arbitrum_goerli.contracts; + break; + case NETWORKS.mumbai.chainId: + contracts = cryptexJson[80001].mumbai.contracts; + break; + default: + contracts = cryptexJson[5].goerli.contracts; + break; + } + + await data.states.forEach((s: any) => { + const cAddress = s.id.toLowerCase(); + // @ts-ignore + if (cAddress === contracts.DAIVaultHandler.address.toLowerCase()) { + currentDAIStake = currentDAIStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); + } + + if (isPolygon(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.MATICVaultHandler.address.toLowerCase()) { + currentMATICStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + } + if (isInLayer1(currentNetwork.chainId) || isPolygon(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.HardWBTCVaultHandler.address.toLowerCase()) { + currentWBTCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + } + if (isInLayer1(currentNetwork.chainId) || isOptimism(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { + currentWETHStake = currentWETHStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); + } + // @ts-ignore + if (cAddress === contracts.LinkVaultHandler.address.toLowerCase()) { + currentLINKStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + } + + if (isInLayer1(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.AaveVaultHandler.address.toLowerCase()) { + currentAAVEStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + // @ts-ignore + if (cAddress === contracts.HardUSDCVaultHandler.address.toLowerCase()) { + currentUSDCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + // @ts-ignore + if (cAddress === contracts.HardWETHVaultHandler.address.toLowerCase()) { + currentWETHStake = currentWETHStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); + } + // @ts-ignore + if (cAddress === contracts.HardDaiVaultHandler.address.toLowerCase()) { + currentDAIStake = currentDAIStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); + } + } + if (isOptimism(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.SNXVaultHandler.address.toLowerCase()) { + currentSNXStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + // @ts-ignore + if (cAddress === contracts.UNIVaultHandler.address.toLowerCase()) { + currentUNIStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); + } + } + + if (isArbitrum(currentNetwork.chainId)) { + // @ts-ignore + if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { + currentWETHStake = currentWETHStake.add( + s.amountStaked ? s.amountStaked : BigNumber.from(0) + ); + } + } + }); + + const formatDAI = ethers.utils.formatEther(currentDAIStake); + setDAIStake(formatDAI); + const formatETH = ethers.utils.formatEther(currentWETHStake); + setETHStake(formatETH); + const formatAAVE = ethers.utils.formatEther(currentAAVEStake); + setAaveStake(formatAAVE); + const formatLINK = ethers.utils.formatEther(currentLINKStake); + setLinkStake(formatLINK); + const formatSNX = ethers.utils.formatEther(currentSNXStake); + setSNXStake(formatSNX); + const formatUNI = ethers.utils.formatEther(currentUNIStake); + setUNIStake(formatUNI); + const formatMATIC = ethers.utils.formatEther(currentMATICStake); + setMATICStake(formatMATIC); + const formatWBTC = ethers.utils.formatUnits(currentWBTCStake, 8); + setWBTCStake(formatWBTC); + const formatUSDC = ethers.utils.formatUnits(currentUSDCStake, 6); + setUSDCStake(formatUSDC); + + const daiUSD = ethers.utils.formatEther(daiOraclePrice.mul(10000000000)); + let ethUSD = "0"; + let aaveUSD = "0"; + let linkUSD = "0"; + let snxUSD = "0"; + let uniUSD = "0"; + let maticUSD = "0"; + let wbtcUSD = "0"; + let usdcUSD = "0"; + if (isInLayer1(currentNetwork.chainId)) { + ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + aaveUSD = ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)); + linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); + wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); + usdcUSD = ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)); + } + if (isArbitrum(currentNetwork.chainId)) { + ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + } + if (isOptimism(currentNetwork.chainId)) { + ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); + snxUSD = ethers.utils.formatEther(snxOraclePrice.mul(10000000000)); + uniUSD = ethers.utils.formatEther(uniOraclePrice.mul(10000000000)); + } + if (isPolygon(currentNetwork.chainId)) { + maticUSD = await getMaticUSD(); + wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); + } + + const totalUSD = + toUSD(ethUSD, formatETH) + + toUSD(daiUSD, formatDAI) + + toUSD(aaveUSD, formatAAVE) + + toUSD(linkUSD, formatLINK) + + toUSD(snxUSD, formatSNX) + + toUSD(uniUSD, formatUNI) + + toUSD(maticUSD, formatMATIC) + + toUSD(wbtcUSD, formatWBTC) + + toUSD(usdcUSD, formatUSDC); + setTotalStake(totalUSD.toString()); + setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); + } + setLoading(false); + }; + load(); + // eslint-disable-next-line + }, [data]); + + return ( + + +

+ <>{t("welcome.summary.title")} +

+
+ + {loading ? ( +
+ +
+ ) : ( +
+
+ +
+
+ <>{t("welcome.summary.staked-usd")} +
+
+ +
+
+
+
+ +
+
+ <>{t("welcome.summary.total-supply")} +
+
+ +
+
+
+ {!isPolygon(currentNetwork.chainId) && ( +
+ +
+
+ <>{t("welcome.summary.staked-eth")} +
+
+ +
+
+
+ )} +
+ +
+
+ <>{t("welcome.summary.staked-dai")} +
+
+ +
+
+
+ {isInLayer1(currentNetwork.chainId) && ( +
+ +
+
+ <>{t("welcome.summary.staked-aave")} +
+
+ +
+
+
+ )} + {!isPolygon(currentNetwork.chainId) && ( +
+ +
+
+ <>{t("welcome.summary.staked-link")} +
+
+ +
+
+
+ )} + {isOptimism(currentNetwork.chainId) && ( + <> +
+ +
+

+ <>{t("welcome.summary.staked-uni")} +

+
+ +
+
+
+
+ +
+

+ <>{t("welcome.summary.staked-snx")} +

+
+ +
+
+
+ + )} + {isPolygon(currentNetwork.chainId) && ( +
+ +
+
+ <>{t("welcome.summary.staked-matic")} +
+
+ +
+
+
+ )} + {!isOptimism(currentNetwork.chainId) && ( +
+ +
+
+ <>{t("welcome.summary.staked-wbtc")} +
+
+ +
+
+
+ )} +
+ +
+
+ <>{t("welcome.summary.staked-usdc")} +
+
+ +
+
+
+
+ )} +
+
+ ); +}; + +export default Protocol2; diff --git a/src/components/Welcome/Summary.tsx b/src/components/Welcome/Summary.tsx index e29b868..8b7aa7d 100644 --- a/src/components/Welcome/Summary.tsx +++ b/src/components/Welcome/Summary.tsx @@ -1,34 +1,18 @@ import React, { useContext, useEffect, useState } from "react"; -import Button from "react-bootstrap/esm/Button"; -import Card from "react-bootstrap/esm/Card"; -import Col from "react-bootstrap/esm/Col"; -import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; -import Tooltip from "react-bootstrap/esm/Tooltip"; -import { FaArrowRight } from "react-icons/fa"; -import { useHistory } from "react-router-dom"; -import { useTranslation } from "react-i18next"; import { ethers } from "ethers"; -import NumberFormat from "react-number-format"; -import { useQuery, gql } from "@apollo/client"; -import { - networkContext, - oraclesContext, - signerContext, - tokensContext, - Web3ModalContext, -} from "../../state"; -import { - makeShortAddress, - getPriceInUSDFromPair, - getENS, - isInLayer1, - isGoerli, -} from "../../utils/utils"; +import { Provider } from "ethers-multicall"; +import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; +import { Card, Col, Dropdown } from "react-bootstrap/esm"; import "../../styles/summary.scss"; import Protocol from "./Protocol"; -import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; -import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; -import Loading from "../Loading"; +import { GRAPHQL_ENDPOINT, NETWORKS } from "../../utils/constants"; +import { getDefaultProvider } from "../../utils/utils"; + +const clientOracle = (graphqlEndpoint: string) => + new ApolloClient({ + uri: graphqlEndpoint, + cache: new InMemoryCache(), + }); type props = { signerAddress: string; @@ -36,222 +20,115 @@ type props = { }; const Summary = ({ signerAddress, loadingContracts }: props) => { - const { t } = useTranslation(); - const history = useHistory(); - const [address, setAddress] = useState(""); - const [currentAddress, setCurrentAddress] = useState(""); - const [tcapBalance, setTcapBalance] = useState("0.0"); - const [tcapUSDBalance, setTcapUSDBalance] = useState("0.0"); - const [totalPrice, setTotalPrice] = useState("0.0"); - const [tcapPrice, setTcapPrice] = useState("0.0"); - const [ctxPrice, setCtxPrice] = useState("0.0"); - const [ctxUSDBalance, setCtxUSDBalance] = useState("0.0"); - const [ctxBalance, setCtxBalance] = useState("0.0"); - const [isLoading, setIsLoading] = useState(true); - const currentNetwork = useContext(networkContext); - const signer = useContext(signerContext); - const web3Modal = useContext(Web3ModalContext); - const tokens = useContext(tokensContext); - const oracles = useContext(oraclesContext); - - const VAULTS_STATE = gql` - { - states { - amountStaked - id - } - } - `; - - const { data } = useQuery(VAULTS_STATE, { - notifyOnNetworkStatusChange: true, - pollInterval: 35000, - fetchPolicy: "no-cache", - }); + const options = [ + { id: "0", name: "My Balance" }, + { id: "2", name: "Indexes Summary" }, + { id: "3", name: "Vaults Summary" }, + ]; + let chains = [ + { id: NETWORKS.mainnet.chainId, name: "Mainnet" }, + { id: NETWORKS.arbitrum.chainId, name: "Arbitrum" }, + { id: NETWORKS.optimism.chainId, name: "Optimism" }, + ]; + if (process.env.REACT_APP_NETWORK_ID !== "1") { + chains = [ + { id: NETWORKS.goerli.chainId, name: "Goerli" }, + { id: NETWORKS.arbitrum_goerli.chainId, name: "Arbitrum Goerli" }, + { id: NETWORKS.okovan.chainId, name: "OKovan" }, + ]; + } + const [currentOption, setCurrentOption] = useState(options[0]); + const [currentChain, setCurrentChain] = useState(chains[0]); + const [currentEthProvider, setCurrentEthProvider] = useState(); + const [apolloClient, setApolloClient] = useState( + clientOracle( + process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.goerli + ) + ); useEffect(() => { - const loadAddress = async () => { - if (oracles.tcapOracleRead) { - const currentTcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - // @ts-ignore - const [currentTcapPrice] = await signer.ethcallProvider?.all([currentTcapPriceCall]); - const TotalTcapPrice = currentTcapPrice.mul(10000000000); - const tPrice = ethers.utils.formatEther(TotalTcapPrice.div(10000000000)); - setTotalPrice(ethers.utils.formatEther(TotalTcapPrice)); - setTcapPrice(tPrice); - - let currentPriceCTX = 0; - if ( - !isGoerli(currentNetwork.chainId) && - (signerAddress === "" || isInLayer1(currentNetwork.chainId)) - ) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); - // @ts-ignore - const [wethOraclePrice, reservesCtxPool] = await signer.ethcallProvider?.all([ - wethOraclePriceCall, - reservesCtxPoolCall, - ]); - const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - currentPriceCTX = await getPriceInUSDFromPair( - reservesCtxPool[0], - reservesCtxPool[1], - parseFloat(currentPriceETH) - ); - setCtxPrice(currentPriceCTX.toString()); - } - - if ( - signer.signer && - tokens.tcapTokenRead && - signerAddress !== "" && - signerAddress !== currentAddress - ) { - const ens = await getENS(signerAddress); - if (ens) { - setAddress(ens); - } else { - setAddress(makeShortAddress(signerAddress)); - } - - const currentTcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(signerAddress); - // @ts-ignore - const [currentTcapBalance] = await signer.ethcallProvider?.all([currentTcapBalanceCall]); - const tcapString = ethers.utils.formatEther(currentTcapBalance); - setTcapBalance(tcapString); - const tcapUSD = parseFloat(tcapString) * parseFloat(tPrice); - if (tcapUSD < 0.0001) { - setTcapUSDBalance("0.0"); - } else { - setTcapUSDBalance(tcapUSD.toString()); - } - if (isInLayer1(currentNetwork.chainId)) { - const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(signerAddress); - // @ts-ignore - const [currentCtxBalance] = await signer.ethcallProvider?.all([currentCtxBalanceCall]); - const ctxString = ethers.utils.formatEther(currentCtxBalance); - setCtxBalance(ctxString); - const ctxUSD = parseFloat(ctxString) * currentPriceCTX; - setCtxUSDBalance(ctxUSD.toString()); - } - setCurrentAddress(signerAddress); - } - setIsLoading(false); - } - }; - loadAddress(); + switch (currentChain.id) { + case NETWORKS.mainnet.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); + break; + case NETWORKS.goerli.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.goerli)); + break; + case NETWORKS.arbitrum.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum)); + break; + case NETWORKS.arbitrum_goerli.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum_goerli)); + break; + case NETWORKS.optimism.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.optimism)); + break; + case NETWORKS.okovan.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.okovan)); + break; + case NETWORKS.polygon.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.polygon)); + break; + case NETWORKS.mumbai.chainId: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mumbai)); + break; + default: + setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); + break; + } + const provider = getDefaultProvider(currentChain.id); + const randomSigner = ethers.Wallet.createRandom().connect(provider); + const ethcallProvider = new Provider(randomSigner.provider); + ethcallProvider.init(); + setCurrentEthProvider(ethcallProvider); + }, [currentChain.id]); - // eslint-disable-next-line - }, [signerAddress, loadingContracts]); + const handleOptionChange = (eventKey: string) => { + const o = options.find((option) => option.id === eventKey); + setCurrentOption(o || options[0]); + }; - if (isLoading) { - return ; - } + const handleChainChange = (eventKey: string) => { + const c = chains.find((chain) => chain.id.toString() === eventKey); + setCurrentChain(c || chains[0]); + }; return ( -
-
-
-

- - - <>{t("welcome.tcap-info")} - - } - > - - -

-

- <>{t("welcome.tcap")}: -

-
-
-

- -

-

- <>{t("welcome.tcap-price")}: -

-
- {isInLayer1(currentNetwork.chainId) && ( -
-

- -

-

- <>{t("welcome.ctx-price")}: -

-
- )} -
-
- - - - - - - - - -
-
+ + + + handleOptionChange(eventKey || "0")}> + +
{currentOption.name}
+
+ + {options.map((item) => ( + + {item.name} + + ))} + +
+ handleChainChange(eventKey || "1")}> + +
{currentChain.name}
+
+ + {chains.map((item) => ( + + {item.name} + + ))} + +
+
+ + + + + +
+ ); }; diff --git a/src/components/Welcome/Summary2.tsx b/src/components/Welcome/Summary2.tsx index deb03a1..80db002 100644 --- a/src/components/Welcome/Summary2.tsx +++ b/src/components/Welcome/Summary2.tsx @@ -2,9 +2,10 @@ import React, { useContext, useEffect, useState } from "react"; import Button from "react-bootstrap/esm/Button"; import Card from "react-bootstrap/esm/Card"; import Col from "react-bootstrap/esm/Col"; -import Row from "react-bootstrap/esm/Row"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; +import { GiSpottedMushroom } from "react-icons/gi"; +import { FaArrowRight } from "react-icons/fa"; import { useHistory } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { ethers } from "ethers"; @@ -24,10 +25,11 @@ import { isInLayer1, isGoerli, } from "../../utils/utils"; -import "../../styles/summary.scss"; -import Protocol from "./Protocol"; -import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; -import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; +import "../../styles/summary2.scss"; +import Protocol2 from "./Protocol2"; +import { ReactComponent as VaultIcon } from "../../assets/images/welcome/vault.svg"; +import { ReactComponent as StakeIcon } from "../../assets/images/welcome/stake.svg"; +import { ReactComponent as FarmIcon } from "../../assets/images/welcome/farm.svg"; import Loading from "../Loading"; type props = { @@ -35,7 +37,7 @@ type props = { loadingContracts: boolean; }; -const Summary = ({ signerAddress, loadingContracts }: props) => { +const Summary2 = ({ signerAddress, loadingContracts }: props) => { const { t } = useTranslation(); const history = useHistory(); const [address, setAddress] = useState(""); @@ -149,7 +151,7 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { } return ( -
+

@@ -191,7 +193,7 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { />

- <>{t("welcome.tcap-price")}: + <>{t("welcome.tcap-price")}

{isInLayer1(currentNetwork.chainId) && ( @@ -207,185 +209,91 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { />

- <>{t("welcome.ctx-price")}: + <>{t("welcome.ctx-price")}

)} +
+

+ +

+

+ <>{t("welcome.tcap-balance")} +

+
+
+

+ +

+

+ <>{t("welcome.ctx-balance")} +

+
-
- - {address !== "" ? ( - - -
-

- <>{t("welcome.title1")} -

-
-
- -
-
-
-
- <>{t("welcome.tcap-balance")} -
-
-
-
-
- -
- -
-

- -

-
-
- {isInLayer1(currentNetwork.chainId) && ( -
-
-
- <>{t("welcome.ctx-balance")} -
-
-
-
-
- -
- -
-

- -

-
-
- )} -
-
-
- ) : ( - - -

- <>{t("welcome.title3")} -

-
- - -

- <>{t("welcome.subtitle3")} -

-
- -
-
-
-
- )} - +
+ + -

- <>{t("welcome.title2")} -

+

Use Cryptex For

-

- <>{t("welcome.subtitle2")} -

- - - - - - - - - - - - + + + +
- +
); }; -export default Summary; +export default Summary2; diff --git a/src/components/Welcome/index.tsx b/src/components/Welcome/index.tsx index d880987..dacc53e 100644 --- a/src/components/Welcome/index.tsx +++ b/src/components/Welcome/index.tsx @@ -1,65 +1,18 @@ -import React, { useContext, useEffect, useState } from "react"; -import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; -import { networkContext } from "../../state"; -import { GRAPHQL_ENDPOINT, NETWORKS } from "../../utils/constants"; +import React from "react"; +import "../../styles/summary.scss"; +import Features from "./Features"; import Summary from "./Summary"; -const clientOracle = (graphqlEndpoint: string) => - new ApolloClient({ - uri: graphqlEndpoint, - cache: new InMemoryCache(), - }); - type props = { signerAddress: string; loadingContracts: boolean; }; -const WelcomeWrapper = ({ signerAddress, loadingContracts }: props) => { - const currentNetwork = useContext(networkContext); - const [apolloClient, setApolloClient] = useState( - clientOracle( - process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.goerli - ) - ); - - useEffect(() => { - switch (currentNetwork.chainId) { - case NETWORKS.mainnet.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); - break; - case NETWORKS.goerli.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.goerli)); - break; - case NETWORKS.arbitrum.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum)); - break; - case NETWORKS.arbitrum_goerli.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum_goerli)); - break; - case NETWORKS.optimism.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.optimism)); - break; - case NETWORKS.okovan.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.okovan)); - break; - case NETWORKS.polygon.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.polygon)); - break; - case NETWORKS.mumbai.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mumbai)); - break; - default: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); - break; - } - }, [currentNetwork.chainId]); - - return ( - - - - ); -}; +const WelcomeWrapper = ({ signerAddress, loadingContracts }: props) => ( +
+ + +
+); export default WelcomeWrapper; diff --git a/src/hooks/index.tsx b/src/hooks/index.tsx index 1ace187..c5e9c9b 100644 --- a/src/hooks/index.tsx +++ b/src/hooks/index.tsx @@ -10,6 +10,8 @@ export * from "./useNetworks"; export * from "./usePrices"; +export * from "./usePrices2"; + export * from "./useOracles"; export * from "./useRatios"; diff --git a/src/styles/app.scss b/src/styles/app.scss index 8e1771a..1d4455f 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -31,6 +31,7 @@ h6 { h6, p { margin-bottom: 0rem; + color: $off-white } body { diff --git a/src/styles/summary.scss b/src/styles/summary.scss index ca2159d..ddbab78 100644 --- a/src/styles/summary.scss +++ b/src/styles/summary.scss @@ -1,11 +1,15 @@ @import "./colors"; @import "./fonts"; -.summary { +.dashboard { display: flex; - flex-direction: column; + flex-direction: row; + flex-wrap: wrap; + margin-top: 2rem; padding: 3rem 2rem; padding-bottom: 2rem; + display: flex; + .spinner-container { padding-top: 3rem; width: 100%; @@ -25,9 +29,6 @@ font-size: 0.9rem; text-align: right; } - h6 { - color: $off-white; - } .btn { background-color: $darker; @@ -50,61 +51,9 @@ opacity: 0.8; } - #connect { - background-color: $pink; - width: 15rem; - height: 3rem; - border-radius: 0; - font-size: 1rem; - } - - .prices { - display: flex; - flex-direction: row; - padding: 1rem; - margin: 0rem 1rem; - border: 0.7px solid #a440f2; - border-radius: 5px; - background-color: #281e31; - .token-price { - display: flex; - flex-direction: row-reverse; - align-items: center; - margin-left: 0.5rem; - margin-right: 1.5rem; - } - .number { - margin-left: 0.5rem; - display: flex; - flex-direction: row; - align-items: center; - } - h4 { - margin-bottom: 0rem; - @media (max-width: 1499px) { - font-size: 0.8rem; - } - @media (max-width: 1400px) { - font-size: 0.75rem; - } - @media (max-width: 1320px) { - font-size: 0.7rem; - } - @media (max-width: 1279px) { - font-size: 0.65rem; - } - } - } - - .summary-protocol { - display: flex; - flex-direction: row; - flex-wrap: wrap; - margin-top: 2rem; - } - .card { padding: 1.5rem; + &-header { padding: 0.5rem 1rem; } @@ -116,9 +65,7 @@ font-family: "Nineteen Ninety Seven"; color: $purple; } - p { - margin-bottom: 1.5rem; - } + .row { margin-top: 0rem; } @@ -158,74 +105,73 @@ } .features { + &-title { + margin-bottom: 2rem; + } .btn-feature { display: flex; justify-content: space-between; align-items: center; + background-color: $darkest; margin-bottom: 1.5rem; padding: 0rem 2rem; width: 100%; height: 5rem; + border: 0.7px solid $highlight; } - } - - .balance-section { - display: flex; - flex-direction: row; - justify-content: space-between; - p { - margin-bottom: 0rem; - margin-left: 1rem; - } - .balance-box { + .feature-content { display: flex; - flex-direction: column; - justify-content: space-between; - h5 { - text-align: left; - margin-bottom: 0rem; - margin-left: 0.5rem; - } svg { - height: 2rem; + height: 25px; + margin-right: 1.5rem; + -webkit-filter: drop-shadow(3px 3px 2px $highlight); + filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); } - .title { - display: flex; - justify-content: flex-end; - padding-top: 0.7rem; - padding-bottom: 0.9rem; - } - .values { - display: flex; - flex-direction: column; - align-items: flex-end; - h5 { - font-size: 1.2rem; - } - } - .asset-value { - display: flex; - align-items: center; - flex-direction: row-reverse; + + .stake-icon { + height: 30px; } } } - .protocol { + .summary { height: 100%; + width: 100%; padding-left: 1rem; padding-right: 1rem; - .card-body { - display: flex; - } - svg { - width: 2rem; + + .dropdown { + margin-right: 1rem; + + .btn { + width: 100%; + background-color: $darkest; + } + .btn:after { + margin-top: 0.2rem; + margin-left: 0.6rem; + border-top: 0.5em solid; + border-right: 0.5em solid transparent; + border-left: 0.5em solid transparent; + } } - .weth { - height: 2.1rem; - width: 1rem; + .card-header { + display: flex; + } + } + + .protocol { + width: 100%; + .detail { + display: grid; + grid-template-columns: auto auto; + gap: 1rem; + row-gap: 1.7rem; + height: fit-content; + width: 100%; } + .totals { display: flex; flex-direction: row; @@ -237,14 +183,7 @@ border: 0.7px solid $highlight; border-radius: 5px; } - .detail { - display: grid; - grid-template-columns: auto auto; - gap: 1rem; - row-gap: 1.7rem; - height: fit-content; - width: 100%; - } + .asset { display: flex; flex-direction: row; @@ -256,129 +195,41 @@ background-color: #281e31; border: 0.7px solid $highlight; border-radius: 5px; + h5 { margin-bottom: 0.5rem; } } + .staked { display: flex; flex-direction: column-reverse; margin-left: 1rem; + h6 { margin-bottom: 0rem; text-align: right; - color: $light; + color: $lighter; } } - .card-footer { - padding-top: 2rem; - padding-bottom: 0rem; + svg { + width: 2rem; } - .use-tcap { - display: flex; - justify-content: space-evenly; - .btn.neon-blue { - box-shadow: 0px 0px 14px -6px $blue; - } + .weth { + height: 2.1rem; + width: 1rem; } + @media (min-width: 1149px) and (max-width: 1320px) { h6 { font-size: 0.9rem; } } - @media (min-width: 760px) and (max-width: 1150px) { - .detail { - grid-template-columns: auto; - } - } - } - - @media (max-width: 1000px) { - padding: 3rem 1.2rem; - - .card-wrapper { - .card { - margin-bottom: 1.2rem; - &.diamond { - p { - width: 85%; - } - } - } - } - } - @media (max-width: 769px) { - .prices { - flex-wrap: wrap; - padding: 0.5rem; - .token-price { - margin-bottom: 0.5rem; - } - h4 { - font-size: 0.68rem; - } - } - .protocol { - margin-top: 2rem; - } - } - @media (max-width: 600px) { - .prices { - .token-price.total { - flex-direction: column; - align-items: flex-start; - margin-bottom: 1rem; - .number{ - margin-left: 0rem; - margin-bottom: 0.2rem; - } - } - h4 { - font-size: 0.85rem; - } - } - } - @media (max-width: 550px) { - padding-left: 1rem; - padding-right: 1rem; - h2 { - font-size: 1.2rem; - } - .card-header { - padding: 0.5rem 0rem; - } - .card-body { - padding-left: 0rem; - padding-right: 0rem; - } - .prices { - .title { - display: none; - } - .token-price { - width: 100%; - margin-right: 0rem; - justify-content: space-between; - } - } - .balance-section { - flex-direction: column; - .balance-box { - margin-bottom: 1.2rem; - .title { - justify-content: flex-start; - } - .values { - align-items: flex-start; - } - } - } - .protocol { + @media (min-width: 760px) and (max-width: 1150px) { .detail { grid-template-columns: auto; - row-gap: 1rem; } } - } + } } diff --git a/src/styles/summary2.scss b/src/styles/summary2.scss index 1574b55..a695370 100644 --- a/src/styles/summary2.scss +++ b/src/styles/summary2.scss @@ -1,30 +1,36 @@ @import "./colors"; @import "./fonts"; -.summary { +.summary2 { display: flex; flex-direction: column; padding: 3rem 2rem; padding-bottom: 2rem; + .spinner-container { padding-top: 3rem; width: 100%; } + h2 { font-size: 1.375rem; margin-bottom: 0rem; } + h3 { font-size: 1.1rem; margin-bottom: 0rem; } + h4 { font-size: 0.9rem; } + h5 { font-size: 0.9rem; text-align: right; } + h6 { color: $off-white; } @@ -45,6 +51,7 @@ margin-left: 5px; } } + .btn:disabled { color: $light; opacity: 0.8; @@ -57,74 +64,86 @@ border-radius: 0; font-size: 1rem; } + .prices { display: flex; flex-direction: row; + justify-content: space-between; padding: 1rem; margin: 0rem 1rem; border: 0.7px solid #a440f2; border-radius: 5px; background-color: #281e31; + .token-price { display: flex; - flex-direction: row-reverse; - align-items: center; + flex-direction: column; margin-left: 0.5rem; margin-right: 1.5rem; } + .number { - margin-left: 0.5rem; display: flex; flex-direction: row; align-items: center; + margin-bottom: 0.5rem; } + h4 { margin-bottom: 0rem; + @media (max-width: 1499px) { font-size: 0.8rem; } + @media (max-width: 1400px) { font-size: 0.75rem; } + @media (max-width: 1320px) { font-size: 0.7rem; } + @media (max-width: 1279px) { font-size: 0.65rem; } } } - .summary2 { + + .summary-protocol { display: flex; flex-direction: row; flex-wrap: wrap; margin-top: 2rem; } - .card { + + .card { padding: 1.5rem; + &-header { padding: 0.5rem 1rem; } - + .cls-1 { fill: $darker; } + b { font-family: "Nineteen Ninety Seven"; color: $purple; } - p { - margin-bottom: 1.5rem; - } + .row { margin-top: 0rem; } &.diamond { padding-bottom: 0rem; + p { width: 80%; } + .btn { width: 11.0625rem; margin-bottom: 0.8rem; @@ -134,6 +153,7 @@ &.neon-green { box-shadow: 0px 0px 39px -6px rgba(63, 217, 180, 0.4); } + &.neon-blue { box-shadow: 0px 0px 39px -6px rgba(15, 217, 255, 0.4); } @@ -145,23 +165,59 @@ p { font-size: 1rem; } + div[class*="col-"] { padding: 0rem; } + .balance { margin-bottom: 1.5rem; padding-bottom: 0.8rem; } } + .features { + &-title { + margin-bottom: 2rem; + } + + .btn-feature { + display: flex; + justify-content: space-between; + align-items: center; + background-color: $darkest; + margin-bottom: 1.5rem; + padding: 0rem 2rem; + width: 100%; + height: 5rem; + border: 0.7px solid $highlight; + } + .feature-content { + display: flex; + + svg { + height: 25px; + margin-right: 1.5rem; + -webkit-filter: drop-shadow(3px 3px 2px $highlight); + filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); + } + + .stake-icon { + height: 30px; + } + } + } + .balance-section { display: flex; flex-direction: row; justify-content: space-between; + p { margin-bottom: 0rem; margin-left: 1rem; } + .balance-box { display: flex; flex-direction: column; @@ -172,23 +228,28 @@ margin-bottom: 0rem; margin-left: 0.5rem; } + svg { height: 2rem; } + .title { display: flex; justify-content: flex-end; padding-top: 0.7rem; padding-bottom: 0.9rem; } + .values { display: flex; flex-direction: column; align-items: flex-end; + h5 { font-size: 1.2rem; } } + .asset-value { display: flex; align-items: center; @@ -201,16 +262,20 @@ height: 100%; padding-left: 1rem; padding-right: 1rem; + .card-body { display: flex; } + svg { width: 2rem; } + .weth { - height: 2.1rem; + height: 2.1rem; width: 1rem; } + .totals { display: flex; flex-direction: row; @@ -222,6 +287,7 @@ border: 0.7px solid $highlight; border-radius: 5px; } + .detail { display: grid; grid-template-columns: auto auto; @@ -230,6 +296,7 @@ height: fit-content; width: 100%; } + .asset { display: flex; flex-direction: row; @@ -241,36 +308,43 @@ background-color: #281e31; border: 0.7px solid $highlight; border-radius: 5px; + h5 { margin-bottom: 0.5rem; } } + .staked { display: flex; flex-direction: column-reverse; margin-left: 1rem; + h6 { margin-bottom: 0rem; text-align: right; - color: $light; } } + .card-footer { padding-top: 2rem; padding-bottom: 0rem; } + .use-tcap { display: flex; justify-content: space-evenly; + .btn.neon-blue { box-shadow: 0px 0px 14px -6px $blue; } } + @media (min-width: 1149px) and (max-width: 1320px) { h6 { font-size: 0.9rem; } } + @media (min-width: 760px) and (max-width: 1150px) { .detail { grid-template-columns: auto; @@ -293,72 +367,90 @@ } } } + @media (max-width: 769px) { .prices { flex-wrap: wrap; padding: 0.5rem; + .token-price { margin-bottom: 0.5rem; } + h4 { font-size: 0.68rem; } } + .protocol { margin-top: 2rem; } } + @media (max-width: 600px) { .prices { .token-price.total { flex-direction: column; align-items: flex-start; margin-bottom: 1rem; - .number{ + + .number { margin-left: 0rem; margin-bottom: 0.2rem; } } + h4 { font-size: 0.85rem; } } } + @media (max-width: 550px) { padding-left: 1rem; padding-right: 1rem; + h2 { font-size: 1.2rem; } + .card-header { padding: 0.5rem 0rem; } + .card-body { padding-left: 0rem; padding-right: 0rem; } + .prices { .title { display: none; } + .token-price { width: 100%; margin-right: 0rem; justify-content: space-between; } } + .balance-section { flex-direction: column; + .balance-box { margin-bottom: 1.2rem; + .title { justify-content: flex-start; } + .values { align-items: flex-start; } } } + .protocol { .detail { grid-template-columns: auto; diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 3fe8a6b..ba29014 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -321,7 +321,7 @@ export const isGoerli = (chainId: number | undefined) => { return false; }; -export const getDefaultProvider = (chainId: number | undefined, name: string | undefined) => { +export const getDefaultProvider = (chainId: number | undefined) => { let provider; if (chainId === NETWORKS.okovan.chainId) { provider = ethers.getDefaultProvider(process.env.REACT_APP_ALCHEMY_URL_OKOVAN); @@ -347,7 +347,7 @@ export const getDefaultProvider = (chainId: number | undefined, name: string | u alchemyKey = process.env.REACT_APP_ALCHEMY_KEY; break; } - provider = ethers.getDefaultProvider(name, { + provider = ethers.getDefaultProvider(chainId, { infura: process.env.REACT_APP_INFURA_ID, alchemy: alchemyKey, }); From c49a317056bb5cda308dbbece6d9bc3e86a38a8e Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sat, 17 Dec 2022 17:16:30 -0600 Subject: [PATCH 196/278] added prices hook --- src/hooks/usePrices2.tsx | 123 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 src/hooks/usePrices2.tsx diff --git a/src/hooks/usePrices2.tsx b/src/hooks/usePrices2.tsx new file mode 100644 index 0000000..f3c68e1 --- /dev/null +++ b/src/hooks/usePrices2.tsx @@ -0,0 +1,123 @@ +import { useContext, useEffect, useState } from "react"; +import { ethers, BigNumber } from "ethers"; +import { Provider } from "ethers-multicall"; +import { oraclesContext } from "../state/index"; +import { isInLayer1, isOptimism, isPolygon, validOracles } from "../utils/utils"; +import { OraclePricesType } from "../components/Vaults/types"; + +export const usePrices2 = ( + chainId: number, + ethcallProvider: Provider | undefined +): OraclePricesType => { + const oracles = useContext(oraclesContext); + const [oraclePrices, setOraclePrices] = useState({ + tcapOraclePrice: "0", + wethOraclePrice: "0", + daiOraclePrice: "0", + aaveOraclePrice: "0", + linkOraclePrice: "0", + uniOraclePrice: "0", + snxOraclePrice: "0", + maticOraclePrice: "0", + wbtcOraclePrice: "0", + usdcOraclePrice: "0", + }); + + const loadPrices = async () => { + if (oracles && ethcallProvider && validOracles(chainId, oracles)) { + await ethcallProvider.init(); + const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); + + const ethcalls = [tcapPriceCall, daiOraclePriceCall]; + if (isInLayer1(chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + ethcalls.push(aaveOraclePriceCall); + ethcalls.push(linkOraclePriceCall); + ethcalls.push(usdcOraclePriceCall); + ethcalls.push(wbtcOraclePriceCall); + } + if (isOptimism(chainId)) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); + const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); + const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); + ethcalls.push(wethOraclePriceCall); + ethcalls.push(linkOraclePriceCall); + ethcalls.push(snxOraclePriceCall); + ethcalls.push(uniOraclePriceCall); + } + if (isPolygon(chainId)) { + const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + ethcalls.push(maticOraclePriceCall); + ethcalls.push(wbtcOraclePriceCall); + } + let tcapOraclePrice = BigNumber.from(0); + let wethOraclePrice = BigNumber.from(0); + let daiOraclePrice = BigNumber.from(0); + let aaveOraclePrice = BigNumber.from(0); + let linkOraclePrice = BigNumber.from(0); + let snxOraclePrice = BigNumber.from(0); + let uniOraclePrice = BigNumber.from(0); + let maticOraclePrice = BigNumber.from(0); + let wbtcOraclePrice = BigNumber.from(0); + let usdcOraclePrice = BigNumber.from(0); + + if (isInLayer1(chainId)) { + // @ts-ignore + [ + tcapOraclePrice, + daiOraclePrice, + wethOraclePrice, + aaveOraclePrice, + linkOraclePrice, + usdcOraclePrice, + wbtcOraclePrice, + ] = await ethcallProvider?.all(ethcalls); + } else if (isOptimism(chainId)) { + // @ts-ignore + [ + tcapOraclePrice, + daiOraclePrice, + wethOraclePrice, + linkOraclePrice, + snxOraclePrice, + uniOraclePrice, + ] = await ethcallProvider?.all(ethcalls); + } else if (isPolygon(chainId)) { + // @ts-ignore + [tcapOraclePrice, daiOraclePrice, maticOraclePrice, wbtcOraclePrice] = + await ethcallProvider?.all(ethcalls); + } + + setOraclePrices({ + tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), + wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), + daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), + aaveOraclePrice: ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)), + linkOraclePrice: ethers.utils.formatEther(linkOraclePrice.mul(10000000000)), + uniOraclePrice: ethers.utils.formatEther(uniOraclePrice.mul(10000000000)), + snxOraclePrice: ethers.utils.formatEther(snxOraclePrice.mul(10000000000)), + maticOraclePrice: ethers.utils.formatEther(maticOraclePrice.mul(10000000000)), + wbtcOraclePrice: ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)), + usdcOraclePrice: ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)), + }); + } + }; + + useEffect( + () => { + loadPrices(); + }, + // eslint-disable-next-line + [] + ); + + return oraclePrices; +}; From 496f4ec8738a907437e0b442f0e1477cac674c49 Mon Sep 17 00:00:00 2001 From: Crisgarner <@crisgarner> Date: Mon, 19 Dec 2022 13:15:00 -0600 Subject: [PATCH 197/278] updated sass --- package.json | 3 +- yarn.lock | 4471 +++++++++++++++++++++++--------------------------- 2 files changed, 2044 insertions(+), 2430 deletions(-) diff --git a/package.json b/package.json index be610f1..aa5570c 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,6 @@ "ethers-multicall": "^0.2.1", "fortmatic": "^2.2.1", "graphql": "^15.4.0", - "node-sass": "^4.14.1", "react": "^17.0.1", "react-bootstrap": "^1.4.0", "react-dom": "^17.0.1", @@ -34,7 +33,7 @@ "react-swipeable": "^6.1.0", "react-toastify": "^6.1.0", "resolve-url-loader": "^3.1.2", - "sass": "^1.27.0", + "sass": "^1.57.0", "sass-loader": "^10.0.4", "sourcemap-codec": "^1.4.8", "typescript": "4.0.5", diff --git a/yarn.lock b/yarn.lock index 1f72161..293cc84 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@apollo/client@^3.2.5": version "3.5.7" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.5.7.tgz#38051c0a414ebf784319fa5131faa19df24fa9ec" + resolved "https://registry.npmjs.org/@apollo/client/-/client-3.5.7.tgz" integrity sha512-HSLqTGp3sp/PVIWYLLr5v3fjQSr6Fxg6Z5RQj5Q9ALyseIVudD8GZk1jHplaUblTFMBueXGw3Z6DXObuVAr3tw== dependencies: "@graphql-typed-document-node/core" "^3.0.0" @@ -22,33 +22,33 @@ "@babel/code-frame@7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz" integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: "@babel/highlight" "^7.10.4" "@babel/code-frame@7.12.11": version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.5.5": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: "@babel/highlight" "^7.16.7" "@babel/compat-data@^7.12.1", "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz" integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== "@babel/core@7.12.3": version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz" integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== dependencies: "@babel/code-frame" "^7.10.4" @@ -70,7 +70,7 @@ "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.5", "@babel/core@^7.8.4", "@babel/core@^7.9.0": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.7.tgz#db990f931f6d40cb9b87a0dc7d2adc749f1dcbcf" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz" integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA== dependencies: "@babel/code-frame" "^7.16.7" @@ -91,7 +91,7 @@ "@babel/generator@^7.12.1", "@babel/generator@^7.16.7", "@babel/generator@^7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz" integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== dependencies: "@babel/types" "^7.16.8" @@ -100,14 +100,14 @@ "@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz" integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== dependencies: "@babel/types" "^7.16.7" "@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz" integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== dependencies: "@babel/helper-explode-assignable-expression" "^7.16.7" @@ -115,7 +115,7 @@ "@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz" integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== dependencies: "@babel/compat-data" "^7.16.4" @@ -125,7 +125,7 @@ "@babel/helper-create-class-features-plugin@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz#9c5b34b53a01f2097daf10678d65135c1b9f84ba" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz" integrity sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -138,7 +138,7 @@ "@babel/helper-create-regexp-features-plugin@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz" integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -146,7 +146,7 @@ "@babel/helper-define-polyfill-provider@^0.3.0": version "0.3.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz" integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== dependencies: "@babel/helper-compilation-targets" "^7.13.0" @@ -160,21 +160,21 @@ "@babel/helper-environment-visitor@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz" integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== dependencies: "@babel/types" "^7.16.7" "@babel/helper-explode-assignable-expression@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz" integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== dependencies: "@babel/types" "^7.16.7" "@babel/helper-function-name@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz" integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== dependencies: "@babel/helper-get-function-arity" "^7.16.7" @@ -183,35 +183,35 @@ "@babel/helper-get-function-arity@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz" integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== dependencies: "@babel/types" "^7.16.7" "@babel/helper-hoist-variables@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz" integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== dependencies: "@babel/types" "^7.16.7" "@babel/helper-member-expression-to-functions@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz" integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== dependencies: "@babel/types" "^7.16.7" "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz" integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== dependencies: "@babel/types" "^7.16.7" "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz" integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== dependencies: "@babel/helper-environment-visitor" "^7.16.7" @@ -225,19 +225,19 @@ "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz" integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== dependencies: "@babel/types" "^7.16.7" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz" integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== "@babel/helper-remap-async-to-generator@^7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz" integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -246,7 +246,7 @@ "@babel/helper-replace-supers@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz" integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== dependencies: "@babel/helper-environment-visitor" "^7.16.7" @@ -257,38 +257,38 @@ "@babel/helper-simple-access@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz" integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== dependencies: "@babel/types" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz" integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== dependencies: "@babel/types" "^7.16.0" "@babel/helper-split-export-declaration@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz" integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== dependencies: "@babel/types" "^7.16.7" "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== "@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== "@babel/helper-wrap-function@^7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz" integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== dependencies: "@babel/helper-function-name" "^7.16.7" @@ -298,7 +298,7 @@ "@babel/helpers@^7.12.1", "@babel/helpers@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz" integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== dependencies: "@babel/template" "^7.16.7" @@ -307,7 +307,7 @@ "@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz" integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== dependencies: "@babel/helper-validator-identifier" "^7.16.7" @@ -316,19 +316,19 @@ "@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8", "@babel/parser@^7.7.0": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.8.tgz#61c243a3875f7d0b0962b0543a33ece6ff2f1f17" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz" integrity sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz" integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz" integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -337,7 +337,7 @@ "@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz" integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -346,7 +346,7 @@ "@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz" integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.7" @@ -354,7 +354,7 @@ "@babel/plugin-proposal-class-static-block@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz" integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.7" @@ -363,7 +363,7 @@ "@babel/plugin-proposal-decorators@^7.16.4": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz#922907d2e3e327f5b07d2246bcfc0bd438f360d2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz" integrity sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.7" @@ -372,7 +372,7 @@ "@babel/plugin-proposal-dynamic-import@^7.12.1", "@babel/plugin-proposal-dynamic-import@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz" integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -380,7 +380,7 @@ "@babel/plugin-proposal-export-namespace-from@^7.12.1", "@babel/plugin-proposal-export-namespace-from@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz" integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -388,7 +388,7 @@ "@babel/plugin-proposal-json-strings@^7.12.1", "@babel/plugin-proposal-json-strings@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz" integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -396,7 +396,7 @@ "@babel/plugin-proposal-logical-assignment-operators@^7.12.1", "@babel/plugin-proposal-logical-assignment-operators@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz" integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -404,7 +404,7 @@ "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz" integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -412,7 +412,7 @@ "@babel/plugin-proposal-numeric-separator@^7.12.1", "@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz" integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -420,7 +420,7 @@ "@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz" integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== dependencies: "@babel/compat-data" "^7.16.4" @@ -431,7 +431,7 @@ "@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz" integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -439,7 +439,7 @@ "@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz" integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -448,7 +448,7 @@ "@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz#e418e3aa6f86edd6d327ce84eff188e479f571e0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz" integrity sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.7" @@ -456,7 +456,7 @@ "@babel/plugin-proposal-private-property-in-object@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz" integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -466,7 +466,7 @@ "@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz" integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" @@ -474,154 +474,154 @@ "@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.1", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-decorators@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz#f66a0199f16de7c1ef5192160ccf5d069739e3d3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz" integrity sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz#202b147e5892b8452bbb0bb269c7ed2539ab8832" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz" integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz" integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.12.1", "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz" integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz" integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz" integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== dependencies: "@babel/helper-module-imports" "^7.16.7" @@ -630,21 +630,21 @@ "@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz" integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz" integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz" integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -658,21 +658,21 @@ "@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz" integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz" integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz" integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" @@ -680,14 +680,14 @@ "@babel/plugin-transform-duplicate-keys@^7.12.1", "@babel/plugin-transform-duplicate-keys@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz" integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-exponentiation-operator@^7.12.1", "@babel/plugin-transform-exponentiation-operator@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz" integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" @@ -695,7 +695,7 @@ "@babel/plugin-transform-flow-strip-types@^7.16.0": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz" integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -703,14 +703,14 @@ "@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz" integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-function-name@^7.12.1", "@babel/plugin-transform-function-name@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz" integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== dependencies: "@babel/helper-compilation-targets" "^7.16.7" @@ -719,21 +719,21 @@ "@babel/plugin-transform-literals@^7.12.1", "@babel/plugin-transform-literals@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz" integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-member-expression-literals@^7.12.1", "@babel/plugin-transform-member-expression-literals@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz" integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz" integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== dependencies: "@babel/helper-module-transforms" "^7.16.7" @@ -742,7 +742,7 @@ "@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz" integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== dependencies: "@babel/helper-module-transforms" "^7.16.7" @@ -752,7 +752,7 @@ "@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz" integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== dependencies: "@babel/helper-hoist-variables" "^7.16.7" @@ -763,7 +763,7 @@ "@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz" integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== dependencies: "@babel/helper-module-transforms" "^7.16.7" @@ -771,21 +771,21 @@ "@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz" integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz" integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-object-super@^7.12.1", "@babel/plugin-transform-object-super@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz" integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -793,42 +793,42 @@ "@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz" integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz" integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-react-constant-elements@^7.9.0": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.7.tgz#19e9e4c2df2f6c3e6b3aea11778297d81db8df62" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.7.tgz" integrity sha512-lF+cfsyTgwWkcw715J88JhMYJ5GpysYNLhLP1PkvkhTRN7B3e74R/1KsDxFxhRpSn0UUD3IWM4GvdBR2PEbbQQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz" integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-react-jsx-development@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz" integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== dependencies: "@babel/plugin-transform-react-jsx" "^7.16.7" "@babel/plugin-transform-react-jsx@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz" integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -839,7 +839,7 @@ "@babel/plugin-transform-react-pure-annotations@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz" integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" @@ -847,21 +847,21 @@ "@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz" integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== dependencies: regenerator-transform "^0.14.2" "@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz" integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-runtime@^7.16.4", "@babel/plugin-transform-runtime@^7.5.5": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.8.tgz#3339368701103edae708f0fba9e4bfb70a3e5872" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.8.tgz" integrity sha512-6Kg2XHPFnIarNweZxmzbgYnnWsXxkx9WQUVk2sksBRL80lBC1RAQV3wQagWxdCHiYHqPN+oenwNIuttlYgIbQQ== dependencies: "@babel/helper-module-imports" "^7.16.7" @@ -873,14 +873,14 @@ "@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz" integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz" integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -888,28 +888,28 @@ "@babel/plugin-transform-sticky-regex@^7.12.1", "@babel/plugin-transform-sticky-regex@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz" integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz" integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-typeof-symbol@^7.12.1", "@babel/plugin-transform-typeof-symbol@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz" integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-typescript@^7.16.7": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz" integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.7" @@ -918,14 +918,14 @@ "@babel/plugin-transform-unicode-escapes@^7.12.1", "@babel/plugin-transform-unicode-escapes@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz" integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-unicode-regex@^7.12.1", "@babel/plugin-transform-unicode-regex@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz" integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" @@ -933,7 +933,7 @@ "@babel/preset-env@7.12.1": version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.1.tgz#9c7e5ca82a19efc865384bb4989148d2ee5d7ac2" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz" integrity sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg== dependencies: "@babel/compat-data" "^7.12.1" @@ -1005,7 +1005,7 @@ "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.8.4", "@babel/preset-env@^7.9.5": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.8.tgz#e682fa0bcd1cf49621d64a8956318ddfb9a05af9" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.8.tgz" integrity sha512-9rNKgVCdwHb3z1IlbMyft6yIXIeP3xz6vWvGaLHrJThuEIqWfHb0DNBH9VuTgnDfdbUDhkmkvMZS/YMCtP7Elg== dependencies: "@babel/compat-data" "^7.16.8" @@ -1085,7 +1085,7 @@ "@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.5": version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1096,7 +1096,7 @@ "@babel/preset-react@^7.16.0", "@babel/preset-react@^7.9.4": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz" integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -1108,7 +1108,7 @@ "@babel/preset-typescript@^7.16.0": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz" integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -1117,7 +1117,7 @@ "@babel/runtime-corejs3@^7.10.2": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz#ea533d96eda6fdc76b1812248e9fbd0c11d4a1a7" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz" integrity sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg== dependencies: core-js-pure "^3.20.2" @@ -1125,14 +1125,14 @@ "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.16.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz" integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== dependencies: regenerator-runtime "^0.13.4" "@babel/template@^7.10.4", "@babel/template@^7.16.7", "@babel/template@^7.3.3": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz" integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== dependencies: "@babel/code-frame" "^7.16.7" @@ -1141,7 +1141,7 @@ "@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.8.tgz#bab2f2b09a5fe8a8d9cad22cbfe3ba1d126fef9c" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz" integrity sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ== dependencies: "@babel/code-frame" "^7.16.7" @@ -1157,7 +1157,7 @@ "@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz" integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== dependencies: "@babel/helper-validator-identifier" "^7.16.7" @@ -1165,12 +1165,12 @@ "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@cnakazawa/watch@^1.0.3": version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + resolved "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz" integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== dependencies: exec-sh "^0.3.2" @@ -1178,17 +1178,17 @@ "@csstools/convert-colors@^1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + resolved "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz" integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== "@csstools/normalize.css@^10.1.0": version "10.1.0" - resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" + resolved "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz" integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== "@davatar/react@^1.8.1": version "1.8.1" - resolved "https://registry.yarnpkg.com/@davatar/react/-/react-1.8.1.tgz#2fe3e619422a46092c57025328be56b1e911550e" + resolved "https://registry.npmjs.org/@davatar/react/-/react-1.8.1.tgz" integrity sha512-vq9zNwAfnZCoY8W2eAbjWP1GPQutUfdxG+lKG2fAPqNFP2qrzDhIziKyCKtt7jwaXp79P1Cy1Gjzlvs1XkzwOQ== dependencies: "@ethersproject/contracts" "^5.4.1" @@ -1201,29 +1201,29 @@ "@emotion/is-prop-valid@^0.8.8": version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== dependencies: "@emotion/memoize" "0.7.4" "@emotion/memoize@0.7.4": version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== "@emotion/stylis@^0.8.4": version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + resolved "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz" integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== "@emotion/unitless@^0.7.4": version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== "@eslint/eslintrc@^0.2.0": version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz" integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== dependencies: ajv "^6.12.4" @@ -1239,7 +1239,7 @@ "@eslint/eslintrc@^0.4.3": version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" @@ -1254,7 +1254,7 @@ "@ethersproject/abi@5.0.0": version "5.0.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0.tgz#801c03e4a71c256e7d8720ca32f3d4888816b0bf" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0.tgz" integrity sha512-5zJr8eImzVrOD6zah/TSXOCf3HHn95TBV1PhRNaihgkIgXwDsr+F2fNyatRdoNzxjtZ8SXxkmS9mTDxKa8anYg== dependencies: "@ethersproject/address" "^5.0.0" @@ -1269,7 +1269,7 @@ "@ethersproject/abi@5.5.0", "@ethersproject/abi@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.5.0.tgz#fb52820e22e50b854ff15ce1647cc508d6660613" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.5.0.tgz" integrity sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w== dependencies: "@ethersproject/address" "^5.5.0" @@ -1284,7 +1284,7 @@ "@ethersproject/abstract-provider@5.5.1", "@ethersproject/abstract-provider@^5.5.0": version "5.5.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz" integrity sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg== dependencies: "@ethersproject/bignumber" "^5.5.0" @@ -1297,7 +1297,7 @@ "@ethersproject/abstract-signer@5.5.0", "@ethersproject/abstract-signer@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz" integrity sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA== dependencies: "@ethersproject/abstract-provider" "^5.5.0" @@ -1308,7 +1308,7 @@ "@ethersproject/address@5.5.0", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.5.0.tgz" integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== dependencies: "@ethersproject/bignumber" "^5.5.0" @@ -1319,14 +1319,14 @@ "@ethersproject/base64@5.5.0", "@ethersproject/base64@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.5.0.tgz#881e8544e47ed976930836986e5eb8fab259c090" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.5.0.tgz" integrity sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA== dependencies: "@ethersproject/bytes" "^5.5.0" "@ethersproject/basex@5.5.0", "@ethersproject/basex@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.5.0.tgz#e40a53ae6d6b09ab4d977bd037010d4bed21b4d3" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.5.0.tgz" integrity sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ== dependencies: "@ethersproject/bytes" "^5.5.0" @@ -1334,7 +1334,7 @@ "@ethersproject/bignumber@5.5.0", "@ethersproject/bignumber@^5.0.0", "@ethersproject/bignumber@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.5.0.tgz" integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== dependencies: "@ethersproject/bytes" "^5.5.0" @@ -1343,21 +1343,21 @@ "@ethersproject/bytes@5.5.0", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz" integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== dependencies: "@ethersproject/logger" "^5.5.0" "@ethersproject/constants@5.5.0", "@ethersproject/constants@^5.0.0", "@ethersproject/constants@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.5.0.tgz" integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== dependencies: "@ethersproject/bignumber" "^5.5.0" "@ethersproject/contracts@5.5.0", "@ethersproject/contracts@^5.4.1": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.5.0.tgz#b735260d4bd61283a670a82d5275e2a38892c197" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.5.0.tgz" integrity sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg== dependencies: "@ethersproject/abi" "^5.5.0" @@ -1373,7 +1373,7 @@ "@ethersproject/hash@5.5.0", "@ethersproject/hash@^5.0.0", "@ethersproject/hash@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.5.0.tgz" integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== dependencies: "@ethersproject/abstract-signer" "^5.5.0" @@ -1387,7 +1387,7 @@ "@ethersproject/hdnode@5.5.0", "@ethersproject/hdnode@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.5.0.tgz#4a04e28f41c546f7c978528ea1575206a200ddf6" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.5.0.tgz" integrity sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q== dependencies: "@ethersproject/abstract-signer" "^5.5.0" @@ -1405,7 +1405,7 @@ "@ethersproject/json-wallets@5.5.0", "@ethersproject/json-wallets@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz#dd522d4297e15bccc8e1427d247ec8376b60e325" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz" integrity sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ== dependencies: "@ethersproject/abstract-signer" "^5.5.0" @@ -1424,7 +1424,7 @@ "@ethersproject/keccak256@5.5.0", "@ethersproject/keccak256@^5.0.0", "@ethersproject/keccak256@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.5.0.tgz" integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== dependencies: "@ethersproject/bytes" "^5.5.0" @@ -1432,19 +1432,19 @@ "@ethersproject/logger@5.5.0", "@ethersproject/logger@^5.0.0", "@ethersproject/logger@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz" integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== "@ethersproject/networks@5.5.2", "@ethersproject/networks@^5.5.0": version "5.5.2" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.5.2.tgz#784c8b1283cd2a931114ab428dae1bd00c07630b" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.5.2.tgz" integrity sha512-NEqPxbGBfy6O3x4ZTISb90SjEDkWYDUbEeIFhJly0F7sZjoQMnj5KYzMSkMkLKZ+1fGpx00EDpHQCy6PrDupkQ== dependencies: "@ethersproject/logger" "^5.5.0" "@ethersproject/pbkdf2@5.5.0", "@ethersproject/pbkdf2@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz#e25032cdf02f31505d47afbf9c3e000d95c4a050" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz" integrity sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg== dependencies: "@ethersproject/bytes" "^5.5.0" @@ -1452,14 +1452,14 @@ "@ethersproject/properties@5.5.0", "@ethersproject/properties@^5.0.0", "@ethersproject/properties@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.5.0.tgz" integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== dependencies: "@ethersproject/logger" "^5.5.0" "@ethersproject/providers@5.5.2", "@ethersproject/providers@^5.4.5": version "5.5.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.5.2.tgz#131ccf52dc17afd0ab69ed444b8c0e3a27297d99" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.5.2.tgz" integrity sha512-hkbx7x/MKcRjyrO4StKXCzCpWer6s97xnm34xkfPiarhtEUVAN4TBBpamM+z66WcTt7H5B53YwbRj1n7i8pZoQ== dependencies: "@ethersproject/abstract-provider" "^5.5.0" @@ -1484,7 +1484,7 @@ "@ethersproject/random@5.5.1", "@ethersproject/random@^5.5.0": version "5.5.1" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.5.1.tgz#7cdf38ea93dc0b1ed1d8e480ccdaf3535c555415" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.5.1.tgz" integrity sha512-YaU2dQ7DuhL5Au7KbcQLHxcRHfgyNgvFV4sQOo0HrtW3Zkrc9ctWNz8wXQ4uCSfSDsqX2vcjhroxU5RQRV0nqA== dependencies: "@ethersproject/bytes" "^5.5.0" @@ -1492,7 +1492,7 @@ "@ethersproject/rlp@5.5.0", "@ethersproject/rlp@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.5.0.tgz#530f4f608f9ca9d4f89c24ab95db58ab56ab99a0" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.5.0.tgz" integrity sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA== dependencies: "@ethersproject/bytes" "^5.5.0" @@ -1500,7 +1500,7 @@ "@ethersproject/sha2@5.5.0", "@ethersproject/sha2@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz" integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== dependencies: "@ethersproject/bytes" "^5.5.0" @@ -1509,7 +1509,7 @@ "@ethersproject/signing-key@5.5.0", "@ethersproject/signing-key@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.5.0.tgz" integrity sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng== dependencies: "@ethersproject/bytes" "^5.5.0" @@ -1521,7 +1521,7 @@ "@ethersproject/solidity@5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.5.0.tgz#2662eb3e5da471b85a20531e420054278362f93f" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.5.0.tgz" integrity sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw== dependencies: "@ethersproject/bignumber" "^5.5.0" @@ -1533,7 +1533,7 @@ "@ethersproject/strings@5.5.0", "@ethersproject/strings@^5.0.0", "@ethersproject/strings@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.5.0.tgz" integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== dependencies: "@ethersproject/bytes" "^5.5.0" @@ -1542,7 +1542,7 @@ "@ethersproject/transactions@5.5.0", "@ethersproject/transactions@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.5.0.tgz" integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA== dependencies: "@ethersproject/address" "^5.5.0" @@ -1557,7 +1557,7 @@ "@ethersproject/units@5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.5.0.tgz#104d02db5b5dc42cc672cc4587bafb87a95ee45e" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.5.0.tgz" integrity sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag== dependencies: "@ethersproject/bignumber" "^5.5.0" @@ -1566,7 +1566,7 @@ "@ethersproject/wallet@5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.5.0.tgz" integrity sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q== dependencies: "@ethersproject/abstract-provider" "^5.5.0" @@ -1587,7 +1587,7 @@ "@ethersproject/web@5.5.1", "@ethersproject/web@^5.5.0": version "5.5.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.5.1.tgz#cfcc4a074a6936c657878ac58917a61341681316" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.5.1.tgz" integrity sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg== dependencies: "@ethersproject/base64" "^5.5.0" @@ -1598,7 +1598,7 @@ "@ethersproject/wordlists@5.5.0", "@ethersproject/wordlists@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.5.0.tgz#aac74963aa43e643638e5172353d931b347d584f" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.5.0.tgz" integrity sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q== dependencies: "@ethersproject/bytes" "^5.5.0" @@ -1609,32 +1609,32 @@ "@gar/promisify@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" + resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz" integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== "@graphql-typed-document-node/core@^3.0.0": version "3.1.1" - resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052" + resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz" integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== "@hapi/address@2.x.x": version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + resolved "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz" integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== "@hapi/bourne@1.x.x": version "1.3.2" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + resolved "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz" integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== "@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": version "8.5.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz" integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== "@hapi/joi@^15.1.0": version "15.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + resolved "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz" integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== dependencies: "@hapi/address" "2.x.x" @@ -1644,14 +1644,14 @@ "@hapi/topo@3.x.x": version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz" integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== dependencies: "@hapi/hoek" "^8.3.0" "@humanwhocodes/config-array@^0.5.0": version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: "@humanwhocodes/object-schema" "^1.2.0" @@ -1660,12 +1660,12 @@ "@humanwhocodes/object-schema@^1.2.0": version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -1676,12 +1676,12 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^26.6.2": version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" + resolved "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz" integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== dependencies: "@jest/types" "^26.6.2" @@ -1693,7 +1693,7 @@ "@jest/core@^26.6.0", "@jest/core@^26.6.3": version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" + resolved "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz" integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== dependencies: "@jest/console" "^26.6.2" @@ -1727,7 +1727,7 @@ "@jest/environment@^26.6.0", "@jest/environment@^26.6.2": version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz" integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== dependencies: "@jest/fake-timers" "^26.6.2" @@ -1737,7 +1737,7 @@ "@jest/fake-timers@^26.6.2": version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz" integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== dependencies: "@jest/types" "^26.6.2" @@ -1749,7 +1749,7 @@ "@jest/globals@^26.6.2": version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz" integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== dependencies: "@jest/environment" "^26.6.2" @@ -1758,7 +1758,7 @@ "@jest/reporters@^26.6.2": version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz" integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== dependencies: "@bcoe/v8-coverage" "^0.2.3" @@ -1790,7 +1790,7 @@ "@jest/source-map@^26.6.2": version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz" integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== dependencies: callsites "^3.0.0" @@ -1799,7 +1799,7 @@ "@jest/test-result@^26.6.0", "@jest/test-result@^26.6.2": version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz" integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== dependencies: "@jest/console" "^26.6.2" @@ -1809,7 +1809,7 @@ "@jest/test-sequencer@^26.6.3": version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz" integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== dependencies: "@jest/test-result" "^26.6.2" @@ -1820,7 +1820,7 @@ "@jest/transform@^26.6.2": version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz" integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== dependencies: "@babel/core" "^7.1.0" @@ -1841,7 +1841,7 @@ "@jest/types@^26.6.0", "@jest/types@^26.6.2": version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + resolved "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz" integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" @@ -1852,12 +1852,12 @@ "@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" + resolved "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz" integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== "@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" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -1865,12 +1865,12 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -1878,7 +1878,7 @@ "@npmcli/fs@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.0.tgz#bec1d1b89c170d40e1b73ad6c943b0b75e7d2951" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz" integrity sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA== dependencies: "@gar/promisify" "^1.0.1" @@ -1886,7 +1886,7 @@ "@npmcli/move-file@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz" integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== dependencies: mkdirp "^1.0.4" @@ -1894,7 +1894,7 @@ "@pmmmwh/react-refresh-webpack-plugin@0.4.2": version "0.4.2" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.2.tgz#1f9741e0bde9790a0e13272082ed7272a083620d" + resolved "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.2.tgz" integrity sha512-Loc4UDGutcZ+Bd56hBInkm6JyjyCwWy4t2wcDXzN8EDPANgVRj0VP8Nxn0Zq2pc+WKauZwEivQgbDGg4xZO20A== dependencies: ansi-html "^0.0.7" @@ -1906,12 +1906,12 @@ "@popperjs/core@^2.8.6": version "2.11.2" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.2.tgz#830beaec4b4091a9e9398ac50f865ddea52186b9" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz" integrity sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA== "@portis/web3-provider-engine@1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@portis/web3-provider-engine/-/web3-provider-engine-1.1.2.tgz#97f383156ea6b70fba69ae93a945fdd94159b1ba" + resolved "https://registry.npmjs.org/@portis/web3-provider-engine/-/web3-provider-engine-1.1.2.tgz" integrity sha512-NiiF0UPfngf4ulo32ybEDAMaad4i7h44HJaN8ea8HHt/vaFiUcPtINjC2o21jhWaLANerW4ZbOrNs1iCLH4p6A== dependencies: async "^2.5.0" @@ -1939,7 +1939,7 @@ "@portis/web3@^2.0.0-beta.59": version "2.0.0-beta.59" - resolved "https://registry.yarnpkg.com/@portis/web3/-/web3-2.0.0-beta.59.tgz#2e5292d8e1daf6070aa3b4a8cb33c1a9e0315011" + resolved "https://registry.npmjs.org/@portis/web3/-/web3-2.0.0-beta.59.tgz" integrity sha512-QdIdrI3uK+TyT+dxRK5bEYOi2PBlUDJ7vszR2uu0bT49wy7O52B9td6fL/5gsfk0VpCsmrYov3x3gEQYwGUyvQ== dependencies: "@portis/web3-provider-engine" "1.1.2" @@ -1949,24 +1949,24 @@ "@react-hook/media-query@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@react-hook/media-query/-/media-query-1.1.1.tgz#7fc4e52591784a39be924b62b4270ae3e18ec578" + resolved "https://registry.npmjs.org/@react-hook/media-query/-/media-query-1.1.1.tgz" integrity sha512-VM14wDOX5CW5Dn6b2lTiMd79BFMTut9AZj2+vIRT3LCKgMCYmdqruTtzDPSnIVDQdtxdPgtOzvU9oK20LopuOw== "@restart/context@^2.1.4": version "2.1.4" - resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02" + resolved "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz" integrity sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q== "@restart/hooks@^0.3.26": version "0.3.27" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.27.tgz#91f356d66d4699a8cd8b3d008402708b6a9dc505" + resolved "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.27.tgz" integrity sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw== dependencies: dequal "^2.0.2" "@rollup/plugin-node-resolve@^7.1.1": version "7.1.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" + resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz" integrity sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q== dependencies: "@rollup/pluginutils" "^3.0.8" @@ -1977,7 +1977,7 @@ "@rollup/plugin-replace@^2.3.1": version "2.4.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + resolved "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz" integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== dependencies: "@rollup/pluginutils" "^3.1.0" @@ -1985,7 +1985,7 @@ "@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== dependencies: "@types/estree" "0.0.39" @@ -1994,21 +1994,21 @@ "@sinonjs/commons@^1.7.0": version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz" integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== dependencies: "@sinonjs/commons" "^1.7.0" "@surma/rollup-plugin-off-main-thread@^1.1.1": version "1.4.2" - resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58" + resolved "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz" integrity sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A== dependencies: ejs "^2.6.1" @@ -2016,47 +2016,47 @@ "@svgr/babel-plugin-add-jsx-attribute@^5.4.0": version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz" integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== "@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz" integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== "@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz" integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== "@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz" integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== "@svgr/babel-plugin-svg-dynamic-title@^5.4.0": version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz" integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== "@svgr/babel-plugin-svg-em-dimensions@^5.4.0": version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz" integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== "@svgr/babel-plugin-transform-react-native-svg@^5.4.0": version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz" integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== "@svgr/babel-plugin-transform-svg-component@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz" integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== "@svgr/babel-preset@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz" integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== dependencies: "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" @@ -2070,7 +2070,7 @@ "@svgr/core@^5.4.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + resolved "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz" integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== dependencies: "@svgr/plugin-jsx" "^5.5.0" @@ -2079,14 +2079,14 @@ "@svgr/hast-util-to-babel-ast@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz" integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== dependencies: "@babel/types" "^7.12.6" "@svgr/plugin-jsx@^5.4.0", "@svgr/plugin-jsx@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz" integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== dependencies: "@babel/core" "^7.12.3" @@ -2096,7 +2096,7 @@ "@svgr/plugin-svgo@^5.4.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz" integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== dependencies: cosmiconfig "^7.0.0" @@ -2105,7 +2105,7 @@ "@svgr/webpack@5.4.0": version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.4.0.tgz#b68bc86e29cf007292b96ced65f80971175632e0" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.4.0.tgz" integrity sha512-LjepnS/BSAvelnOnnzr6Gg0GcpLmnZ9ThGFK5WJtm1xOqdBE/1IACZU7MMdVzjyUkfFqGz87eRE4hFaSLiUwYg== dependencies: "@babel/core" "^7.9.0" @@ -2119,7 +2119,7 @@ "@testing-library/dom@^7.28.1": version "7.31.2" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.31.2.tgz#df361db38f5212b88555068ab8119f5d841a8c4a" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz" integrity sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ== dependencies: "@babel/code-frame" "^7.10.4" @@ -2133,7 +2133,7 @@ "@testing-library/jest-dom@^5.11.4": version "5.16.1" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.1.tgz#3db7df5ae97596264a7da9696fe14695ba02e51f" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.1.tgz" integrity sha512-ajUJdfDIuTCadB79ukO+0l8O+QwN0LiSxDaYUTI4LndbbUsGi6rWU1SCexXzBA2NSjlVB9/vbkasQIL3tmPBjw== dependencies: "@babel/runtime" "^7.9.2" @@ -2148,7 +2148,7 @@ "@testing-library/react@^11.1.0": version "11.2.7" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.7.tgz#b29e2e95c6765c815786c0bc1d5aed9cb2bf7818" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz" integrity sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA== dependencies: "@babel/runtime" "^7.12.5" @@ -2156,24 +2156,24 @@ "@testing-library/user-event@^12.1.10": version "12.8.3" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-12.8.3.tgz#1aa3ed4b9f79340a1e1836bc7f57c501e838704a" + resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz" integrity sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ== dependencies: "@babel/runtime" "^7.12.5" "@tootallnate/once@1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/aria-query@^4.2.0": version "4.2.2" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz" integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": version "7.1.18" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz" integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== dependencies: "@babel/parser" "^7.1.0" @@ -2184,14 +2184,14 @@ "@types/babel__generator@*": version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" @@ -2199,21 +2199,21 @@ "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz" integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== dependencies: "@babel/types" "^7.3.0" "@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" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" "@types/eslint@^7.28.2": version "7.29.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz" integrity sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng== dependencies: "@types/estree" "*" @@ -2221,17 +2221,17 @@ "@types/estree@*": version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz" integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== "@types/estree@0.0.39": version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/glob@^7.1.1": version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" @@ -2239,48 +2239,48 @@ "@types/graceful-fs@^4.1.2": version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== dependencies: "@types/node" "*" "@types/history@*": version "4.7.10" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.10.tgz#992865313bb97d80eefa6aab5f2e4f1e10e84e86" + resolved "https://registry.npmjs.org/@types/history/-/history-4.7.10.tgz" integrity sha512-kq1vceWANyZLEt/+hbTWSAjLNhhXYgUw6Ywi0KQ9C7pZJP4Qrr0xjSKb3t59e5GwWtk1L6zt5KTxjH4oPk2l/w== "@types/html-minifier-terser@^5.0.0": version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz" integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== "@types/invariant@^2.2.33": version "2.2.35" - resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be" + resolved "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.35.tgz" integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@*": version "27.4.0" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.0.tgz#037ab8b872067cae842a320841693080f9cb84ed" + resolved "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz" integrity sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ== dependencies: jest-diff "^27.0.0" @@ -2288,7 +2288,7 @@ "@types/jest@^26.0.15": version "26.0.24" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" + resolved "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz" integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== dependencies: jest-diff "^26.0.0" @@ -2296,78 +2296,78 @@ "@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= "@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": version "17.0.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz" integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== "@types/node@^14.14.2": version "14.18.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.5.tgz#0dd636fe7b2c6055cbed0d4ca3b7fb540f130a96" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.5.tgz" integrity sha512-LMy+vDDcQR48EZdEx5wRX1q/sEl6NdGuHXPnfeL8ixkwCOSZ2qnIyIZmcCbdX0MeRqHhAcHmX+haCbrS8Run+A== "@types/normalize-package-data@^2.4.0": version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/parse-json@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/pbkdf2@^3.0.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz" integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== dependencies: "@types/node" "*" "@types/prettier@^2.0.0": version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.2.tgz#4c62fae93eb479660c3bd93f9d24d561597a8281" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz" integrity sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA== "@types/prop-types@*", "@types/prop-types@^15.7.3": version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz" integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== "@types/q@^1.5.1": version "1.5.5" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + resolved "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz" integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== "@types/react-blockies@^1.4.1": version "1.4.1" - resolved "https://registry.yarnpkg.com/@types/react-blockies/-/react-blockies-1.4.1.tgz#d5f6fff8ece3e90f2e7708f8f3156c87333312df" + resolved "https://registry.npmjs.org/@types/react-blockies/-/react-blockies-1.4.1.tgz" integrity sha512-aDX0g0hwzdodkGLSDNUQr6gXxwclGjnhS8jhsR8uQhAfe/7i3GZD/NDcSlQ2SiQiLhfRxX3NlY+nvBwf5Y0tTg== dependencies: "@types/react" "*" "@types/react-dom@^16.9.8": version "16.9.14" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.14.tgz#674b8f116645fe5266b40b525777fc6bb8eb3bcd" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.14.tgz" integrity sha512-FIX2AVmPTGP30OUJ+0vadeIFJJ07Mh1m+U0rxfgyW34p3rTlXI+nlenvAxNn4BP36YyI9IJ/+UJ7Wu22N1pI7A== dependencies: "@types/react" "^16" "@types/react-router-dom@^5.1.6": version "5.3.2" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.2.tgz#ebd8e145cf056db5c66eb1dac63c72f52e8542ee" + resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.2.tgz" integrity sha512-ELEYRUie2czuJzaZ5+ziIp9Hhw+juEw8b7C11YNA4QdLCVbQ3qLi2l4aq8XnlqM7V31LZX8dxUuFUCrzHm6sqQ== dependencies: "@types/history" "*" @@ -2376,7 +2376,7 @@ "@types/react-router@*": version "5.1.17" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.17.tgz#087091006213b11042f39570e5cd414863693968" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.17.tgz" integrity sha512-RNSXOyb3VyRs/EOGmjBhhGKTbnN6fHWvy5FNLzWfOWOGjgVUKqJZXfpKzLmgoU8h6Hj8mpALj/mbXQASOb92wQ== dependencies: "@types/history" "*" @@ -2384,14 +2384,14 @@ "@types/react-transition-group@^4.4.1": version "4.4.4" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz" integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== dependencies: "@types/react" "*" "@types/react@*", "@types/react@>=16.14.8", "@types/react@>=16.9.11": version "17.0.38" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz" integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ== dependencies: "@types/prop-types" "*" @@ -2400,7 +2400,7 @@ "@types/react@^16", "@types/react@^16.9.53": version "16.14.21" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.21.tgz#35199b21a278355ec7a3c40003bd6a334bd4ae4a" + resolved "https://registry.npmjs.org/@types/react/-/react-16.14.21.tgz" integrity sha512-rY4DzPKK/4aohyWiDRHS2fotN5rhBSK6/rz1X37KzNna9HJyqtaGAbq9fVttrEPWF5ywpfIP1ITL8Xi2QZn6Eg== dependencies: "@types/prop-types" "*" @@ -2409,60 +2409,60 @@ "@types/resolve@0.0.8": version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz" integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== dependencies: "@types/node" "*" "@types/scheduler@*": version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/secp256k1@^4.0.1": version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== dependencies: "@types/node" "*" "@types/source-list-map@*": version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + resolved "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz" integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== "@types/stack-utils@^2.0.0": version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/tapable@^1", "@types/tapable@^1.0.5": version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + resolved "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz" integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== "@types/testing-library__jest-dom@^5.9.1": version "5.14.2" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.2.tgz#564fb2b2dc827147e937a75b639a05d17ce18b44" + resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.2.tgz" integrity sha512-vehbtyHUShPxIa9SioxDwCvgxukDMH//icJG90sXQBUm5lJOHLT5kNeU9tnivhnA/TkOFMzGIXN2cTc4hY8/kg== dependencies: "@types/jest" "*" "@types/uglify-js@*": version "3.13.1" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" + resolved "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz" integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== dependencies: source-map "^0.6.1" "@types/warning@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" + resolved "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz" integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI= "@types/webpack-sources@*": version "3.2.0" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" + resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz" integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== dependencies: "@types/node" "*" @@ -2471,7 +2471,7 @@ "@types/webpack@^4.41.8": version "4.41.32" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212" + resolved "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz" integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg== dependencies: "@types/node" "*" @@ -2483,19 +2483,19 @@ "@types/yargs-parser@*": version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz" integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== "@types/yargs@^15.0.0": version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz" integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^4.5.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz" integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== dependencies: "@typescript-eslint/experimental-utils" "4.33.0" @@ -2509,7 +2509,7 @@ "@typescript-eslint/experimental-utils@4.33.0", "@typescript-eslint/experimental-utils@^4.0.1": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz" integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== dependencies: "@types/json-schema" "^7.0.7" @@ -2521,7 +2521,7 @@ "@typescript-eslint/experimental-utils@^3.10.1": version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz" integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== dependencies: "@types/json-schema" "^7.0.3" @@ -2532,7 +2532,7 @@ "@typescript-eslint/parser@^4.5.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz" integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== dependencies: "@typescript-eslint/scope-manager" "4.33.0" @@ -2542,7 +2542,7 @@ "@typescript-eslint/scope-manager@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz" integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== dependencies: "@typescript-eslint/types" "4.33.0" @@ -2550,17 +2550,17 @@ "@typescript-eslint/types@3.10.1": version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz" integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== "@typescript-eslint/types@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz" integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== "@typescript-eslint/typescript-estree@3.10.1": version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz" integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== dependencies: "@typescript-eslint/types" "3.10.1" @@ -2574,7 +2574,7 @@ "@typescript-eslint/typescript-estree@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz" integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== dependencies: "@typescript-eslint/types" "4.33.0" @@ -2587,14 +2587,14 @@ "@typescript-eslint/visitor-keys@3.10.1": version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz" integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== dependencies: eslint-visitor-keys "^1.1.0" "@typescript-eslint/visitor-keys@4.33.0": version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz" integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== dependencies: "@typescript-eslint/types" "4.33.0" @@ -2602,7 +2602,7 @@ "@walletconnect/browser-utils@^1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.7.1.tgz#2a28846cd4d73166debbbf7d470e78ba25616f5e" + resolved "https://registry.npmjs.org/@walletconnect/browser-utils/-/browser-utils-1.7.1.tgz" integrity sha512-y6KvxPhi52sWzS0/HtA3EhdgmtG8mXcxdc26YURDOVC/BJh3MxV8E16JFrT4InylOqYJs6dcSLWVfcnJaiPtZw== dependencies: "@walletconnect/safe-json" "1.0.0" @@ -2613,7 +2613,7 @@ "@walletconnect/client@^1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.7.1.tgz#aaa74199bdc0605db9ac2ecdf8a463b271586d3b" + resolved "https://registry.npmjs.org/@walletconnect/client/-/client-1.7.1.tgz" integrity sha512-xD8B8s1hL7Z5vJwb3L0u1bCVAk6cRQfIY9ycymf7KkmIhkAONQJNf2Y0C0xIpbPp2fdn9VwnSfLm5Ed/Ht/1IA== dependencies: "@walletconnect/core" "^1.7.1" @@ -2623,7 +2623,7 @@ "@walletconnect/core@^1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.7.1.tgz#321c14d63af81241658b028022e0e5fa6dc7f374" + resolved "https://registry.npmjs.org/@walletconnect/core/-/core-1.7.1.tgz" integrity sha512-qO+4wykyRNiq3HEuaAA2pW2PDnMM4y7pyPAgiCwfHiqF4PpWvtcdB301hI0K5am9ghuqKZMy1HlE9LWNOEBvcw== dependencies: "@walletconnect/socket-transport" "^1.7.1" @@ -2632,7 +2632,7 @@ "@walletconnect/crypto@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.1.tgz#d4c1b1cd5dd1be88fe9a82dfc54cadbbb3f9d325" + resolved "https://registry.npmjs.org/@walletconnect/crypto/-/crypto-1.0.1.tgz" integrity sha512-IgUReNrycIFxkGgq8YT9HsosCkhutakWD9Q411PR0aJfxpEa/VKJeaLRtoz6DvJpztWStwhIHnAbBoOVR72a6g== dependencies: "@walletconnect/encoding" "^1.0.0" @@ -2643,7 +2643,7 @@ "@walletconnect/encoding@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.0.tgz#e24190cb5e803526f9dfd7191fb0e4dc53c6d864" + resolved "https://registry.npmjs.org/@walletconnect/encoding/-/encoding-1.0.0.tgz" integrity sha512-4nkJFnS0QF5JdieG/3VPD1/iEWkLSZ14EBInLZ00RWxmC6EMZrzAeHNAWIgm+xP3NK0lqz+7lEsmWGtcl5gYnQ== dependencies: is-typedarray "1.0.0" @@ -2651,12 +2651,12 @@ "@walletconnect/environment@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034" + resolved "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.0.tgz" integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ== "@walletconnect/http-connection@^1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.7.1.tgz#fddddccd70a5c659c6e6ac25ba5305290c158705" + resolved "https://registry.npmjs.org/@walletconnect/http-connection/-/http-connection-1.7.1.tgz" integrity sha512-cz3pw2MsTyBT5hy8qhs67NFHTIFOzltdMx9Hy1ftkjXQYtenxIBzAQpZzF6l/lXC3GmMziueYnknZILo1+wgfg== dependencies: "@walletconnect/types" "^1.7.1" @@ -2666,7 +2666,7 @@ "@walletconnect/iso-crypto@^1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.7.1.tgz#c463bb5874686c2f21344e2c7f3cf4d71c34ca70" + resolved "https://registry.npmjs.org/@walletconnect/iso-crypto/-/iso-crypto-1.7.1.tgz" integrity sha512-qMiW0kLN6KCjnLMD50ijIj1lQqjNjGszGUwrSVUiS2/Dp4Ecx+4QEtHbmVwGEkfx4kelYPFpDJV3ZJpQ4Kqg/g== dependencies: "@walletconnect/crypto" "^1.0.1" @@ -2675,14 +2675,14 @@ "@walletconnect/jsonrpc-types@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.0.tgz#fa75ad5e8f106a2e33287b1e6833e22ed0225055" + resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.0.tgz" integrity sha512-11QXNq5H1PKZk7bP8SxgmCw3HRaDuPOVE+wObqEvmhc7OWYUZqfuaaMb+OXGRSOHL3sbC+XHfdeCxFTMXSFyng== dependencies: keyvaluestorage-interface "^1.0.0" "@walletconnect/jsonrpc-utils@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.0.tgz#1a2f668d606e8f0b6e7d8fdebae86001bd037a3f" + resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.0.tgz" integrity sha512-qUHbKUK6sHeHn67qtHZoLoYk5hS6x1arTPjKDRkY93/6Fx+ZmNIpdm1owX3l6aYueyegJ7mz43FpvYHUqJ8xcw== dependencies: "@walletconnect/environment" "^1.0.0" @@ -2690,12 +2690,12 @@ "@walletconnect/mobile-registry@^1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz#502cf8ab87330841d794819081e748ebdef7aee5" + resolved "https://registry.npmjs.org/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz" integrity sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw== "@walletconnect/qrcode-modal@^1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.7.1.tgz#89b19c2eb6466ec237ccd597388d7a1b1b946067" + resolved "https://registry.npmjs.org/@walletconnect/qrcode-modal/-/qrcode-modal-1.7.1.tgz" integrity sha512-m/4lSx3pgj8V2eHVJcGnxBKUSCNFtyVIcg5tqbSJHi9HjKIBxvRq4D5M4X4yEpgXYtRmTucihxNCrj2zQrmlSQ== dependencies: "@walletconnect/browser-utils" "^1.7.1" @@ -2707,7 +2707,7 @@ "@walletconnect/randombytes@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.1.tgz#87f0f02d9206704ce1c9e23f07d3b28898c48385" + resolved "https://registry.npmjs.org/@walletconnect/randombytes/-/randombytes-1.0.1.tgz" integrity sha512-YJTyq69i0PtxVg7osEpKfvjTaWuAsR49QEcqGKZRKVQWMbGXBZ65fovemK/SRgtiFRv0V8PwsrlKSheqzfPNcg== dependencies: "@walletconnect/encoding" "^1.0.0" @@ -2716,12 +2716,12 @@ "@walletconnect/safe-json@1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2" + resolved "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.0.tgz" integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg== "@walletconnect/socket-transport@^1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.7.1.tgz#cc4c8dcf21c40b805812ecb066b2abb156fdb146" + resolved "https://registry.npmjs.org/@walletconnect/socket-transport/-/socket-transport-1.7.1.tgz" integrity sha512-Gu1RPro0eLe+HHtLhq/1T5TNFfO/HW2z3BnWuUYuJ/F8w1U9iK7+4LMHe+LTgwgWy9Ybcb2k0tiO5e3LgjHBHQ== dependencies: "@walletconnect/types" "^1.7.1" @@ -2730,12 +2730,12 @@ "@walletconnect/types@^1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.7.1.tgz#86cc3832e02415dc9f518f3dcb5366722afbfc03" + resolved "https://registry.npmjs.org/@walletconnect/types/-/types-1.7.1.tgz" integrity sha512-X0NunEUgq46ExDcKo7BnnFpFhuZ89bZ04/1FtohNziBWcP2Mblp2yf+FN7iwmZiuZ3bRTb8J1O4oJH2JGP9I7A== "@walletconnect/utils@^1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.7.1.tgz#f858d5f22425a4c2da2a28ae493bde7f2eecf815" + resolved "https://registry.npmjs.org/@walletconnect/utils/-/utils-1.7.1.tgz" integrity sha512-7Lig9rruqTMaFuwEhBrArq1QgzIf2NuzO6J3sCUYCZh60EQ7uIZjekaDonQjiQJAbfYcgWUBm8qa0PG1TzYN3Q== dependencies: "@walletconnect/browser-utils" "^1.7.1" @@ -2748,7 +2748,7 @@ "@walletconnect/web3-provider@^1.3.6": version "1.7.1" - resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.7.1.tgz#3b7bf41bfd0198b18f5cc5626e1ec28e931667c7" + resolved "https://registry.npmjs.org/@walletconnect/web3-provider/-/web3-provider-1.7.1.tgz" integrity sha512-dhoYwQaBVbaKIiELNeCF4kW7Dslbf73wDIsxOF9gmjVch1Qi18kNlqbR03u56iBcAsXU0tAwfd9Z7cGHfUX1Fg== dependencies: "@walletconnect/client" "^1.7.1" @@ -2760,19 +2760,19 @@ "@walletconnect/window-getters@1.0.0", "@walletconnect/window-getters@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" + resolved "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.0.tgz" integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== "@walletconnect/window-metadata@1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" + resolved "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz" integrity sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA== dependencies: "@walletconnect/window-getters" "^1.0.0" "@webassemblyjs/ast@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz" integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== dependencies: "@webassemblyjs/helper-module-context" "1.9.0" @@ -2781,46 +2781,46 @@ "@webassemblyjs/floating-point-hex-parser@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz" integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== "@webassemblyjs/helper-api-error@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz" integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== "@webassemblyjs/helper-buffer@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz" integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== "@webassemblyjs/helper-code-frame@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz" integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== dependencies: "@webassemblyjs/wast-printer" "1.9.0" "@webassemblyjs/helper-fsm@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz" integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== "@webassemblyjs/helper-module-context@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz" integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== dependencies: "@webassemblyjs/ast" "1.9.0" "@webassemblyjs/helper-wasm-bytecode@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz" integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== "@webassemblyjs/helper-wasm-section@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz" integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== dependencies: "@webassemblyjs/ast" "1.9.0" @@ -2830,26 +2830,26 @@ "@webassemblyjs/ieee754@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz" integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz" integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz" integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== "@webassemblyjs/wasm-edit@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz" integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== dependencies: "@webassemblyjs/ast" "1.9.0" @@ -2863,7 +2863,7 @@ "@webassemblyjs/wasm-gen@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz" integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== dependencies: "@webassemblyjs/ast" "1.9.0" @@ -2874,7 +2874,7 @@ "@webassemblyjs/wasm-opt@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz" integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== dependencies: "@webassemblyjs/ast" "1.9.0" @@ -2884,7 +2884,7 @@ "@webassemblyjs/wasm-parser@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz" integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== dependencies: "@webassemblyjs/ast" "1.9.0" @@ -2896,7 +2896,7 @@ "@webassemblyjs/wast-parser@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz" integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== dependencies: "@webassemblyjs/ast" "1.9.0" @@ -2908,7 +2908,7 @@ "@webassemblyjs/wast-printer@1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz" integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== dependencies: "@webassemblyjs/ast" "1.9.0" @@ -2917,62 +2917,57 @@ "@wry/context@^0.6.0": version "0.6.1" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.1.tgz#c3c29c0ad622adb00f6a53303c4f965ee06ebeb2" + resolved "https://registry.npmjs.org/@wry/context/-/context-0.6.1.tgz" integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== dependencies: tslib "^2.3.0" "@wry/equality@^0.5.0": version "0.5.2" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.2.tgz#72c8a7a7d884dff30b612f4f8464eba26c080e73" + resolved "https://registry.npmjs.org/@wry/equality/-/equality-0.5.2.tgz" integrity sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA== dependencies: tslib "^2.3.0" "@wry/trie@^0.3.0": version "0.3.1" - resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.1.tgz#2279b790f15032f8bcea7fc944d27988e5b3b139" + resolved "https://registry.npmjs.org/@wry/trie/-/trie-0.3.1.tgz" integrity sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw== dependencies: tslib "^2.3.0" "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.3, abab@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz" integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - abstract-leveldown@~2.6.0: version "2.6.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz" integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== dependencies: xtend "~4.0.0" abstract-leveldown@~2.7.1: version "2.7.2" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz" integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== dependencies: xtend "~4.0.0" accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== dependencies: mime-types "~2.1.24" @@ -2980,7 +2975,7 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: acorn-globals@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: acorn "^7.1.1" @@ -2988,37 +2983,37 @@ acorn-globals@^6.0.0: acorn-jsx@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^7.1.1: version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn@^6.4.1: version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4: version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== address@1.1.2, address@^1.0.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + resolved "https://registry.npmjs.org/address/-/address-1.1.2.tgz" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== adjust-sourcemap-loader@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" + resolved "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz" integrity sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw== dependencies: loader-utils "^2.0.0" @@ -3026,24 +3021,24 @@ adjust-sourcemap-loader@3.0.0: aes-js@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= aes-js@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz" integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -3051,17 +3046,17 @@ aggregate-error@^3.0.0: ajv-errors@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -3071,7 +3066,7 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: ajv@^8.0.1: version "8.8.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz" integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== dependencies: fast-deep-equal "^3.1.1" @@ -3081,78 +3076,73 @@ ajv@^8.0.1: alphanum-sort@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + resolved "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - ansi-colors@^3.0.0: version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== ansi-colors@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-html@0.0.7, ansi-html@^0.0.7: version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + resolved "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz" integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= ansi-regex@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== anymatch@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz" integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" @@ -3160,40 +3150,32 @@ anymatch@^2.0.0: anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3, aproba@^1.1.1: +aproba@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -are-we-there-yet@~1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" - integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" aria-query@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== dependencies: "@babel/runtime" "^7.10.2" @@ -3201,52 +3183,52 @@ aria-query@^4.2.2: aria-query@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz" integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== arity-n@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + resolved "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz" integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= arr-diff@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-differ@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + resolved "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== array-find-index@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-flatten@^2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== array-includes@^3.1.3, array-includes@^3.1.4: version "3.1.4" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz" integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== dependencies: call-bind "^1.0.2" @@ -3257,29 +3239,29 @@ array-includes@^3.1.3, array-includes@^3.1.4: array-union@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array-uniq@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array-unique@^0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= array.prototype.flat@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz" integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== dependencies: call-bind "^1.0.2" @@ -3288,7 +3270,7 @@ array.prototype.flat@^1.2.5: array.prototype.flatmap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz" integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== dependencies: call-bind "^1.0.0" @@ -3297,22 +3279,22 @@ array.prototype.flatmap@^1.2.5: arrify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= arrify@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + resolved "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== asap@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1.js@^5.2.0: version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" @@ -3322,19 +3304,19 @@ asn1.js@^5.2.0: asn1@~0.2.3: version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert@^1.1.1: version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + resolved "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: object-assign "^4.1.1" @@ -3342,88 +3324,83 @@ assert@^1.1.1: assign-symbols@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 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" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= astral-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-each@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== async-eventemitter@^0.2.2: version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + resolved "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== dependencies: async "^2.4.0" -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= - async-limiter@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== async-mutex@^0.2.6: version "0.2.6" - resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" + resolved "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz" integrity sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw== dependencies: tslib "^2.0.0" async@3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" + resolved "https://registry.npmjs.org/async/-/async-3.2.0.tgz" integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== async@^1.4.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.2: version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + resolved "https://registry.npmjs.org/async/-/async-2.6.3.tgz" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== dependencies: lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== atob@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== authereum@^0.1.0: version "0.1.14" - resolved "https://registry.yarnpkg.com/authereum/-/authereum-0.1.14.tgz#5655e543b296d899136e350d09f9cfe4c12fbc38" + resolved "https://registry.npmjs.org/authereum/-/authereum-0.1.14.tgz" integrity sha512-o1lsXXGg+oYDAEutZ8Ak1Qn2Dnk+qSyQ2ZokyLHRSYGJj6HpEHaSlQA6W3VTHD5r68Q+W0JD/BN9hDSF2xyshQ== dependencies: async "3.2.0" @@ -3443,7 +3420,7 @@ authereum@^0.1.0: autoprefixer@^9.6.1: version "9.8.8" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz" integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== dependencies: browserslist "^4.12.0" @@ -3456,22 +3433,22 @@ autoprefixer@^9.6.1: aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axe-core@^4.3.5: version "4.3.5" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.5.tgz#78d6911ba317a8262bfee292aeafcc1e04b49cc5" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz" integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA== axios@^0.18.0: version "0.18.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" + resolved "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz" integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== dependencies: follow-redirects "1.5.10" @@ -3479,12 +3456,12 @@ axios@^0.18.0: axobject-query@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== babel-code-frame@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + resolved "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" @@ -3493,7 +3470,7 @@ babel-code-frame@^6.26.0: babel-core@^6.0.14, babel-core@^6.26.0: version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + resolved "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz" integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: babel-code-frame "^6.26.0" @@ -3518,7 +3495,7 @@ babel-core@^6.0.14, babel-core@^6.26.0: babel-eslint@^10.1.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + resolved "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz" integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== dependencies: "@babel/code-frame" "^7.0.0" @@ -3530,14 +3507,14 @@ babel-eslint@^10.1.0: babel-extract-comments@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" + resolved "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz" integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== dependencies: babylon "^6.18.0" babel-generator@^6.26.0: version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + resolved "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz" integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" @@ -3551,7 +3528,7 @@ babel-generator@^6.26.0: babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + resolved "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz" integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= dependencies: babel-helper-explode-assignable-expression "^6.24.1" @@ -3560,7 +3537,7 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-helper-call-delegate@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + resolved "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz" integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= dependencies: babel-helper-hoist-variables "^6.24.1" @@ -3570,7 +3547,7 @@ babel-helper-call-delegate@^6.24.1: babel-helper-define-map@^6.24.1: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + resolved "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz" integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= dependencies: babel-helper-function-name "^6.24.1" @@ -3580,7 +3557,7 @@ babel-helper-define-map@^6.24.1: babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + resolved "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz" integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= dependencies: babel-runtime "^6.22.0" @@ -3589,7 +3566,7 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-helper-function-name@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + resolved "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz" integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= dependencies: babel-helper-get-function-arity "^6.24.1" @@ -3600,7 +3577,7 @@ babel-helper-function-name@^6.24.1: babel-helper-get-function-arity@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + resolved "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz" integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= dependencies: babel-runtime "^6.22.0" @@ -3608,7 +3585,7 @@ babel-helper-get-function-arity@^6.24.1: babel-helper-hoist-variables@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + resolved "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz" integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= dependencies: babel-runtime "^6.22.0" @@ -3616,7 +3593,7 @@ babel-helper-hoist-variables@^6.24.1: babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + resolved "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz" integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= dependencies: babel-runtime "^6.22.0" @@ -3624,7 +3601,7 @@ babel-helper-optimise-call-expression@^6.24.1: babel-helper-regex@^6.24.1: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + resolved "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz" integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= dependencies: babel-runtime "^6.26.0" @@ -3633,7 +3610,7 @@ babel-helper-regex@^6.24.1: babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + resolved "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz" integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= dependencies: babel-helper-function-name "^6.24.1" @@ -3644,7 +3621,7 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-helper-replace-supers@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + resolved "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz" integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= dependencies: babel-helper-optimise-call-expression "^6.24.1" @@ -3656,7 +3633,7 @@ babel-helper-replace-supers@^6.24.1: babel-helpers@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + resolved "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz" integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: babel-runtime "^6.22.0" @@ -3664,7 +3641,7 @@ babel-helpers@^6.24.1: babel-jest@^26.6.0, babel-jest@^26.6.3: version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz" integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== dependencies: "@jest/transform" "^26.6.2" @@ -3678,7 +3655,7 @@ babel-jest@^26.6.0, babel-jest@^26.6.3: babel-loader@8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz" integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== dependencies: find-cache-dir "^2.1.0" @@ -3689,28 +3666,28 @@ babel-loader@8.1.0: babel-messages@^6.23.0: version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + resolved "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz" integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + resolved "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz" integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= dependencies: babel-runtime "^6.22.0" babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" babel-plugin-istanbul@^6.0.0: version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -3721,7 +3698,7 @@ babel-plugin-istanbul@^6.0.0: babel-plugin-jest-hoist@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz" integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== dependencies: "@babel/template" "^7.3.3" @@ -3731,7 +3708,7 @@ babel-plugin-jest-hoist@^26.6.2: babel-plugin-macros@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== dependencies: "@babel/runtime" "^7.12.5" @@ -3740,12 +3717,12 @@ babel-plugin-macros@^3.1.0: babel-plugin-named-asset-import@^0.3.7: version "0.3.8" - resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" + resolved "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz" integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== babel-plugin-polyfill-corejs2@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz" integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== dependencies: "@babel/compat-data" "^7.13.11" @@ -3754,7 +3731,7 @@ babel-plugin-polyfill-corejs2@^0.3.0: babel-plugin-polyfill-corejs3@^0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.0.tgz#f81371be3fe499d39e074e272a1ef86533f3d268" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.0.tgz" integrity sha512-Hcrgnmkf+4JTj73GbK3bBhlVPiLL47owUAnoJIf69Hakl3q+KfodbDXiZWGMM7iqCZTxCG3Z2VRfPNYES4rXqQ== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.0" @@ -3762,14 +3739,14 @@ babel-plugin-polyfill-corejs3@^0.5.0: babel-plugin-polyfill-regenerator@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz" integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.0" "babel-plugin-styled-components@>= 1.12.0": version "2.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.2.tgz#0fac11402dc9db73698b55847ab1dc73f5197c54" + resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.2.tgz" integrity sha512-7eG5NE8rChnNTDxa6LQfynwgHTVOYYaHJbUYSlOhk8QBXIQiMBKq4gyfHBBKPrxUcVBXVJL61ihduCpCQbuNbw== dependencies: "@babel/helper-annotate-as-pure" "^7.16.0" @@ -3779,32 +3756,32 @@ babel-plugin-polyfill-regenerator@^0.3.0: babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + resolved "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz" integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + resolved "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz" integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + resolved "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz" integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + resolved "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz" integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + resolved "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz" integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= dependencies: babel-helper-remap-async-to-generator "^6.24.1" @@ -3813,21 +3790,21 @@ babel-plugin-transform-async-to-generator@^6.22.0: babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz" integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz" integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz" integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= dependencies: babel-runtime "^6.26.0" @@ -3838,7 +3815,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0: babel-plugin-transform-es2015-classes@^6.23.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz" integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= dependencies: babel-helper-define-map "^6.24.1" @@ -3853,7 +3830,7 @@ babel-plugin-transform-es2015-classes@^6.23.0: babel-plugin-transform-es2015-computed-properties@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz" integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= dependencies: babel-runtime "^6.22.0" @@ -3861,14 +3838,14 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0: babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz" integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz" integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= dependencies: babel-runtime "^6.22.0" @@ -3876,14 +3853,14 @@ babel-plugin-transform-es2015-duplicate-keys@^6.22.0: babel-plugin-transform-es2015-for-of@^6.23.0: version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz" integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz" integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= dependencies: babel-helper-function-name "^6.24.1" @@ -3892,14 +3869,14 @@ babel-plugin-transform-es2015-function-name@^6.22.0: babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz" integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz" integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= dependencies: babel-plugin-transform-es2015-modules-commonjs "^6.24.1" @@ -3908,7 +3885,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz" integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== dependencies: babel-plugin-transform-strict-mode "^6.24.1" @@ -3918,7 +3895,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz" integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= dependencies: babel-helper-hoist-variables "^6.24.1" @@ -3927,7 +3904,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0: babel-plugin-transform-es2015-modules-umd@^6.23.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz" integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= dependencies: babel-plugin-transform-es2015-modules-amd "^6.24.1" @@ -3936,7 +3913,7 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0: babel-plugin-transform-es2015-object-super@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz" integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= dependencies: babel-helper-replace-supers "^6.24.1" @@ -3944,7 +3921,7 @@ babel-plugin-transform-es2015-object-super@^6.22.0: babel-plugin-transform-es2015-parameters@^6.23.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz" integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= dependencies: babel-helper-call-delegate "^6.24.1" @@ -3956,7 +3933,7 @@ babel-plugin-transform-es2015-parameters@^6.23.0: babel-plugin-transform-es2015-shorthand-properties@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz" integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= dependencies: babel-runtime "^6.22.0" @@ -3964,14 +3941,14 @@ babel-plugin-transform-es2015-shorthand-properties@^6.22.0: babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz" integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz" integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= dependencies: babel-helper-regex "^6.24.1" @@ -3980,21 +3957,21 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0: babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz" integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz" integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz" integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= dependencies: babel-helper-regex "^6.24.1" @@ -4003,7 +3980,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0: babel-plugin-transform-exponentiation-operator@^6.22.0: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + resolved "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz" integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" @@ -4012,7 +3989,7 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-transform-object-rest-spread@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + resolved "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz" integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" @@ -4020,19 +3997,19 @@ babel-plugin-transform-object-rest-spread@^6.26.0: babel-plugin-transform-react-remove-prop-types@^0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + resolved "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz" integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + resolved "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz" integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= dependencies: regenerator-transform "^0.10.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + resolved "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz" integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= dependencies: babel-runtime "^6.22.0" @@ -4040,7 +4017,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-preset-current-node-syntax@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -4058,7 +4035,7 @@ babel-preset-current-node-syntax@^1.0.0: babel-preset-env@^1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + resolved "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz" integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== dependencies: babel-plugin-check-es2015-constants "^6.22.0" @@ -4094,7 +4071,7 @@ babel-preset-env@^1.7.0: babel-preset-jest@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz" integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== dependencies: babel-plugin-jest-hoist "^26.6.2" @@ -4102,7 +4079,7 @@ babel-preset-jest@^26.6.2: babel-preset-react-app@^10.0.0: version "10.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz#ed6005a20a24f2c88521809fa9aea99903751584" + resolved "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz" integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== dependencies: "@babel/core" "^7.16.0" @@ -4124,7 +4101,7 @@ babel-preset-react-app@^10.0.0: babel-register@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + resolved "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz" integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= dependencies: babel-core "^6.26.0" @@ -4137,7 +4114,7 @@ babel-register@^6.26.0: babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" @@ -4145,7 +4122,7 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + resolved "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz" integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" @@ -4156,7 +4133,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + resolved "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz" integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" @@ -4171,7 +4148,7 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz" integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" @@ -4181,7 +4158,7 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: babelify@^7.3.0: version "7.3.0" - resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" + resolved "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz" integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= dependencies: babel-core "^6.0.14" @@ -4189,36 +4166,36 @@ babelify@^7.3.0: babylon@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + resolved "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== backoff@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" + resolved "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz" integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= dependencies: precond "0.2" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2: version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base@^0.11.1: version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" @@ -4231,24 +4208,24 @@ base@^0.11.1: batch@0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" bech32@1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== bfj@^7.0.2: version "7.0.2" - resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" + resolved "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz" integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== dependencies: bluebird "^3.5.5" @@ -4258,83 +4235,76 @@ bfj@^7.0.2: big.js@^5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^1.0.0: version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bind-decorator@^1.0.11: version "1.0.11" - resolved "https://registry.yarnpkg.com/bind-decorator/-/bind-decorator-1.0.11.tgz#e41bc06a1f65dd9cec476c91c5daf3978488252f" + resolved "https://registry.npmjs.org/bind-decorator/-/bind-decorator-1.0.11.tgz" integrity sha1-5BvAah9l3ZzsR2yRxdrzl4SIJS8= bindings@^1.2.1, bindings@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" bip66@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" + resolved "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz" integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= dependencies: safe-buffer "^5.0.1" blakejs@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702" + resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz" integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg== -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" - bluebird@^3.5.5: version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@4.11.6: version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= bn.js@4.11.8: version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== bn.js@5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz" integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0: version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== body-parser@1.19.1: version "1.19.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz" integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== dependencies: bytes "3.1.1" @@ -4350,7 +4320,7 @@ body-parser@1.19.1: bonjour@^3.5.0: version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + resolved "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz" integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= dependencies: array-flatten "^2.1.0" @@ -4362,17 +4332,17 @@ bonjour@^3.5.0: boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= bootstrap@^4.5.3: version "4.6.1" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.1.tgz#bc25380c2c14192374e8dec07cf01b2742d222a2" + resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.1.tgz" integrity sha512-0dj+VgI9Ecom+rvvpNZ4MUZJz8dcX7WCX+eTID9+/8HgOkv3dsRzi8BGeZJCQU6flWQVYxwTQnEZFrmJSEO7og== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -4380,7 +4350,7 @@ brace-expansion@^1.1.7: braces@^2.3.1, braces@^2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" @@ -4396,24 +4366,24 @@ braces@^2.3.1, braces@^2.3.2: braces@^3.0.1, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-process-hrtime@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6, browserify-aes@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -4425,7 +4395,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6, browserify- browserify-cipher@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" @@ -4434,7 +4404,7 @@ browserify-cipher@^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" + resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" @@ -4444,7 +4414,7 @@ browserify-des@^1.0.0: browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: bn.js "^5.0.0" @@ -4452,7 +4422,7 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: browserify-sign@^4.0.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== dependencies: bn.js "^5.1.1" @@ -4467,14 +4437,14 @@ browserify-sign@^4.0.0: browserify-zlib@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" browserslist@4.14.2: version "4.14.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz" integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw== dependencies: caniuse-lite "^1.0.30001125" @@ -4484,7 +4454,7 @@ browserslist@4.14.2: browserslist@^3.2.6: version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz" integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== dependencies: caniuse-lite "^1.0.30000844" @@ -4492,7 +4462,7 @@ browserslist@^3.2.6: browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.5, browserslist@^4.19.1, browserslist@^4.6.2, browserslist@^4.6.4: version "4.19.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz" integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== dependencies: caniuse-lite "^1.0.30001286" @@ -4503,14 +4473,14 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.5, browserslist@^4 bs58@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= dependencies: base-x "^3.0.2" bs58check@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== dependencies: bs58 "^4.0.0" @@ -4519,24 +4489,24 @@ bs58check@^2.1.2: bser@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" btoa@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + resolved "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz" integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== buffer-alloc-unsafe@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + resolved "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz" integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== buffer-alloc@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + resolved "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz" integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== dependencies: buffer-alloc-unsafe "^1.1.0" @@ -4544,32 +4514,32 @@ buffer-alloc@^1.2.0: buffer-fill@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + resolved "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz" integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= buffer-from@^1.0.0, buffer-from@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-indexof@^1.0.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + resolved "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz" integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== buffer-to-arraybuffer@^0.0.5: version "0.0.5" - resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" + resolved "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz" integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= buffer-xor@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" @@ -4578,7 +4548,7 @@ buffer@^4.3.0: buffer@^5.2.1, buffer@^5.4.3: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -4586,7 +4556,7 @@ buffer@^5.2.1, buffer@^5.4.3: buffer@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -4594,27 +4564,27 @@ buffer@^6.0.3: builtin-modules@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz" integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== builtin-status-codes@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= bytes@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= bytes@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz" integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== cacache@^12.0.2: version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + resolved "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz" integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: bluebird "^3.5.5" @@ -4635,7 +4605,7 @@ cacache@^12.0.2: cacache@^15.0.5: version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== dependencies: "@npmcli/fs" "^1.0.0" @@ -4659,7 +4629,7 @@ cacache@^15.0.5: cache-base@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" @@ -4674,7 +4644,7 @@ cache-base@^1.0.1: call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -4682,47 +4652,39 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: caller-callsite@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + resolved "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz" integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= dependencies: callsites "^2.0.0" caller-path@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + resolved "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz" integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= dependencies: caller-callsite "^2.0.0" callsites@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + resolved "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz" integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^4.1.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - camelcase-keys@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz" integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= dependencies: camelcase "^4.1.0" @@ -4731,32 +4693,27 @@ camelcase-keys@^4.0.0: camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - camelcase@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== camelize@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz" integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= caniuse-api@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== dependencies: browserslist "^4.0.0" @@ -4766,38 +4723,38 @@ caniuse-api@^3.0.0: caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001286: version "1.0.30001298" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz#0e690039f62e91c3ea581673d716890512e7ec52" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz" integrity sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ== capture-exit@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + resolved "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz" integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== dependencies: rsvp "^4.8.4" case-sensitive-paths-webpack-plugin@2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz" integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" @@ -4808,7 +4765,7 @@ chalk@^1.1.1, chalk@^1.1.3: chalk@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" @@ -4816,7 +4773,7 @@ chalk@^3.0.0: chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -4824,25 +4781,25 @@ chalk@^4.0.0, chalk@^4.1.0: char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== check-types@^11.1.1: version "11.1.2" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" + resolved "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz" integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== checkpoint-store@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" + resolved "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz" integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY= dependencies: functional-red-black-tree "^1.0.1" -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== +"chokidar@>=3.0.0 <4.0.0": + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -4856,7 +4813,7 @@ checkpoint-store@^1.1.0: chokidar@^2.1.8: version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== dependencies: anymatch "^2.0.0" @@ -4873,29 +4830,44 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" +chokidar@^3.4.1: + version "3.5.2" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chownr@^1.1.1: version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chownr@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" @@ -4903,12 +4875,12 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: cjs-module-lexer@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz" integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== class-utils@^0.3.5: version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" @@ -4918,24 +4890,24 @@ class-utils@^0.3.5: classnames@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz" integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== clean-css@^4.2.3: version "4.2.4" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz" integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== dependencies: source-map "~0.6.0" clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cliui@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== dependencies: string-width "^3.1.0" @@ -4944,7 +4916,7 @@ cliui@^5.0.0: cliui@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: string-width "^4.2.0" @@ -4953,7 +4925,7 @@ cliui@^6.0.0: clone-deep@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" @@ -4962,41 +4934,36 @@ clone-deep@^4.0.1: clone@^2.0.0, clone@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= clsx@^1.1.0, clsx@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== co@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= coa@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + resolved "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz" integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== dependencies: "@types/q" "^1.5.1" chalk "^2.4.1" q "^1.1.2" -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - collect-v8-coverage@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== collection-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" @@ -5004,31 +4971,31 @@ collection-visit@^1.0.0: color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.6.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz" integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== dependencies: color-name "^1.0.0" @@ -5036,7 +5003,7 @@ color-string@^1.6.0: color@^3.0.0, color@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: color-convert "^1.9.3" @@ -5044,53 +5011,53 @@ color@^3.0.0, color@^3.2.1: combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@^2.20.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== common-tags@^1.8.0: version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== commondir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= component-emitter@^1.2.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== compose-function@3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + resolved "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz" integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= dependencies: arity-n "^1.0.4" compressible@~2.0.16: version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" compression@^1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== dependencies: accepts "~1.3.5" @@ -5103,12 +5070,12 @@ compression@^1.7.4: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@^1.5.0, concat-stream@^1.5.1: version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" @@ -5118,78 +5085,73 @@ concat-stream@^1.5.0, concat-stream@^1.5.1: confusing-browser-globals@^1.0.10: version "1.0.11" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== connect-history-api-fallback@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== console-browserify@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - constants-browserify@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" convert-source-map@^0.3.3: version "0.3.5" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz" integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== cookiejar@^2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" + resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz" integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== copy-concurrently@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + resolved "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz" integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== dependencies: aproba "^1.1.1" @@ -5201,19 +5163,19 @@ copy-concurrently@^1.0.0: copy-descriptor@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= copy-to-clipboard@^3.3.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz" integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== dependencies: toggle-selection "^1.0.6" core-js-compat@^3.20.0, core-js-compat@^3.20.2, core-js-compat@^3.6.2: version "3.20.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.2.tgz#d1ff6936c7330959b46b2e08b122a8b14e26140b" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.2.tgz" integrity sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg== dependencies: browserslist "^4.19.1" @@ -5221,32 +5183,32 @@ core-js-compat@^3.20.0, core-js-compat@^3.20.2, core-js-compat@^3.6.2: core-js-pure@^3.20.2: version "3.20.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.20.2.tgz#5d263565f0e34ceeeccdc4422fae3e84ca6b8c0f" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.2.tgz" integrity sha512-CmWHvSKn2vNL6p6StNp1EmMIfVY/pqn3JLAjfZQ8WZGPOlGoO92EkX9/Mk81i6GxvoPXjUqEQnpM3rJ5QxxIOg== core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.6.5: version "3.20.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.2.tgz#46468d8601eafc8b266bd2dd6bf9dee622779581" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.20.2.tgz" integrity sha512-nuqhq11DcOAbFBV4zCbKeGbKQsUDRqTX0oqx7AttUBuqe3h20ixsE039QHelbL6P4h+9kytVqyEtyZ6gsiwEYw== core-util-is@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^5.0.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz" integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== dependencies: import-fresh "^2.0.0" @@ -5256,7 +5218,7 @@ cosmiconfig@^5.0.0: cosmiconfig@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" @@ -5267,7 +5229,7 @@ cosmiconfig@^7.0.0: create-ecdh@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" @@ -5275,7 +5237,7 @@ create-ecdh@^4.0.0: 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" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -5286,7 +5248,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: create-hmac@^1.1.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" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -5298,7 +5260,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: cross-fetch@^2.1.0, cross-fetch@^2.1.1: version "2.2.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.5.tgz#afaf5729f3b6c78d89c9296115c9f142541a5705" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.5.tgz" integrity sha512-xqYAhQb4NhCJSRym03dwxpP1bYXpK3y7UN83Bo2WFi3x1Zmzn0SL/6xGoPr+gpt4WmNrgCCX3HPysvOwFOW36w== dependencies: node-fetch "2.6.1" @@ -5306,24 +5268,16 @@ cross-fetch@^2.1.0, cross-fetch@^2.1.1: cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - cross-spawn@^6.0.0: version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" @@ -5334,7 +5288,7 @@ cross-spawn@^6.0.0: crypto-browserify@^3.11.0: version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" @@ -5351,29 +5305,29 @@ crypto-browserify@^3.11.0: crypto-random-string@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= css-blank-pseudo@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz" integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== dependencies: postcss "^7.0.5" css-color-keywords@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= css-color-names@0.0.4, css-color-names@^0.0.4: version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + resolved "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz" integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= css-declaration-sorter@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz" integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== dependencies: postcss "^7.0.1" @@ -5381,7 +5335,7 @@ css-declaration-sorter@^4.0.1: css-has-pseudo@^0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz" integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== dependencies: postcss "^7.0.6" @@ -5389,7 +5343,7 @@ css-has-pseudo@^0.10.0: css-loader@4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz" integrity sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg== dependencies: camelcase "^6.0.0" @@ -5407,19 +5361,19 @@ css-loader@4.3.0: css-prefers-color-scheme@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz" integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== dependencies: postcss "^7.0.5" css-select-base-adapter@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + resolved "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz" integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== css-select@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + resolved "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz" integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== dependencies: boolbase "^1.0.0" @@ -5429,7 +5383,7 @@ css-select@^2.0.0: css-select@^4.1.3: version "4.2.1" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz" integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== dependencies: boolbase "^1.0.0" @@ -5440,7 +5394,7 @@ css-select@^4.1.3: css-to-react-native@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" + resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz" integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== dependencies: camelize "^1.0.0" @@ -5449,7 +5403,7 @@ css-to-react-native@^3.0.0: css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz" integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== dependencies: mdn-data "2.0.4" @@ -5457,7 +5411,7 @@ css-tree@1.0.0-alpha.37: css-tree@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: mdn-data "2.0.14" @@ -5465,22 +5419,22 @@ css-tree@^1.1.2: css-what@^3.2.1: version "3.4.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz" integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== css-what@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + resolved "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz" integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== css.escape@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= css@^2.0.0: version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + resolved "https://registry.npmjs.org/css/-/css-2.2.4.tgz" integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== dependencies: inherits "^2.0.3" @@ -5490,7 +5444,7 @@ css@^2.0.0: css@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + resolved "https://registry.npmjs.org/css/-/css-3.0.0.tgz" integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== dependencies: inherits "^2.0.4" @@ -5499,22 +5453,22 @@ css@^3.0.0: cssdb@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + resolved "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz" integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== cssesc@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz" integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== cssnano-preset-default@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz" integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== dependencies: css-declaration-sorter "^4.0.1" @@ -5550,29 +5504,29 @@ cssnano-preset-default@^4.0.8: cssnano-util-get-arguments@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + resolved "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz" integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= cssnano-util-get-match@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + resolved "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz" integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= cssnano-util-raw-cache@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + resolved "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz" integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== dependencies: postcss "^7.0.0" cssnano-util-same-parent@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + resolved "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz" integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== cssnano@^4.1.10: version "4.1.11" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz" integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== dependencies: cosmiconfig "^5.0.0" @@ -5582,48 +5536,48 @@ cssnano@^4.1.10: csso@^4.0.2: version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: css-tree "^1.1.2" cssom@^0.4.4: version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== cssom@~0.3.6: version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" csstype@^3.0.2: version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz" integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== currently-unhandled@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + resolved "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz" integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" cyclist@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + resolved "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= d@1, d@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz" integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== dependencies: es5-ext "^0.10.50" @@ -5631,19 +5585,19 @@ d@1, d@^1.0.1: damerau-levenshtein@^1.0.7: version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" data-urls@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== dependencies: abab "^2.0.3" @@ -5652,70 +5606,70 @@ data-urls@^2.0.0: debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" debug@=3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" debug@^3.1.1, debug@^3.2.5, debug@^3.2.7: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" decamelize-keys@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz" integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= dependencies: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decimal.js@^10.2.1: version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz" integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== decode-uri-component@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= decompress-response@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= dependencies: mimic-response "^1.0.0" dedent@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= deep-equal@^1.0.1, deep-equal@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== dependencies: is-arguments "^1.0.4" @@ -5727,17 +5681,17 @@ deep-equal@^1.0.1, deep-equal@~1.1.1: deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== default-gateway@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz" integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== dependencies: execa "^1.0.0" @@ -5745,35 +5699,35 @@ default-gateway@^4.2.0: deferred-leveldown@~1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" + resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz" integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA== dependencies: abstract-leveldown "~2.6.0" define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: object-keys "^1.0.12" define-property@^0.2.5: version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" @@ -5781,12 +5735,12 @@ define-property@^2.0.2: defined@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= del@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + resolved "https://registry.npmjs.org/del/-/del-4.1.1.tgz" integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== dependencies: "@types/glob" "^7.1.1" @@ -5799,27 +5753,22 @@ del@^4.1.1: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= dequal@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz" integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== des.js@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz" integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" @@ -5827,39 +5776,39 @@ des.js@^1.0.0: destroy@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-browser@5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" + resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.2.0.tgz" integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA== detect-browser@^5.1.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" + resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz" integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== detect-indent@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz" integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== detect-node@^2.0.4: version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== detect-port-alt@1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== dependencies: address "^1.0.1" @@ -5867,22 +5816,22 @@ detect-port-alt@1.1.6: diff-sequences@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== diff-sequences@^27.4.0: version "27.4.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz" integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww== diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diffie-hellman@^5.0.0: version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" @@ -5891,24 +5840,24 @@ diffie-hellman@^5.0.0: dijkstrajs@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" + resolved "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz" integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" dns-equal@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-packet@^1.3.1: version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz" integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== dependencies: ip "^1.1.0" @@ -5916,40 +5865,40 @@ dns-packet@^1.3.1: dns-txt@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + resolved "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz" integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= dependencies: buffer-indexof "^1.0.0" doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dom-accessibility-api@^0.5.6: version "0.5.10" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.10.tgz#caa6d08f60388d0bb4539dd75fe458a9a1d0014c" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.10.tgz" integrity sha512-Xu9mD0UjrJisTmv7lmVSDMagQcU9R5hwAbxsaAE/35XPnPLJobbuREfV/rraiSaEj/UOvgrzQs66zyTWTlyd+g== dom-converter@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== dependencies: utila "~0.4" dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" @@ -5957,7 +5906,7 @@ dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: dom-serializer@0: version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== dependencies: domelementtype "^2.0.1" @@ -5965,7 +5914,7 @@ dom-serializer@0: dom-serializer@^1.0.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz" integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== dependencies: domelementtype "^2.0.1" @@ -5974,41 +5923,41 @@ dom-serializer@^1.0.1: dom-walk@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== domain-browser@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== domelementtype@1: version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== domexception@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== dependencies: webidl-conversions "^5.0.0" domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz" integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== dependencies: domelementtype "^2.2.0" domutils@^1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== dependencies: dom-serializer "0" @@ -6016,7 +5965,7 @@ domutils@^1.7.0: domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" @@ -6025,7 +5974,7 @@ domutils@^2.5.2, domutils@^2.8.0: dot-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" @@ -6033,31 +5982,31 @@ dot-case@^3.0.4: dot-prop@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" dotenv-expand@5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz" integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== dotenv@8.2.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== dotignore@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" + resolved "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz" integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== dependencies: minimatch "^3.0.4" drbg.js@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" + resolved "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz" integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= dependencies: browserify-aes "^1.0.6" @@ -6066,12 +6015,12 @@ drbg.js@^1.0.1: duplexer@^0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + resolved "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz" integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== dependencies: end-of-stream "^1.0.0" @@ -6081,7 +6030,7 @@ duplexify@^3.4.2, duplexify@^3.6.0: ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" @@ -6089,22 +6038,22 @@ ecc-jsbn@~0.1.1: ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= ejs@^2.6.1: version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + resolved "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.17: version "1.4.41" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.41.tgz#0b2e126796e7fafb9fd71e29304468b9d0af5d65" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.41.tgz" integrity sha512-VQEXEJc+8rJIva85H8EPtB5Ux9g8TzkNGBanqphM9ZWMZ34elueKJ+5g+BPhz3Lk8gkujfQRcIZ+fpA0btUIuw== elliptic@6.5.2: version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz" integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== dependencies: bn.js "^4.4.0" @@ -6117,7 +6066,7 @@ elliptic@6.5.2: elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -6130,56 +6079,56 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5 emittery@^0.7.1: version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz" integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== emoji-regex@^7.0.1: version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emojis-list@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" enhanced-resolve@^4.3.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz" integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== dependencies: graceful-fs "^4.1.2" @@ -6188,45 +6137,45 @@ enhanced-resolve@^4.3.0: enquirer@^2.3.5: version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" entities@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== entities@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + resolved "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz" integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" error-stack-parser@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz" integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== dependencies: stackframe "^1.1.1" es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1: version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz" integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== dependencies: call-bind "^1.0.2" @@ -6252,7 +6201,7 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1: es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -6261,7 +6210,7 @@ es-to-primitive@^1.2.1: es5-ext@^0.10.35, es5-ext@^0.10.50: version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz" integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== dependencies: es6-iterator "~2.0.3" @@ -6270,7 +6219,7 @@ es5-ext@^0.10.35, es5-ext@^0.10.50: es6-iterator@2.0.3, es6-iterator@~2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= dependencies: d "1" @@ -6279,7 +6228,7 @@ es6-iterator@2.0.3, es6-iterator@~2.0.3: es6-symbol@^3.1.1, es6-symbol@~3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz" integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== dependencies: d "^1.0.1" @@ -6287,32 +6236,32 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: escalade@^3.0.2, escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: esprima "^4.0.1" @@ -6324,7 +6273,7 @@ escodegen@^2.0.0: eslint-config-airbnb-base@^14.2.1: version "14.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" + resolved "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz" integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== dependencies: confusing-browser-globals "^1.0.10" @@ -6333,7 +6282,7 @@ eslint-config-airbnb-base@^14.2.1: eslint-config-airbnb@^18.2.0: version "18.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz#b7fe2b42f9f8173e825b73c8014b592e449c98d9" + resolved "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz" integrity sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg== dependencies: eslint-config-airbnb-base "^14.2.1" @@ -6342,21 +6291,21 @@ eslint-config-airbnb@^18.2.0: eslint-config-prettier@^6.14.0: version "6.15.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz" integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== dependencies: get-stdin "^6.0.0" eslint-config-react-app@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz#ccff9fc8e36b322902844cbd79197982be355a0e" + resolved "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz" integrity sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A== dependencies: confusing-browser-globals "^1.0.10" eslint-import-resolver-node@^0.3.6: version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz" integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: debug "^3.2.7" @@ -6364,7 +6313,7 @@ eslint-import-resolver-node@^0.3.6: eslint-module-utils@^2.7.2: version "2.7.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz#1d0aa455dcf41052339b63cada8ab5fd57577129" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz" integrity sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg== dependencies: debug "^3.2.7" @@ -6372,7 +6321,7 @@ eslint-module-utils@^2.7.2: eslint-plugin-flowtype@5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.0.tgz#a4bef5dc18f9b2bdb41569a4ab05d73805a3d261" + resolved "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.0.tgz" integrity sha512-z7ULdTxuhlRJcEe1MVljePXricuPOrsWfScRXFhNzVD5dmTHWjIF57AxD0e7AbEoLSbjSsaA5S+hCg43WvpXJQ== dependencies: lodash "^4.17.15" @@ -6380,7 +6329,7 @@ eslint-plugin-flowtype@5.2.0: eslint-plugin-flowtype@^5.2.0: version "5.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz#7764cc63940f215bf3f0bd2d9a1293b2b9b2b4bb" + resolved "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz" integrity sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw== dependencies: lodash "^4.17.15" @@ -6388,14 +6337,14 @@ eslint-plugin-flowtype@^5.2.0: eslint-plugin-html@^6.1.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-html/-/eslint-plugin-html-6.2.0.tgz#715bc00b50bbd0d996e28f953c289a5ebec69d43" + resolved "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.2.0.tgz" integrity sha512-vi3NW0E8AJombTvt8beMwkL1R/fdRWl4QSNRNMhVQKWm36/X0KF0unGNAY4mqUF06mnwVWZcIcerrCnfn9025g== dependencies: htmlparser2 "^7.1.2" eslint-plugin-import@^2.22.1: version "2.25.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz" integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA== dependencies: array-includes "^3.1.4" @@ -6414,14 +6363,14 @@ eslint-plugin-import@^2.22.1: eslint-plugin-jest@^24.1.0: version "24.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz#206ac0833841e59e375170b15f8d0955219c4889" + resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz" integrity sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA== dependencies: "@typescript-eslint/experimental-utils" "^4.0.1" eslint-plugin-jsx-a11y@^6.3.1: version "6.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz" integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== dependencies: "@babel/runtime" "^7.16.3" @@ -6439,24 +6388,24 @@ eslint-plugin-jsx-a11y@^6.3.1: eslint-plugin-prettier@^3.1.4: version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz" integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== dependencies: prettier-linter-helpers "^1.0.0" eslint-plugin-react-hooks@4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz" integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== eslint-plugin-react-hooks@^4.2.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz" integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== eslint-plugin-react@^7.21.5: version "7.28.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz#8f3ff450677571a659ce76efc6d80b6a525adbdf" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz" integrity sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw== dependencies: array-includes "^3.1.4" @@ -6476,14 +6425,14 @@ eslint-plugin-react@^7.21.5: eslint-plugin-testing-library@^3.9.2: version "3.10.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz#609ec2b0369da7cf2e6d9edff5da153cc31d87bd" + resolved "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz" integrity sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA== dependencies: "@typescript-eslint/experimental-utils" "^3.10.1" eslint-scope@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== dependencies: esrecurse "^4.1.0" @@ -6491,7 +6440,7 @@ eslint-scope@^4.0.3: eslint-scope@^5.0.0, eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -6499,31 +6448,31 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1: eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" eslint-utils@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint-webpack-plugin@^2.1.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.6.0.tgz#3bd4ada4e539cb1f6687d2f619073dbb509361cd" + resolved "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.6.0.tgz" integrity sha512-V+LPY/T3kur5QO3u+1s34VDTcRxjXWPUGM4hlmTb5DwVD0OQz631yGTxJZf4SpAqAjdbBVe978S8BJeHpAdOhQ== dependencies: "@types/eslint" "^7.28.2" @@ -6535,7 +6484,7 @@ eslint-webpack-plugin@^2.1.0: eslint@7.12.0: version "7.12.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.0.tgz#7b6a85f87a9adc239e979bb721cde5ce0dc27da6" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.12.0.tgz" integrity sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA== dependencies: "@babel/code-frame" "^7.0.0" @@ -6578,7 +6527,7 @@ eslint@7.12.0: eslint@^7.11.0: version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" @@ -6624,7 +6573,7 @@ eslint@^7.11.0: espree@^7.3.0, espree@^7.3.1: version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: acorn "^7.4.0" @@ -6633,56 +6582,56 @@ espree@^7.3.0, espree@^7.3.1: esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.2.0, esquery@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz" integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== estree-walker@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eth-block-tracker@4.4.3, eth-block-tracker@^4.2.0, eth-block-tracker@^4.4.2: version "4.4.3" - resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" + resolved "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz" integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== dependencies: "@babel/plugin-transform-runtime" "^7.5.5" @@ -6694,14 +6643,14 @@ eth-block-tracker@4.4.3, eth-block-tracker@^4.2.0, eth-block-tracker@^4.4.2: eth-json-rpc-errors@^1.0.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz#148377ef55155585981c21ff574a8937f9d6991f" + resolved "https://registry.npmjs.org/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz" integrity sha512-WT5shJ5KfNqHi9jOZD+ID8I1kuYWNrigtZat7GOQkvwo99f8SzAVaEcWhJUv656WiZOAg3P1RiJQANtUmDmbIg== dependencies: fast-safe-stringify "^2.0.6" eth-json-rpc-filters@4.2.2, eth-json-rpc-filters@^4.0.2, eth-json-rpc-filters@^4.1.1, eth-json-rpc-filters@^4.2.1: version "4.2.2" - resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz#eb35e1dfe9357ace8a8908e7daee80b2cd60a10d" + resolved "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz" integrity sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw== dependencies: "@metamask/safe-event-emitter" "^2.0.0" @@ -6713,7 +6662,7 @@ eth-json-rpc-filters@4.2.2, eth-json-rpc-filters@^4.0.2, eth-json-rpc-filters@^4 eth-json-rpc-infura@^3.1.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f" + resolved "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz" integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== dependencies: cross-fetch "^2.1.1" @@ -6723,7 +6672,7 @@ eth-json-rpc-infura@^3.1.0: eth-json-rpc-infura@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-4.1.0.tgz#623478375ba65e4304dea529ed69e8bd7938270d" + resolved "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-4.1.0.tgz" integrity sha512-DFYitKovzVlCdUulEccdm4g6k/vnvyByuw7rd5OoWDBSIiaeinI8Z/SntLjSIs2c+YvE20DGwk/GLwZGCWDN1Q== dependencies: eth-json-rpc-middleware "^4.4.0" @@ -6733,7 +6682,7 @@ eth-json-rpc-infura@^4.0.1: eth-json-rpc-infura@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz#e6da7dc47402ce64c54e7018170d89433c4e8fb6" + resolved "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz" integrity sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow== dependencies: eth-json-rpc-middleware "^6.0.0" @@ -6743,7 +6692,7 @@ eth-json-rpc-infura@^5.1.0: eth-json-rpc-middleware@^1.5.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f" + resolved "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz" integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== dependencies: async "^2.5.0" @@ -6762,7 +6711,7 @@ eth-json-rpc-middleware@^1.5.0: eth-json-rpc-middleware@^4.1.5, eth-json-rpc-middleware@^4.4.0: version "4.4.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.1.tgz#07d3dd0724c24a8d31e4a172ee96271da71b4228" + resolved "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.1.tgz" integrity sha512-yoSuRgEYYGFdVeZg3poWOwAlRI+MoBIltmOB86MtpoZjvLbou9EB/qWMOWSmH2ryCWLW97VYY6NWsmWm3OAA7A== dependencies: btoa "^1.2.1" @@ -6782,7 +6731,7 @@ eth-json-rpc-middleware@^4.1.5, eth-json-rpc-middleware@^4.4.0: eth-json-rpc-middleware@^5.0.2: version "5.1.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-5.1.0.tgz#affc63ddb31205e4b2f2c451571902031dad70fc" + resolved "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-5.1.0.tgz" integrity sha512-0uq8nWgHWLKA0sMhVqViue3vSEBVuQXyk2yzjhe8GSo/dGpJUtmYN1DvDF1LQtEhHI4N/G6MKPbiR/aWSRkPmg== dependencies: btoa "^1.2.1" @@ -6802,7 +6751,7 @@ eth-json-rpc-middleware@^5.0.2: eth-json-rpc-middleware@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz#4fe16928b34231a2537856f08a5ebbc3d0c31175" + resolved "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz" integrity sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ== dependencies: btoa "^1.2.1" @@ -6819,7 +6768,7 @@ eth-json-rpc-middleware@^6.0.0: eth-lib@0.2.7: version "0.2.7" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.7.tgz#2f93f17b1e23aec3759cd4a3fe20c1286a3fc1ca" + resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz" integrity sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco= dependencies: bn.js "^4.11.6" @@ -6828,7 +6777,7 @@ eth-lib@0.2.7: eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" + resolved "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz" integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= dependencies: json-rpc-random-id "^1.0.0" @@ -6836,28 +6785,28 @@ eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: eth-rpc-errors@4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.2.tgz#11bc164e25237a679061ac05b7da7537b673d3b7" + resolved "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.2.tgz" integrity sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ== dependencies: fast-safe-stringify "^2.0.6" eth-rpc-errors@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10" + resolved "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz" integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg== dependencies: fast-safe-stringify "^2.0.6" eth-rpc-errors@^4.0.2: version "4.0.3" - resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" + resolved "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz" integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== dependencies: fast-safe-stringify "^2.0.6" eth-sig-util@2.5.3: version "2.5.3" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.3.tgz#6938308b38226e0b3085435474900b03036abcbe" + resolved "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.5.3.tgz" integrity sha512-KpXbCKmmBUNUTGh9MRKmNkIPietfhzBqqYqysDavLseIiMUGl95k6UcPEkALAZlj41e9E6yioYXc1PC333RKqw== dependencies: buffer "^5.2.1" @@ -6869,7 +6818,7 @@ eth-sig-util@2.5.3: eth-sig-util@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" + resolved "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz" integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= dependencies: ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" @@ -6877,7 +6826,7 @@ eth-sig-util@^1.4.2: eth-tx-summary@^3.1.2: version "3.2.4" - resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" + resolved "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz" integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== dependencies: async "^2.1.2" @@ -6893,7 +6842,7 @@ eth-tx-summary@^3.1.2: ethereum-checksum-address@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/ethereum-checksum-address/-/ethereum-checksum-address-0.0.2.tgz#46fcb2d962dacd1ed49d7b464408ec26fd183209" + resolved "https://registry.npmjs.org/ethereum-checksum-address/-/ethereum-checksum-address-0.0.2.tgz" integrity sha512-GAb7mPvGgcfi1j+Bsnwm9af9Z7dLUKp+5cFm88+kMrKACfh9gLatGLVVK5pSGEG2pOGfrmqCRcuh3RtMjIg8GQ== dependencies: keccak256 "^1.0.0" @@ -6901,17 +6850,17 @@ ethereum-checksum-address@0.0.2: ethereum-common@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" + resolved "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz" integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== ethereum-common@^0.0.18: version "0.0.18" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" + resolved "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz" integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= ethereum-cryptography@^0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== dependencies: "@types/pbkdf2" "^3.0.0" @@ -6932,7 +6881,7 @@ ethereum-cryptography@^0.1.3: ethereum-private-key-to-address@0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/ethereum-private-key-to-address/-/ethereum-private-key-to-address-0.0.3.tgz#1f1dccaefd1198c2dcde55501f331a846bd0aad0" + resolved "https://registry.npmjs.org/ethereum-private-key-to-address/-/ethereum-private-key-to-address-0.0.3.tgz" integrity sha512-P+z9eFlgOezxogEpY1sQR155U4xFmQUWVxKzIJa5BL05Gs7zL0sYuyQuSAme8LBYGQ6p6AwconiMDauf4LbqyA== dependencies: ethereum-private-key-to-public-key "0.0.2" @@ -6941,7 +6890,7 @@ ethereum-private-key-to-address@0.0.3: ethereum-private-key-to-public-key@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/ethereum-private-key-to-public-key/-/ethereum-private-key-to-public-key-0.0.2.tgz#bb5803aad43df2692e0d7b4c9eaa224eec2a39cb" + resolved "https://registry.npmjs.org/ethereum-private-key-to-public-key/-/ethereum-private-key-to-public-key-0.0.2.tgz" integrity sha512-WKwFspLS5IdpV1rBUmWSG2xtIDV7YMpAG/uSjtV9kDzBU6hpSzoqg6R/e1iEfHkOr/eae+NtDTpwzXRtSMDvhw== dependencies: meow "^5.0.0" @@ -6949,7 +6898,7 @@ ethereum-private-key-to-public-key@0.0.2: ethereum-public-key-to-address@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/ethereum-public-key-to-address/-/ethereum-public-key-to-address-0.0.1.tgz#3f0237687d9c2217234dc5683f3eb580abf3f6ce" + resolved "https://registry.npmjs.org/ethereum-public-key-to-address/-/ethereum-public-key-to-address-0.0.1.tgz" integrity sha512-X78x/VBluHUdrYpZunoXJ48luXTaUiUK4ImPjTjI+XiS24+jUR5WFCpm9wCNbLYP6/ZCJ+lwuYormXSjt8rrbw== dependencies: ethereum-checksum-address "0.0.2" @@ -6959,7 +6908,7 @@ ethereum-public-key-to-address@0.0.1: ethereumjs-abi@0.6.5: version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" + resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz" integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE= dependencies: bn.js "^4.10.0" @@ -6967,14 +6916,14 @@ ethereumjs-abi@0.6.5: "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": version "0.6.8" - resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" + resolved "git+ssh://git@github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" dependencies: bn.js "^4.11.8" ethereumjs-util "^6.0.0" ethereumjs-account@^2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" + resolved "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz" integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== dependencies: ethereumjs-util "^5.0.0" @@ -6983,7 +6932,7 @@ ethereumjs-account@^2.0.3: ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: version "1.7.1" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" + resolved "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz" integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== dependencies: async "^2.0.1" @@ -6994,7 +6943,7 @@ ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: ethereumjs-block@~2.2.0: version "2.2.2" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" + resolved "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz" integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== dependencies: async "^2.0.1" @@ -7005,12 +6954,12 @@ ethereumjs-block@~2.2.0: ethereumjs-common@^1.1.0, ethereumjs-common@^1.5.0: version "1.5.2" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" + resolved "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz" integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3, ethereumjs-tx@^1.3.7: version "1.3.7" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" + resolved "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz" integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== dependencies: ethereum-common "^0.0.18" @@ -7018,7 +6967,7 @@ ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@ ethereumjs-tx@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" + resolved "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz" integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== dependencies: ethereumjs-common "^1.5.0" @@ -7026,7 +6975,7 @@ ethereumjs-tx@^2.1.1: ethereumjs-util@5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz" integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA== dependencies: bn.js "^4.11.0" @@ -7039,7 +6988,7 @@ ethereumjs-util@5.2.0: ethereumjs-util@^4.3.0: version "4.5.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz" integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w== dependencies: bn.js "^4.8.0" @@ -7050,7 +6999,7 @@ ethereumjs-util@^4.3.0: ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5: version "5.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz" integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== dependencies: bn.js "^4.11.0" @@ -7063,7 +7012,7 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum ethereumjs-util@^6.0.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== dependencies: "@types/bn.js" "^4.11.3" @@ -7076,7 +7025,7 @@ ethereumjs-util@^6.0.0: ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" + resolved "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz" integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== dependencies: async "^2.1.2" @@ -7093,14 +7042,14 @@ ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: ethers-multicall@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/ethers-multicall/-/ethers-multicall-0.2.1.tgz#0c01dc50f3b87c93be11e39bc8bc668bfa762b60" + resolved "https://registry.npmjs.org/ethers-multicall/-/ethers-multicall-0.2.1.tgz" integrity sha512-buSg3j75HhMnRiZ+hIXfJYA/MUZbhukE1oczeluM7O+4yWjhqI98ADcQ0bPr8EOpwtV4J3Eba47fkbx5GJpz5Q== dependencies: ethers "^5.0.0" ethers@4.0.47: version "4.0.47" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.47.tgz#91b9cd80473b1136dd547095ff9171bd1fc68c85" + resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.47.tgz" integrity sha512-hssRYhngV4hiDNeZmVU/k5/E8xmLG8UpcNUzg6mb7lqhgpFPH/t7nuv20RjRrEf0gblzvi2XwR5Te+V3ZFc9pQ== dependencies: aes-js "3.0.0" @@ -7115,7 +7064,7 @@ ethers@4.0.47: ethers@^5.0.0, ethers@^5.5.2: version "5.5.3" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.5.3.tgz#1e361516711c0c3244b6210e7e3ecabf0c75fca0" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.5.3.tgz" integrity sha512-fTT4WT8/hTe/BLwRUtl7I5zlpF3XC3P/Xwqxc5AIP2HGlH15qpmjs0Ou78az93b1rLITzXLFxoNX63B8ZbUd7g== dependencies: "@ethersproject/abi" "5.5.0" @@ -7151,7 +7100,7 @@ ethers@^5.0.0, ethers@^5.5.2: ethjs-unit@0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= dependencies: bn.js "4.11.6" @@ -7159,7 +7108,7 @@ ethjs-unit@0.1.6: ethjs-util@0.1.6, ethjs-util@^0.1.3: version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== dependencies: is-hex-prefixed "1.0.0" @@ -7167,29 +7116,29 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3: eventemitter3@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz" integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== eventemitter3@4.0.7, eventemitter3@^4.0.0: version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.0.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== eventsource@^1.0.7: version "1.1.0" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + resolved "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz" integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== dependencies: original "^1.0.0" 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" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" @@ -7197,12 +7146,12 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: exec-sh@^0.3.2: version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + resolved "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz" integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== execa@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: cross-spawn "^6.0.0" @@ -7215,7 +7164,7 @@ execa@^1.0.0: execa@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== dependencies: cross-spawn "^7.0.0" @@ -7230,12 +7179,12 @@ execa@^4.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= expand-brackets@^2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" @@ -7248,7 +7197,7 @@ expand-brackets@^2.1.4: expect@^26.6.0, expect@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" + resolved "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz" integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== dependencies: "@jest/types" "^26.6.2" @@ -7260,7 +7209,7 @@ expect@^26.6.0, expect@^26.6.2: express@^4.17.1: version "4.17.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" + resolved "https://registry.npmjs.org/express/-/express-4.17.2.tgz" integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== dependencies: accepts "~1.3.7" @@ -7296,21 +7245,21 @@ express@^4.17.1: ext@^1.1.2: version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" + resolved "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz" integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== dependencies: type "^2.5.0" extend-shallow@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" @@ -7318,12 +7267,12 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: extend@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== extglob@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" @@ -7337,34 +7286,34 @@ extglob@^2.0.4: extsprintf@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== fake-merkle-patricia-tree@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" + resolved "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz" integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM= dependencies: checkpoint-store "^1.1.0" fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== fast-glob@^3.1.1, fast-glob@^3.2.9: version "3.2.10" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.10.tgz#2734f83baa7f43b7fd41e13bc34438f4ffe284ee" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.10.tgz" integrity sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -7375,76 +7324,76 @@ fast-glob@^3.1.1, fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fast-safe-stringify@^2.0.6: version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fastq@^1.6.0: version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" faye-websocket@^0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz" integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= dependencies: websocket-driver ">=0.5.1" faye-websocket@~0.11.1: version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" fb-watchman@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== dependencies: bser "2.1.1" fetch-ponyfill@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" + resolved "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz" integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM= dependencies: node-fetch "~1.7.1" figgy-pudding@^3.5.1: version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== file-entry-cache@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz" integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== dependencies: flat-cache "^2.0.1" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" file-loader@6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.1.tgz#a6f29dfb3f5933a1c350b2dbaa20ac5be0539baa" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz" integrity sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw== dependencies: loader-utils "^2.0.0" @@ -7452,17 +7401,17 @@ file-loader@6.1.1: file-uri-to-path@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== filesize@6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" + resolved "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz" integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== fill-range@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" @@ -7472,14 +7421,14 @@ fill-range@^4.0.0: fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" finalhandler@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: debug "2.6.9" @@ -7492,7 +7441,7 @@ finalhandler@~1.1.2: find-cache-dir@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== dependencies: commondir "^1.0.1" @@ -7501,7 +7450,7 @@ find-cache-dir@^2.1.0: find-cache-dir@^3.3.1: version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" @@ -7510,37 +7459,29 @@ find-cache-dir@^3.3.1: find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" find-up@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" flat-cache@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== dependencies: flatted "^2.0.0" @@ -7549,7 +7490,7 @@ flat-cache@^2.0.1: flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -7557,22 +7498,22 @@ flat-cache@^3.0.4: flatted@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + resolved "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatted@^3.1.0: version "3.2.4" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz" integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== flatten@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + resolved "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz" integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== flush-write-stream@^1.0.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + resolved "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz" integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== dependencies: inherits "^2.0.3" @@ -7580,36 +7521,36 @@ flush-write-stream@^1.0.0: follow-redirects@1.5.10: version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz" integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== dependencies: debug "=3.1.0" follow-redirects@^1.0.0: version "1.14.7" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz" integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== for-each@~0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" for-in@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= fork-ts-checker-webpack-plugin@4.1.6: version "4.1.6" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz" integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== dependencies: "@babel/code-frame" "^7.5.5" @@ -7622,7 +7563,7 @@ fork-ts-checker-webpack-plugin@4.1.6: form-data@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" @@ -7631,7 +7572,7 @@ form-data@^3.0.0: form-data@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" @@ -7640,29 +7581,29 @@ form-data@~2.3.2: fortmatic@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/fortmatic/-/fortmatic-2.2.1.tgz#91ce9159c1fe539bd87e483125fca5c27a410a86" + resolved "https://registry.npmjs.org/fortmatic/-/fortmatic-2.2.1.tgz" integrity sha512-PEfPoErJSErU2A8iYD2Mab2c8eJK5dCdCr1jR/8yc49aEAlyQ4UXnZXyeO6MU5zBGkDAZmg9brnRSPzc+8MKPQ== forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fragment-cache@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= from2@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + resolved "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz" integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= dependencies: inherits "^2.0.1" @@ -7670,7 +7611,7 @@ from2@^2.1.0: fs-extra@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" @@ -7679,7 +7620,7 @@ fs-extra@^7.0.0: fs-extra@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" @@ -7688,7 +7629,7 @@ fs-extra@^8.1.0: fs-extra@^9.0.1: version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -7698,14 +7639,14 @@ fs-extra@^9.0.1: fs-minipass@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs-write-stream-atomic@^1.0.8: version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + resolved "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz" integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= dependencies: graceful-fs "^4.1.2" @@ -7715,12 +7656,12 @@ fs-write-stream-atomic@^1.0.8: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz" integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" @@ -7728,63 +7669,32 @@ fsevents@^1.2.7: fsevents@^2.1.2, fsevents@^2.1.3, fsevents@~2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -fstream@^1.0.0, fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" - gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" @@ -7793,41 +7703,36 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - get-stdin@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== get-stream@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" get-stream@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" get-symbol-description@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" @@ -7835,19 +7740,19 @@ get-symbol-description@^1.0.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" glob-parent@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz" integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: is-glob "^3.1.0" @@ -7855,14 +7760,14 @@ glob-parent@^3.1.0: glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -7872,9 +7777,9 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" -glob@~7.1.1, glob@~7.1.7: +glob@~7.1.7: version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" @@ -7886,14 +7791,14 @@ glob@~7.1.1, glob@~7.1.7: global-modules@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== dependencies: global-prefix "^3.0.0" global-prefix@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== dependencies: ini "^1.3.5" @@ -7902,7 +7807,7 @@ global-prefix@^3.0.0: global@~4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz" integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== dependencies: min-document "^2.19.0" @@ -7910,31 +7815,31 @@ global@~4.4.0: globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^12.1.0: version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + resolved "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== dependencies: type-fest "^0.8.1" globals@^13.6.0, globals@^13.9.0: version "13.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" + resolved "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz" integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== dependencies: type-fest "^0.20.2" globals@^9.18.0: version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + resolved "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globby@11.0.1: version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + resolved "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz" integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== dependencies: array-union "^2.1.0" @@ -7946,7 +7851,7 @@ globby@11.0.1: globby@^11.0.3: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -7958,7 +7863,7 @@ globby@^11.0.3: globby@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + resolved "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz" integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= dependencies: array-union "^1.0.1" @@ -7967,40 +7872,31 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globule@^1.0.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.3.tgz#811919eeac1ab7344e905f2e3be80a13447973c2" - integrity sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg== - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== graphql-tag@^2.12.3: version "2.12.6" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" + resolved "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz" integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== dependencies: tslib "^2.1.0" graphql@^15.4.0: version "15.8.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" + resolved "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz" integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== growly@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + resolved "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= gzip-size@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz" integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== dependencies: duplexer "^0.1.1" @@ -8008,17 +7904,17 @@ gzip-size@5.1.1: handle-thing@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== har-schema@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.3: version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: ajv "^6.12.3" @@ -8026,51 +7922,46 @@ har-validator@~5.1.3: harmony-reflect@^1.4.6: version "1.6.2" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + resolved "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== has-ansi@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-bigints@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has-value@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" @@ -8079,7 +7970,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" @@ -8088,12 +7979,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" @@ -8101,14 +7992,14 @@ has-values@^1.0.0: has@^1.0.0, has@^1.0.3, has@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hash-base@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" @@ -8117,7 +8008,7 @@ hash-base@^3.0.0: hash.js@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz" integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== dependencies: inherits "^2.0.3" @@ -8125,7 +8016,7 @@ hash.js@1.1.3: hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" @@ -8133,17 +8024,17 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: he@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== hex-color-regex@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + resolved "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== history@^4.9.0: version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== dependencies: "@babel/runtime" "^7.1.2" @@ -8155,7 +8046,7 @@ history@^4.9.0: hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" @@ -8164,14 +8055,14 @@ hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" home-or-tmp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + resolved "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz" integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= dependencies: os-homedir "^1.0.0" @@ -8179,17 +8070,17 @@ home-or-tmp@^2.0.0: hoopy@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + resolved "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz" integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== hosted-git-info@^2.1.4: version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hpack.js@^2.1.6: version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= dependencies: inherits "^2.0.1" @@ -8199,34 +8090,34 @@ hpack.js@^2.1.6: hsl-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + resolved "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz" integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= hsla-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + resolved "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= html-encoding-sniffer@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== dependencies: whatwg-encoding "^1.0.5" html-entities@^1.2.1, html-entities@^1.3.1: version "1.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz" integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-minifier-terser@^5.0.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz" integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== dependencies: camel-case "^4.1.1" @@ -8239,7 +8130,7 @@ html-minifier-terser@^5.0.1: html-webpack-plugin@4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz" integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw== dependencies: "@types/html-minifier-terser" "^5.0.0" @@ -8254,7 +8145,7 @@ html-webpack-plugin@4.5.0: htmlparser2@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" @@ -8264,7 +8155,7 @@ htmlparser2@^6.1.0: htmlparser2@^7.1.2: version "7.2.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz" integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== dependencies: domelementtype "^2.0.1" @@ -8274,12 +8165,12 @@ htmlparser2@^7.1.2: http-deceiver@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= http-errors@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== dependencies: depd "~1.1.2" @@ -8290,7 +8181,7 @@ http-errors@1.8.1: http-errors@~1.6.2: version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= dependencies: depd "~1.1.2" @@ -8300,12 +8191,12 @@ http-errors@~1.6.2: http-parser-js@>=0.5.1: version "0.5.5" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz" integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== http-proxy-agent@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: "@tootallnate/once" "1" @@ -8314,7 +8205,7 @@ http-proxy-agent@^4.0.1: http-proxy-middleware@0.19.1: version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz" integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== dependencies: http-proxy "^1.17.0" @@ -8324,7 +8215,7 @@ http-proxy-middleware@0.19.1: http-proxy@^1.17.0: version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" @@ -8333,7 +8224,7 @@ http-proxy@^1.17.0: http-signature@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" @@ -8342,12 +8233,12 @@ http-signature@~1.2.0: https-browserify@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= https-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: agent-base "6" @@ -8355,82 +8246,82 @@ https-proxy-agent@^5.0.0: human-signals@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.6.2: version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz" integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== dependencies: postcss "^7.0.14" identity-obj-proxy@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + resolved "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz" integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= dependencies: harmony-reflect "^1.4.6" 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" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== iferr@^0.1.5: version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + resolved "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= ignore@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== immediate@^3.2.3: version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz" integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== immer@8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" + resolved "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz" integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== immutable@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" - integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" + integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== import-cwd@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz" integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= dependencies: import-from "^2.1.0" import-fresh@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz" integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= dependencies: caller-path "^2.0.0" @@ -8438,7 +8329,7 @@ import-fresh@^2.0.0: import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -8446,14 +8337,14 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: import-from@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + resolved "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz" integrity sha1-M1238qev/VOqpHHUuAId7ja387E= dependencies: resolve-from "^3.0.0" import-local@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + resolved "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz" integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== dependencies: pkg-dir "^3.0.0" @@ -8461,7 +8352,7 @@ import-local@^2.0.0: import-local@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" @@ -8469,72 +8360,60 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -in-publish@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" - integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - indent-string@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== indexes-of@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + resolved "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz" integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, 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" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= inherits@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.5: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== internal-ip@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + resolved "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz" integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== dependencies: default-gateway "^4.2.0" @@ -8542,7 +8421,7 @@ internal-ip@^4.3.0: internal-slot@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: get-intrinsic "^1.1.0" @@ -8551,53 +8430,53 @@ internal-slot@^1.0.3: invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" ip-regex@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= ip@^1.1.0, ip@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + resolved "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= ipaddr.js@1.9.1, ipaddr.js@^1.9.0: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-absolute-url@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + resolved "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz" integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= is-absolute-url@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + resolved "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz" integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== is-accessor-descriptor@^0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arguments@^1.0.4: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -8605,38 +8484,38 @@ is-arguments@^1.0.4: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-binary-path@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz" integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -8644,34 +8523,34 @@ is-boolean-object@^1.1.0: is-buffer@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz" integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== is-buffer@^1.1.5: version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-buffer@^2.0.2: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-ci@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: ci-info "^2.0.0" is-color-stop@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + resolved "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz" integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= dependencies: css-color-names "^0.0.4" @@ -8683,35 +8562,35 @@ is-color-stop@^1.0.0: is-core-module@^2.0.0, is-core-module@^2.2.0, is-core-module@^2.8.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz" integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== dependencies: has "^1.0.3" is-data-descriptor@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-date-object@^1.0.1: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-descriptor@^0.1.0: version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" @@ -8720,7 +8599,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" @@ -8729,165 +8608,158 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-directory@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + resolved "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz" integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-docker@^2.0.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz" integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== is-fn@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" + resolved "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz" integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw= -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-function@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + resolved "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-glob@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz" integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hex-prefixed@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= is-module@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= is-negative-zero@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz" integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== dependencies: has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-path-cwd@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== is-path-in-cwd@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + resolved "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz" integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== dependencies: is-path-inside "^2.1.0" is-path-inside@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz" integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== dependencies: path-is-inside "^1.0.2" is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-potential-custom-element-name@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-regex@^1.0.4, is-regex@^1.1.4, is-regex@~1.1.3: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -8895,127 +8767,122 @@ is-regex@^1.0.4, is-regex@^1.1.4, is-regex@~1.1.3: is-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= is-resolvable@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + resolved "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== is-root@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== is-shared-array-buffer@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz" integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-typedarray@1.0.0, is-typedarray@^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" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - is-weakref@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" is-windows@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" isarray@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isarray@^2.0.1: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-instrument@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== dependencies: "@babel/core" "^7.7.5" @@ -9025,7 +8892,7 @@ istanbul-lib-instrument@^4.0.3: istanbul-lib-instrument@^5.0.4: version "5.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz" integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== dependencies: "@babel/core" "^7.12.3" @@ -9036,7 +8903,7 @@ istanbul-lib-instrument@^5.0.4: istanbul-lib-report@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -9045,7 +8912,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -9054,7 +8921,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^3.0.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz" integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg== dependencies: html-escaper "^2.0.0" @@ -9062,7 +8929,7 @@ istanbul-reports@^3.0.2: jest-changed-files@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz" integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== dependencies: "@jest/types" "^26.6.2" @@ -9071,7 +8938,7 @@ jest-changed-files@^26.6.2: jest-circus@26.6.0: version "26.6.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-26.6.0.tgz#7d9647b2e7f921181869faae1f90a2629fd70705" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz" integrity sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng== dependencies: "@babel/traverse" "^7.1.0" @@ -9098,7 +8965,7 @@ jest-circus@26.6.0: jest-cli@^26.6.0: version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz" integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== dependencies: "@jest/core" "^26.6.3" @@ -9117,7 +8984,7 @@ jest-cli@^26.6.0: jest-config@^26.6.3: version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz" integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== dependencies: "@babel/core" "^7.1.0" @@ -9141,7 +9008,7 @@ jest-config@^26.6.3: jest-diff@^26.0.0, jest-diff@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz" integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== dependencies: chalk "^4.0.0" @@ -9151,7 +9018,7 @@ jest-diff@^26.0.0, jest-diff@^26.6.2: jest-diff@^27.0.0: version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.6.tgz#93815774d2012a2cbb6cf23f84d48c7a2618f98d" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.6.tgz" integrity sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w== dependencies: chalk "^4.0.0" @@ -9161,14 +9028,14 @@ jest-diff@^27.0.0: jest-docblock@^26.0.0: version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz" integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== dependencies: detect-newline "^3.0.0" jest-each@^26.6.0, jest-each@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz" integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== dependencies: "@jest/types" "^26.6.2" @@ -9179,7 +9046,7 @@ jest-each@^26.6.0, jest-each@^26.6.2: jest-environment-jsdom@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz" integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== dependencies: "@jest/environment" "^26.6.2" @@ -9192,7 +9059,7 @@ jest-environment-jsdom@^26.6.2: jest-environment-node@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz" integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== dependencies: "@jest/environment" "^26.6.2" @@ -9204,17 +9071,17 @@ jest-environment-node@^26.6.2: jest-get-type@^26.3.0: version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== jest-get-type@^27.4.0: version "27.4.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz" integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ== jest-haste-map@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz" integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== dependencies: "@jest/types" "^26.6.2" @@ -9235,7 +9102,7 @@ jest-haste-map@^26.6.2: jest-jasmine2@^26.6.3: version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz" integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== dependencies: "@babel/traverse" "^7.1.0" @@ -9259,7 +9126,7 @@ jest-jasmine2@^26.6.3: jest-leak-detector@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz" integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== dependencies: jest-get-type "^26.3.0" @@ -9267,7 +9134,7 @@ jest-leak-detector@^26.6.2: jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz" integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== dependencies: chalk "^4.0.0" @@ -9277,7 +9144,7 @@ jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: jest-message-util@^26.6.0, jest-message-util@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz" integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== dependencies: "@babel/code-frame" "^7.0.0" @@ -9292,7 +9159,7 @@ jest-message-util@^26.6.0, jest-message-util@^26.6.2: jest-mock@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz" integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== dependencies: "@jest/types" "^26.6.2" @@ -9300,17 +9167,17 @@ jest-mock@^26.6.2: jest-pnp-resolver@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== jest-regex-util@^26.0.0: version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz" integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== jest-resolve-dependencies@^26.6.3: version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz" integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== dependencies: "@jest/types" "^26.6.2" @@ -9319,7 +9186,7 @@ jest-resolve-dependencies@^26.6.3: jest-resolve@26.6.0: version "26.6.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.0.tgz#070fe7159af87b03e50f52ea5e17ee95bbee40e1" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz" integrity sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ== dependencies: "@jest/types" "^26.6.0" @@ -9333,7 +9200,7 @@ jest-resolve@26.6.0: jest-resolve@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz" integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== dependencies: "@jest/types" "^26.6.2" @@ -9347,7 +9214,7 @@ jest-resolve@^26.6.2: jest-runner@^26.6.0, jest-runner@^26.6.3: version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz" integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== dependencies: "@jest/console" "^26.6.2" @@ -9373,7 +9240,7 @@ jest-runner@^26.6.0, jest-runner@^26.6.3: jest-runtime@^26.6.0, jest-runtime@^26.6.3: version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz" integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== dependencies: "@jest/console" "^26.6.2" @@ -9406,7 +9273,7 @@ jest-runtime@^26.6.0, jest-runtime@^26.6.3: jest-serializer@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz" integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== dependencies: "@types/node" "*" @@ -9414,7 +9281,7 @@ jest-serializer@^26.6.2: jest-snapshot@^26.6.0, jest-snapshot@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz" integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== dependencies: "@babel/types" "^7.0.0" @@ -9436,7 +9303,7 @@ jest-snapshot@^26.6.0, jest-snapshot@^26.6.2: jest-util@^26.6.0, jest-util@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz" integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== dependencies: "@jest/types" "^26.6.2" @@ -9448,7 +9315,7 @@ jest-util@^26.6.0, jest-util@^26.6.2: jest-validate@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz" integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== dependencies: "@jest/types" "^26.6.2" @@ -9460,7 +9327,7 @@ jest-validate@^26.6.2: jest-watch-typeahead@0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz#45221b86bb6710b7e97baaa1640ae24a07785e63" + resolved "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz" integrity sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg== dependencies: ansi-escapes "^4.3.1" @@ -9473,7 +9340,7 @@ jest-watch-typeahead@0.6.1: jest-watcher@^26.3.0, jest-watcher@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz" integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== dependencies: "@jest/test-result" "^26.6.2" @@ -9486,7 +9353,7 @@ jest-watcher@^26.3.0, jest-watcher@^26.6.2: jest-worker@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz" integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== dependencies: merge-stream "^2.0.0" @@ -9494,7 +9361,7 @@ jest-worker@^24.9.0: jest-worker@^26.5.0, jest-worker@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== dependencies: "@types/node" "*" @@ -9503,7 +9370,7 @@ jest-worker@^26.5.0, jest-worker@^26.6.2: jest-worker@^27.3.1: version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz" integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== dependencies: "@types/node" "*" @@ -9512,46 +9379,41 @@ jest-worker@^27.3.1: jest@26.6.0: version "26.6.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.0.tgz#546b25a1d8c888569dbbe93cae131748086a4a25" + resolved "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz" integrity sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA== dependencies: "@jest/core" "^26.6.0" import-local "^3.0.2" jest-cli "^26.6.0" -js-base64@^2.1.8: - version "2.6.4" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" - integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== - js-sha256@0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + resolved "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz" integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== js-sha3@0.5.7: version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= js-sha3@0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-tokens@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -9559,12 +9421,12 @@ js-yaml@^3.13.1: jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^16.4.0: version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== dependencies: abab "^2.0.5" @@ -9597,32 +9459,32 @@ jsdom@^16.4.0: jsesc@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz" integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" + resolved "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz" integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== dependencies: "@metamask/safe-event-emitter" "^2.0.0" @@ -9630,7 +9492,7 @@ json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0: json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: version "3.8.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" + resolved "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz" integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== dependencies: async "^2.0.1" @@ -9642,7 +9504,7 @@ json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: json-rpc-engine@^5.1.3, json-rpc-engine@^5.3.0: version "5.4.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" + resolved "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz" integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g== dependencies: eth-rpc-errors "^3.0.0" @@ -9650,82 +9512,82 @@ json-rpc-engine@^5.1.3, json-rpc-engine@^5.3.0: json-rpc-error@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" + resolved "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz" integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI= dependencies: inherits "^2.0.1" json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" + resolved "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz" integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-schema@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json-stable-stringify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + resolved "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= dependencies: jsonify "~0.0.0" json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json3@^3.3.2: version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + resolved "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== json5@^0.5.1: version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + resolved "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= json5@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== dependencies: minimist "^1.2.0" json5@^2.1.2: version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -9734,12 +9596,12 @@ jsonfile@^6.0.1: jsonify@~0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsprim@^1.2.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" @@ -9749,7 +9611,7 @@ jsprim@^1.2.2: "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz" integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== dependencies: array-includes "^3.1.3" @@ -9757,7 +9619,7 @@ jsprim@^1.2.2: keccak256@^1.0.0: version "1.0.6" - resolved "https://registry.yarnpkg.com/keccak256/-/keccak256-1.0.6.tgz#dd32fb771558fed51ce4e45a035ae7515573da58" + resolved "https://registry.npmjs.org/keccak256/-/keccak256-1.0.6.tgz" integrity sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw== dependencies: bn.js "^5.2.0" @@ -9766,7 +9628,7 @@ keccak256@^1.0.0: keccak@^1.0.2: version "1.4.0" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" + resolved "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz" integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw== dependencies: bindings "^1.2.1" @@ -9776,7 +9638,7 @@ keccak@^1.0.2: keccak@^3.0.0, keccak@^3.0.1, keccak@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz" integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== dependencies: node-addon-api "^2.0.0" @@ -9785,63 +9647,63 @@ keccak@^3.0.0, keccak@^3.0.1, keccak@^3.0.2: keyvaluestorage-interface@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" + resolved "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz" integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== killable@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + resolved "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz" integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== klona@^2.0.4: version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== language-subtag-registry@~0.3.2: version "0.3.21" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz" integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== language-tags@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= dependencies: language-subtag-registry "~0.3.2" last-call-webpack-plugin@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + resolved "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz" integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== dependencies: lodash "^4.17.5" @@ -9849,26 +9711,26 @@ last-call-webpack-plugin@^3.0.0: level-codec@~7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" + resolved "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz" integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== level-errors@^1.0.3: version "1.1.2" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" + resolved "https://registry.npmjs.org/level-errors/-/level-errors-1.1.2.tgz" integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w== dependencies: errno "~0.1.1" level-errors@~1.0.3: version "1.0.5" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" + resolved "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz" integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== dependencies: errno "~0.1.1" level-iterator-stream@~1.3.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" + resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz" integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0= dependencies: inherits "^2.0.1" @@ -9878,7 +9740,7 @@ level-iterator-stream@~1.3.0: level-ws@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" + resolved "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz" integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos= dependencies: readable-stream "~1.0.15" @@ -9886,7 +9748,7 @@ level-ws@0.0.0: levelup@^1.2.1: version "1.3.9" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" + resolved "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz" integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== dependencies: deferred-leveldown "~1.2.1" @@ -9899,12 +9761,12 @@ levelup@^1.2.1: leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -9912,7 +9774,7 @@ levn@^0.4.1: levn@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" @@ -9920,23 +9782,12 @@ levn@~0.3.0: lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - load-json-file@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= dependencies: graceful-fs "^4.1.2" @@ -9946,12 +9797,12 @@ load-json-file@^4.0.0: loader-runner@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== loader-utils@1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== dependencies: big.js "^5.2.2" @@ -9960,7 +9811,7 @@ loader-utils@1.2.3: loader-utils@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz" integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== dependencies: big.js "^5.2.2" @@ -9969,7 +9820,7 @@ loader-utils@2.0.0: loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== dependencies: big.js "^5.2.2" @@ -9978,7 +9829,7 @@ loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: loader-utils@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz" integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== dependencies: big.js "^5.2.2" @@ -9987,7 +9838,7 @@ loader-utils@^2.0.0: locate-path@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" @@ -9995,7 +9846,7 @@ locate-path@^2.0.0: locate-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" @@ -10003,34 +9854,34 @@ locate-path@^3.0.0: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" lodash._reinterpolate@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= lodash.memoize@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.template@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + resolved "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz" integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== dependencies: lodash._reinterpolate "^3.0.0" @@ -10038,41 +9889,41 @@ lodash.template@^4.5.0: lodash.templatesettings@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + resolved "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz" integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== dependencies: lodash._reinterpolate "^3.0.0" lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= lodash.uniq@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.10: +"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loglevel@^1.6.8: version "1.8.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" + resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz" integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" loud-rejection@^1.0.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + resolved "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz" integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" @@ -10080,53 +9931,45 @@ loud-rejection@^1.0.0: lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" ltgt@~2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz" integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= lz-string@^1.4.4: version "1.4.4" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz" integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== dependencies: sourcemap-codec "^1.4.4" make-dir@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: pify "^4.0.1" @@ -10134,48 +9977,48 @@ make-dir@^2.0.0: make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== makeerror@1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" map-cache@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -map-obj@^1.0.0, map-obj@^1.0.1: +map-obj@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-obj@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz" integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= map-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" @@ -10184,22 +10027,22 @@ md5.js@^1.3.4: mdn-data@2.0.14: version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== mdn-data@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= memdown@^1.0.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" + resolved "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz" integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= dependencies: abstract-leveldown "~2.7.1" @@ -10211,7 +10054,7 @@ memdown@^1.0.0: memory-fs@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz" integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= dependencies: errno "^0.1.3" @@ -10219,31 +10062,15 @@ memory-fs@^0.4.1: memory-fs@^0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz" integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== dependencies: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - meow@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + resolved "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz" integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== dependencies: camelcase-keys "^4.0.0" @@ -10258,22 +10085,22 @@ meow@^5.0.0: merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" + resolved "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz" integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== dependencies: async "^1.4.2" @@ -10287,22 +10114,22 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: mersenne-twister@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz#f916618ee43d7179efcf641bec4531eb9670978a" + resolved "https://registry.npmjs.org/mersenne-twister/-/mersenne-twister-1.1.0.tgz" integrity sha1-+RZhjuQ9cXnvz2Qb7EUx65Zwl4o= methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= microevent.ts@~0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + resolved "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz" integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" @@ -10321,7 +10148,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" @@ -10329,7 +10156,7 @@ micromatch@^4.0.2, micromatch@^4.0.4: miller-rabin@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" @@ -10337,51 +10164,51 @@ miller-rabin@^4.0.0: mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz" integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: mime-db "1.51.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.4.4: version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-response@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== min-document@^2.19.0: version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= dependencies: dom-walk "^0.1.0" min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-create-react-context@^0.4.0: version "0.4.1" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + resolved "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz" integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== dependencies: "@babel/runtime" "^7.12.1" @@ -10389,7 +10216,7 @@ mini-create-react-context@^0.4.0: mini-css-extract-plugin@0.11.3: version "0.11.3" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz#15b0910a7f32e62ffde4a7430cfefbd700724ea6" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz" integrity sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA== dependencies: loader-utils "^1.1.0" @@ -10399,65 +10226,65 @@ mini-css-extract-plugin@0.11.3: minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist-options@^3.0.1: version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz" integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== dependencies: arrify "^1.0.1" is-plain-obj "^1.1.0" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== minipass-collect@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== dependencies: minipass "^3.0.0" minipass-flush@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== dependencies: minipass "^3.0.0" minipass-pipeline@^1.2.2: version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== dependencies: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: version "3.1.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz" integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== dependencies: yallist "^4.0.0" minizlib@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" @@ -10465,7 +10292,7 @@ minizlib@^2.1.1: mississippi@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + resolved "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz" integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== dependencies: concat-stream "^1.5.0" @@ -10481,27 +10308,27 @@ mississippi@^3.0.0: mixin-deep@^1.2.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== move-concurrently@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + resolved "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz" integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= dependencies: aproba "^1.1.1" @@ -10513,32 +10340,32 @@ move-concurrently@^1.0.1: mri@^1.1.5: version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" 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" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3, ms@^2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multicast-dns-service-types@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + resolved "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz" integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= multicast-dns@^6.0.1: version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz" integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== dependencies: dns-packet "^1.3.1" @@ -10546,7 +10373,7 @@ multicast-dns@^6.0.1: multimatch@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" + resolved "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz" integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== dependencies: "@types/minimatch" "^3.0.3" @@ -10555,19 +10382,19 @@ multimatch@^4.0.0: arrify "^2.0.1" minimatch "^3.0.4" -nan@^2.12.1, nan@^2.13.2, nan@^2.14.0, nan@^2.2.1: +nan@^2.12.1, nan@^2.14.0, nan@^2.2.1: version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + resolved "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== nanoid@^3.1.30: version "3.1.31" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.31.tgz#f5b58a1ce1b7604da5f0605757840598d8974dc6" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.31.tgz" integrity sha512-ZivnJm0o9bb13p2Ot5CpgC2rQdzB9Uxm/mFZweqm5eMViqOJe3PV6LU2E30SiLgheesmcPrjquqraoolONSA0A== nanomatch@^1.2.9: version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" @@ -10584,39 +10411,39 @@ nanomatch@^1.2.9: native-url@^0.2.6: version "0.2.6" - resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.2.6.tgz#ca1258f5ace169c716ff44eccbddb674e10399ae" + resolved "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz" integrity sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA== dependencies: querystring "^0.2.0" natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= negotiator@0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== next-tick@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= nice-try@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== no-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" @@ -10624,24 +10451,24 @@ no-case@^3.0.4: node-addon-api@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== node-fetch@2.6.1: version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.6" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz" integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== dependencies: whatwg-url "^5.0.0" node-fetch@~1.7.1: version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz" integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" @@ -10649,40 +10476,22 @@ node-fetch@~1.7.1: node-forge@^0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== node-gyp-build@^4.2.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz" integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== -node-gyp@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-libs-browser@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + resolved "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz" integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" @@ -10711,7 +10520,7 @@ node-libs-browser@^2.2.1: node-notifier@^8.0.0: version "8.0.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" + resolved "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz" integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== dependencies: growly "^1.3.0" @@ -10723,54 +10532,24 @@ node-notifier@^8.0.0: node-releases@^1.1.61: version "1.1.77" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz" integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== node-releases@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz" integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== -node-sass@^4.14.1: - version "4.14.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" - integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash "^4.17.15" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.13.2" - node-gyp "^3.8.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "2.2.5" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - -"nopt@2 || 3": - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - normalize-hex@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/normalize-hex/-/normalize-hex-0.0.2.tgz#5491c43759db2f06b7168d8419f4925c271ab27e" + resolved "https://registry.npmjs.org/normalize-hex/-/normalize-hex-0.0.2.tgz" integrity sha512-E2dx7XJQnjsm6SkS4G6GGvIXRHaLeWAZE2D2N3aia+OpIif2UT8y4S0KCjrX3WmFDSeFnlNOp0FSHFjLeJ4SJw== dependencies: bn.js "^4.11.8" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -10780,24 +10559,24 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package- normalize-path@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= normalize-url@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz" integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= dependencies: object-assign "^4.0.1" @@ -10807,60 +10586,45 @@ normalize-url@1.9.1: normalize-url@^3.0.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== npm-run-path@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" npm-run-path@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - nth-check@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== dependencies: boolbase "~1.0.0" nth-check@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz" integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== dependencies: boolbase "^1.0.0" num2fraction@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + resolved "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz" integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - number-to-bn@1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= dependencies: bn.js "4.11.6" @@ -10868,22 +10632,22 @@ number-to-bn@1.7.0: nwsapi@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== oauth-sign@~0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-copy@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" @@ -10892,17 +10656,17 @@ object-copy@^0.1.0: object-inspect@^1.11.0, object-inspect@^1.9.0: version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== object-inspect@~1.11.0: version "1.11.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.1.tgz#d4bd7d7de54b9a75599f59a00bd698c1f1c6549b" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz" integrity sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA== object-is@^1.0.1: version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: call-bind "^1.0.2" @@ -10910,24 +10674,24 @@ object-is@^1.0.1: object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object-keys@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= object-visit@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: call-bind "^1.0.0" @@ -10937,7 +10701,7 @@ object.assign@^4.1.0, object.assign@^4.1.2: object.entries@^1.1.0, object.entries@^1.1.2, object.entries@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz" integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== dependencies: call-bind "^1.0.2" @@ -10946,7 +10710,7 @@ object.entries@^1.1.0, object.entries@^1.1.2, object.entries@^1.1.5: object.fromentries@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz" integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== dependencies: call-bind "^1.0.2" @@ -10955,7 +10719,7 @@ object.fromentries@^2.0.5: object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: version "2.1.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz" integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== dependencies: call-bind "^1.0.2" @@ -10964,7 +10728,7 @@ object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0 object.hasown@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz" integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== dependencies: define-properties "^1.1.3" @@ -10972,14 +10736,14 @@ object.hasown@^1.1.0: object.pick@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" object.values@^1.1.0, object.values@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz" integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: call-bind "^1.0.2" @@ -10988,38 +10752,38 @@ object.values@^1.1.0, object.values@^1.1.5: obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== on-finished@~2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" on-headers@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" open@^7.0.2: version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz" integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== dependencies: is-docker "^2.0.0" @@ -11027,14 +10791,14 @@ open@^7.0.2: opn@^5.5.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + resolved "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz" integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== dependencies: is-wsl "^1.1.0" optimism@^0.16.1: version "0.16.1" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" + resolved "https://registry.npmjs.org/optimism/-/optimism-0.16.1.tgz" integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== dependencies: "@wry/context" "^0.6.0" @@ -11042,7 +10806,7 @@ optimism@^0.16.1: optimize-css-assets-webpack-plugin@5.0.4: version "5.0.4" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" + resolved "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz" integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== dependencies: cssnano "^4.1.10" @@ -11050,7 +10814,7 @@ optimize-css-assets-webpack-plugin@5.0.4: optionator@^0.8.1: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -11062,7 +10826,7 @@ optionator@^0.8.1: optionator@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -11074,123 +10838,115 @@ optionator@^0.9.1: original@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + resolved "https://registry.npmjs.org/original/-/original-1.0.2.tgz" integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== dependencies: url-parse "^1.4.3" os-browserify@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= os-homedir@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - p-each-series@^2.1.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" + resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz" integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== p-finally@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-limit@^1.1.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" p-locate@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-map@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-retry@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz" integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== dependencies: retry "^0.12.0" p-try@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@~1.0.5: version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parallel-transform@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + resolved "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz" integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== dependencies: cyclist "^1.0.1" @@ -11199,7 +10955,7 @@ parallel-transform@^1.1.0: param-case@^3.0.3: version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: dot-case "^3.0.4" @@ -11207,14 +10963,14 @@ param-case@^3.0.3: parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== dependencies: asn1.js "^5.2.0" @@ -11225,19 +10981,12 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: parse-headers@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.4.tgz#9eaf2d02bed2d1eff494331ce3df36d7924760bf" + resolved "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.4.tgz" integrity sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw== -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: error-ex "^1.3.1" @@ -11245,7 +10994,7 @@ parse-json@^4.0.0: parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -11255,17 +11004,17 @@ parse-json@^5.0.0: parse5@6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascal-case@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: no-case "^3.0.4" @@ -11273,97 +11022,81 @@ pascal-case@^3.1.2: pascalcase@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= path-browserify@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-dirname@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + resolved "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-to-regexp@^1.7.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== dependencies: isarray "0.0.1" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.17, pbkdf2@^3.0.3: version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" @@ -11374,114 +11107,114 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3: penpal@3.0.7: version "3.0.7" - resolved "https://registry.yarnpkg.com/penpal/-/penpal-3.0.7.tgz#d252711ed93b30f1d867eb82342785b3a95f5f75" + resolved "https://registry.npmjs.org/penpal/-/penpal-3.0.7.tgz" integrity sha512-WSXiq5HnEvzvY05SHhaXcsviUmCvh4Ze8AiIZzvmdzaaYAAx4rx8c6Xq6+MaVDG/Nfve3VmGD8HyRP3CkPvPbQ== penpal@4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/penpal/-/penpal-4.1.1.tgz#c96ccfdac441682acf617f6dcbc177a614e8302b" + resolved "https://registry.npmjs.org/penpal/-/penpal-4.1.1.tgz" integrity sha512-6d1f8khVLyBz3DnhLztbfjJ7+ANxdXRM2l6awpnCdEtbrmse4AGTsELOvGuNY0SU7xZw7heGbP6IikVvaVTOWw== performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= picocolors@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@4.0.1, pify@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pify@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pify@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + resolved "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz" integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== pinkie-promise@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pirates@^4.0.1: version "4.0.4" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.4.tgz#07df81e61028e402735cdd49db701e4885b4e6e6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz" integrity sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw== pkg-dir@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== dependencies: find-up "^3.0.0" pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" pkg-up@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== dependencies: find-up "^3.0.0" pngjs@^3.3.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + resolved "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== pnp-webpack-plugin@1.6.4: version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + resolved "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz" integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== dependencies: ts-pnp "^1.1.6" pocket-js-core@0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/pocket-js-core/-/pocket-js-core-0.0.3.tgz#1ab278b9a6a5775e2bdc3c2c2e218057774061e4" + resolved "https://registry.npmjs.org/pocket-js-core/-/pocket-js-core-0.0.3.tgz" integrity sha512-OUTEvEVutdjLT6YyldvAlSebpBueUUWg2XKxGNt5u3QqrmLpBOOBmdDnGMNJ+lEwXtko+JqgwFq+HTi4g1QDVg== dependencies: axios "^0.18.0" portfinder@^1.0.26: version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz" integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== dependencies: async "^2.6.2" @@ -11490,12 +11223,12 @@ portfinder@^1.0.26: posix-character-classes@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postcss-attribute-case-insensitive@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz" integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== dependencies: postcss "^7.0.2" @@ -11503,14 +11236,14 @@ postcss-attribute-case-insensitive@^4.0.1: postcss-browser-comments@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" + resolved "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz" integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== dependencies: postcss "^7" postcss-calc@^7.0.1: version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz" integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== dependencies: postcss "^7.0.27" @@ -11519,7 +11252,7 @@ postcss-calc@^7.0.1: postcss-color-functional-notation@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz" integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== dependencies: postcss "^7.0.2" @@ -11527,7 +11260,7 @@ postcss-color-functional-notation@^2.0.1: postcss-color-gray@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + resolved "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz" integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== dependencies: "@csstools/convert-colors" "^1.4.0" @@ -11536,7 +11269,7 @@ postcss-color-gray@^5.0.0: postcss-color-hex-alpha@^5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + resolved "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz" integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== dependencies: postcss "^7.0.14" @@ -11544,7 +11277,7 @@ postcss-color-hex-alpha@^5.0.3: postcss-color-mod-function@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + resolved "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz" integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== dependencies: "@csstools/convert-colors" "^1.4.0" @@ -11553,7 +11286,7 @@ postcss-color-mod-function@^3.0.3: postcss-color-rebeccapurple@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + resolved "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz" integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== dependencies: postcss "^7.0.2" @@ -11561,7 +11294,7 @@ postcss-color-rebeccapurple@^4.0.1: postcss-colormin@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz" integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== dependencies: browserslist "^4.0.0" @@ -11572,7 +11305,7 @@ postcss-colormin@^4.0.3: postcss-convert-values@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz" integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== dependencies: postcss "^7.0.0" @@ -11580,14 +11313,14 @@ postcss-convert-values@^4.0.1: postcss-custom-media@^7.0.8: version "7.0.8" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz" integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== dependencies: postcss "^7.0.14" postcss-custom-properties@^8.0.11: version "8.0.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz" integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== dependencies: postcss "^7.0.17" @@ -11595,7 +11328,7 @@ postcss-custom-properties@^8.0.11: postcss-custom-selectors@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + resolved "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz" integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== dependencies: postcss "^7.0.2" @@ -11603,7 +11336,7 @@ postcss-custom-selectors@^5.1.2: postcss-dir-pseudo-class@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + resolved "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz" integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== dependencies: postcss "^7.0.2" @@ -11611,35 +11344,35 @@ postcss-dir-pseudo-class@^5.0.0: postcss-discard-comments@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz" integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== dependencies: postcss "^7.0.0" postcss-discard-duplicates@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz" integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== dependencies: postcss "^7.0.0" postcss-discard-empty@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz" integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== dependencies: postcss "^7.0.0" postcss-discard-overridden@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz" integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== dependencies: postcss "^7.0.0" postcss-double-position-gradients@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz" integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== dependencies: postcss "^7.0.5" @@ -11647,7 +11380,7 @@ postcss-double-position-gradients@^1.0.0: postcss-env-function@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + resolved "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz" integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== dependencies: postcss "^7.0.2" @@ -11655,42 +11388,42 @@ postcss-env-function@^2.0.2: postcss-flexbugs-fixes@4.2.1: version "4.2.1" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" + resolved "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz" integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== dependencies: postcss "^7.0.26" postcss-focus-visible@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + resolved "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz" integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== dependencies: postcss "^7.0.2" postcss-focus-within@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + resolved "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz" integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== dependencies: postcss "^7.0.2" postcss-font-variant@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + resolved "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz" integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== dependencies: postcss "^7.0.2" postcss-gap-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + resolved "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz" integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== dependencies: postcss "^7.0.2" postcss-image-set-function@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + resolved "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz" integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== dependencies: postcss "^7.0.2" @@ -11698,14 +11431,14 @@ postcss-image-set-function@^3.0.1: postcss-initial@^3.0.0: version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" + resolved "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz" integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== dependencies: postcss "^7.0.2" postcss-lab-function@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz" integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== dependencies: "@csstools/convert-colors" "^1.4.0" @@ -11714,7 +11447,7 @@ postcss-lab-function@^2.0.1: postcss-load-config@^2.0.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz" integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== dependencies: cosmiconfig "^5.0.0" @@ -11722,7 +11455,7 @@ postcss-load-config@^2.0.0: postcss-loader@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz" integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== dependencies: loader-utils "^1.1.0" @@ -11732,21 +11465,21 @@ postcss-loader@3.0.0: postcss-logical@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz" integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== dependencies: postcss "^7.0.2" postcss-media-minmax@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + resolved "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz" integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== dependencies: postcss "^7.0.2" postcss-merge-longhand@^4.0.11: version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz" integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== dependencies: css-color-names "0.0.4" @@ -11756,7 +11489,7 @@ postcss-merge-longhand@^4.0.11: postcss-merge-rules@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz" integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== dependencies: browserslist "^4.0.0" @@ -11768,7 +11501,7 @@ postcss-merge-rules@^4.0.3: postcss-minify-font-values@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz" integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== dependencies: postcss "^7.0.0" @@ -11776,7 +11509,7 @@ postcss-minify-font-values@^4.0.2: postcss-minify-gradients@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz" integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== dependencies: cssnano-util-get-arguments "^4.0.0" @@ -11786,7 +11519,7 @@ postcss-minify-gradients@^4.0.2: postcss-minify-params@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz" integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== dependencies: alphanum-sort "^1.0.0" @@ -11798,7 +11531,7 @@ postcss-minify-params@^4.0.2: postcss-minify-selectors@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz" integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== dependencies: alphanum-sort "^1.0.0" @@ -11808,14 +11541,14 @@ postcss-minify-selectors@^4.0.2: postcss-modules-extract-imports@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz" integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== dependencies: postcss "^7.0.5" postcss-modules-local-by-default@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz" integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== dependencies: icss-utils "^4.1.1" @@ -11825,7 +11558,7 @@ postcss-modules-local-by-default@^3.0.3: postcss-modules-scope@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz" integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== dependencies: postcss "^7.0.6" @@ -11833,7 +11566,7 @@ postcss-modules-scope@^2.2.0: postcss-modules-values@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz" integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== dependencies: icss-utils "^4.0.0" @@ -11841,21 +11574,21 @@ postcss-modules-values@^3.0.0: postcss-nesting@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz" integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== dependencies: postcss "^7.0.2" postcss-normalize-charset@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz" integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== dependencies: postcss "^7.0.0" postcss-normalize-display-values@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz" integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== dependencies: cssnano-util-get-match "^4.0.0" @@ -11864,7 +11597,7 @@ postcss-normalize-display-values@^4.0.2: postcss-normalize-positions@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz" integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== dependencies: cssnano-util-get-arguments "^4.0.0" @@ -11874,7 +11607,7 @@ postcss-normalize-positions@^4.0.2: postcss-normalize-repeat-style@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz" integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== dependencies: cssnano-util-get-arguments "^4.0.0" @@ -11884,7 +11617,7 @@ postcss-normalize-repeat-style@^4.0.2: postcss-normalize-string@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz" integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== dependencies: has "^1.0.0" @@ -11893,7 +11626,7 @@ postcss-normalize-string@^4.0.2: postcss-normalize-timing-functions@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz" integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== dependencies: cssnano-util-get-match "^4.0.0" @@ -11902,7 +11635,7 @@ postcss-normalize-timing-functions@^4.0.2: postcss-normalize-unicode@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz" integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== dependencies: browserslist "^4.0.0" @@ -11911,7 +11644,7 @@ postcss-normalize-unicode@^4.0.1: postcss-normalize-url@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz" integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== dependencies: is-absolute-url "^2.0.0" @@ -11921,7 +11654,7 @@ postcss-normalize-url@^4.0.1: postcss-normalize-whitespace@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz" integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== dependencies: postcss "^7.0.0" @@ -11929,7 +11662,7 @@ postcss-normalize-whitespace@^4.0.2: postcss-normalize@8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" + resolved "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz" integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== dependencies: "@csstools/normalize.css" "^10.1.0" @@ -11940,7 +11673,7 @@ postcss-normalize@8.0.1: postcss-ordered-values@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz" integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== dependencies: cssnano-util-get-arguments "^4.0.0" @@ -11949,21 +11682,21 @@ postcss-ordered-values@^4.1.2: postcss-overflow-shorthand@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz" integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== dependencies: postcss "^7.0.2" postcss-page-break@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + resolved "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz" integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== dependencies: postcss "^7.0.2" postcss-place@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + resolved "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz" integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== dependencies: postcss "^7.0.2" @@ -11971,7 +11704,7 @@ postcss-place@^4.0.1: postcss-preset-env@6.7.0: version "6.7.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz" integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== dependencies: autoprefixer "^9.6.1" @@ -12014,7 +11747,7 @@ postcss-preset-env@6.7.0: postcss-pseudo-class-any-link@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz" integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== dependencies: postcss "^7.0.2" @@ -12022,7 +11755,7 @@ postcss-pseudo-class-any-link@^6.0.0: postcss-reduce-initial@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz" integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== dependencies: browserslist "^4.0.0" @@ -12032,7 +11765,7 @@ postcss-reduce-initial@^4.0.3: postcss-reduce-transforms@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz" integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== dependencies: cssnano-util-get-match "^4.0.0" @@ -12042,21 +11775,21 @@ postcss-reduce-transforms@^4.0.2: postcss-replace-overflow-wrap@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + resolved "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz" integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== dependencies: postcss "^7.0.2" postcss-safe-parser@5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz#459dd27df6bc2ba64608824ba39e45dacf5e852d" + resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz" integrity sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ== dependencies: postcss "^8.1.0" postcss-selector-matches@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + resolved "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz" integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== dependencies: balanced-match "^1.0.0" @@ -12064,7 +11797,7 @@ postcss-selector-matches@^4.0.0: postcss-selector-not@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz" integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== dependencies: balanced-match "^1.0.0" @@ -12072,7 +11805,7 @@ postcss-selector-not@^4.0.0: postcss-selector-parser@^3.0.0: version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz" integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== dependencies: dot-prop "^5.2.0" @@ -12081,7 +11814,7 @@ postcss-selector-parser@^3.0.0: postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz" integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== dependencies: cssesc "^2.0.0" @@ -12090,7 +11823,7 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: version "6.0.8" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz#f023ed7a9ea736cd7ef70342996e8e78645a7914" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz" integrity sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ== dependencies: cssesc "^3.0.0" @@ -12098,7 +11831,7 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: postcss-svgo@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz" integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== dependencies: postcss "^7.0.0" @@ -12107,7 +11840,7 @@ postcss-svgo@^4.0.3: postcss-unique-selectors@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz" integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== dependencies: alphanum-sort "^1.0.0" @@ -12116,17 +11849,17 @@ postcss-unique-selectors@^4.0.1: postcss-value-parser@^3.0.0: version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + resolved "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz" integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== dependencies: flatten "^1.0.2" @@ -12135,7 +11868,7 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: postcss@7.0.36: version "7.0.36" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz" integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== dependencies: chalk "^2.4.2" @@ -12144,7 +11877,7 @@ postcss@7.0.36: postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== dependencies: picocolors "^0.2.1" @@ -12152,7 +11885,7 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po postcss@^8.1.0: version "8.4.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz" integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== dependencies: nanoid "^3.1.30" @@ -12161,54 +11894,54 @@ postcss@^8.1.0: preact@10.4.1: version "10.4.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" + resolved "https://registry.npmjs.org/preact/-/preact-10.4.1.tgz" integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== preact@^10.5.9: version "10.6.4" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.6.4.tgz#ad12c409ff1b4316158486e0a7b8d43636f7ced8" + resolved "https://registry.npmjs.org/preact/-/preact-10.6.4.tgz" integrity sha512-WyosM7pxGcndU8hY0OQlLd54tOU+qmG45QXj2dAYrL11HoyU/EzOSTlpJsirbBr1QW7lICxSsVJJmcmUglovHQ== precond@0.2: version "0.2.3" - resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" + resolved "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz" integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= prepend-http@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" prettier@^2.1.2: version "2.5.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz" integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== pretty-bytes@^5.3.0: version "5.6.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== pretty-error@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz" integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== dependencies: lodash "^4.17.20" @@ -12216,7 +11949,7 @@ pretty-error@^2.1.1: pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz" integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== dependencies: "@jest/types" "^26.6.2" @@ -12226,7 +11959,7 @@ pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: pretty-format@^27.0.0, pretty-format@^27.4.6: version "27.4.6" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.6.tgz#1b784d2f53c68db31797b2348fa39b49e31846b7" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz" integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g== dependencies: ansi-regex "^5.0.1" @@ -12235,7 +11968,7 @@ pretty-format@^27.0.0, pretty-format@^27.4.6: pretty-quick@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.0.tgz#cb172e9086deb57455dea7c7e8f136cd0a4aef6c" + resolved "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.0.tgz" integrity sha512-DtxIxksaUWCgPFN7E1ZZk4+Aav3CCuRdhrDSFZENb404sYMtuo9Zka823F+Mgeyt8Zt3bUiCjFzzWYE9LYqkmQ== dependencies: chalk "^3.0.0" @@ -12247,32 +11980,32 @@ pretty-quick@3.1.0: private@^0.1.6, private@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@^0.11.10: version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= progress@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== promise-inflight@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= promise-to-callback@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" + resolved "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz" integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= dependencies: is-fn "^1.0.0" @@ -12280,14 +12013,14 @@ promise-to-callback@^1.0.0: promise@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + resolved "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz" integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== dependencies: asap "~2.0.6" prompts@2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz" integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== dependencies: kleur "^3.0.3" @@ -12295,7 +12028,7 @@ prompts@2.4.0: prompts@^2.0.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -12303,7 +12036,7 @@ prompts@^2.0.1: prop-types-extra@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" + resolved "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz" integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== dependencies: react-is "^16.3.2" @@ -12311,7 +12044,7 @@ prop-types-extra@^1.1.0: prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -12320,7 +12053,7 @@ prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2: proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -12328,22 +12061,17 @@ proxy-addr@~2.0.7: prr@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - psl@^1.1.28, psl@^1.1.33: version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== public-encrypt@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" @@ -12355,7 +12083,7 @@ public-encrypt@^4.0.0: pump@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + resolved "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz" integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== dependencies: end-of-stream "^1.1.0" @@ -12363,7 +12091,7 @@ pump@^2.0.0: pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -12371,7 +12099,7 @@ pump@^3.0.0: pumpify@^1.3.3: version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + resolved "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz" integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== dependencies: duplexify "^3.6.0" @@ -12380,27 +12108,27 @@ pumpify@^1.3.3: punycode@1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= punycode@^1.2.4: version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== q@^1.1.2: version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= qrcode@1.4.4: version "1.4.4" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" + resolved "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz" integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q== dependencies: buffer "^5.4.3" @@ -12413,17 +12141,17 @@ qrcode@1.4.4: qs@6.9.6: version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + resolved "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz" integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== qs@~6.5.2: version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== query-string@6.13.5: version "6.13.5" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" + resolved "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz" integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q== dependencies: decode-uri-component "^0.2.0" @@ -12432,7 +12160,7 @@ query-string@6.13.5: query-string@^4.1.0: version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + resolved "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz" integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= dependencies: object-assign "^4.1.0" @@ -12440,7 +12168,7 @@ query-string@^4.1.0: query-string@^5.0.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + resolved "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz" integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== dependencies: decode-uri-component "^0.2.0" @@ -12449,51 +12177,51 @@ query-string@^5.0.1: querystring-es3@^0.2.0: version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= querystring@^0.2.0: version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz" integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== querystringify@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quick-lru@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz" integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= raf@^3.4.1: version "3.4.1" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: performance-now "^2.1.0" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" @@ -12501,17 +12229,17 @@ randomfill@^1.0.3: randomhex@0.1.5: version "0.1.5" - resolved "https://registry.yarnpkg.com/randomhex/-/randomhex-0.1.5.tgz#baceef982329091400f2a2912c6cd02f1094f585" + resolved "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz" integrity sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU= range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz" integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== dependencies: bytes "3.1.1" @@ -12521,7 +12249,7 @@ raw-body@2.4.2: react-app-polyfill@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz#a0bea50f078b8a082970a9d853dc34b6dcc6a3cf" + resolved "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz" integrity sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA== dependencies: core-js "^3.6.5" @@ -12533,14 +12261,14 @@ react-app-polyfill@^2.0.0: react-blockies@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/react-blockies/-/react-blockies-1.4.1.tgz#d4f0faf95ac197213a297a370a4d7f77ea3d0b08" + resolved "https://registry.npmjs.org/react-blockies/-/react-blockies-1.4.1.tgz" integrity sha512-4N015X5oPNnD3xQPsiqolOFzPZSSWyc5mJhJUZShUCHtiGUxVN+1qsWTcglkHMNySux9hUofaispqcw9QkWP5Q== dependencies: prop-types "^15.5.10" react-bootstrap@^1.4.0: version "1.6.4" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-1.6.4.tgz#94d5d2422e26bba277656d3529128e14f838b7ca" + resolved "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.6.4.tgz" integrity sha512-z3BhBD4bEZuLP8VrYqAD7OT7axdcSkkyvWBWnS2U/4MhyabUihrUyucPWkan7aMI1XIHbmH4LCpEtzWGfx/yfA== dependencies: "@babel/runtime" "^7.14.0" @@ -12563,7 +12291,7 @@ react-bootstrap@^1.4.0: react-dev-utils@^11.0.0: version "11.0.4" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" + resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz" integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== dependencies: "@babel/code-frame" "7.10.4" @@ -12593,7 +12321,7 @@ react-dev-utils@^11.0.0: react-dom@^16.8.6: version "16.14.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz" integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== dependencies: loose-envify "^1.1.0" @@ -12603,7 +12331,7 @@ react-dom@^16.8.6: react-dom@^17.0.1: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== dependencies: loose-envify "^1.1.0" @@ -12612,39 +12340,39 @@ react-dom@^17.0.1: react-error-overlay@^6.0.9: version "6.0.10" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.10.tgz#0fe26db4fa85d9dbb8624729580e90e7159a59a6" + resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz" integrity sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA== react-icons@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.3.1.tgz#2fa92aebbbc71f43d2db2ed1aed07361124e91ca" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz" integrity sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ== react-is@^16.13.1, react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^17.0.1: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-lifecycles-compat@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== react-number-format@^4.4.1: version "4.9.1" - resolved "https://registry.yarnpkg.com/react-number-format/-/react-number-format-4.9.1.tgz#62b3450b43c911f9227e770a8ea9fa606696e52e" + resolved "https://registry.npmjs.org/react-number-format/-/react-number-format-4.9.1.tgz" integrity sha512-v49XqXv7SpwYZKGkghNJjoDUr6lIUozlPLrObcxre7GfcLx7qD4TCvArn3GozN/Y4FVbLyEYCwJoBCiChdBh5A== dependencies: prop-types "^15.7.2" react-overlays@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.1.1.tgz#2e7cf49744b56537c7828ccb94cfc63dd778ae4f" + resolved "https://registry.npmjs.org/react-overlays/-/react-overlays-5.1.1.tgz" integrity sha512-eCN2s2/+GVZzpnId4XVWtvDPYYBD2EtOGP74hE+8yDskPzFy9+pV1H3ZZihxuRdEbQzzacySaaDkR7xE0ydl4Q== dependencies: "@babel/runtime" "^7.13.8" @@ -12658,12 +12386,12 @@ react-overlays@^5.1.1: react-refresh@^0.8.3: version "0.8.3" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz" integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== react-router-dom@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.0.tgz#da1bfb535a0e89a712a93b97dd76f47ad1f32363" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz" integrity sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ== dependencies: "@babel/runtime" "^7.12.13" @@ -12676,7 +12404,7 @@ react-router-dom@^5.2.0: react-router@5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.1.tgz#4d2e4e9d5ae9425091845b8dbc6d9d276239774d" + resolved "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz" integrity sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ== dependencies: "@babel/runtime" "^7.12.13" @@ -12692,7 +12420,7 @@ react-router@5.2.1: react-scripts@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-4.0.0.tgz#36f3d84ffff708ac0618fd61e71eaaea11c26417" + resolved "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.0.tgz" integrity sha512-icJ/ctwV5XwITUOupBP9TUVGdWOqqZ0H08tbJ1kVC5VpNWYzEZ3e/x8axhV15ZXRsixLo27snwQE7B6Zd9J2Tg== dependencies: "@babel/core" "7.12.3" @@ -12757,12 +12485,12 @@ react-scripts@4.0.0: react-swipeable@^6.1.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/react-swipeable/-/react-swipeable-6.2.0.tgz#057271cb7a6fb4af9d2a3f6d80ccdf33e2f64d47" + resolved "https://registry.npmjs.org/react-swipeable/-/react-swipeable-6.2.0.tgz" integrity sha512-nWQ8dEM8e/uswZLSIkXUsAnQmnX4MTcryOHBQIQYRMJFDpgDBSiVbKsz/BZVCIScF4NtJh16oyxwaNOepR6xSw== react-toastify@^6.1.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-6.2.0.tgz#f2d76747c70b9de91f71f253d9feae6b53dc836c" + resolved "https://registry.npmjs.org/react-toastify/-/react-toastify-6.2.0.tgz" integrity sha512-XpjFrcBhQ0/nBOL4syqgP/TywFnOyxmstYLWgSQWcj39qpp+WU4vPt3C/ayIDx7RFyxRWfzWTdR2qOcDGo7G0w== dependencies: clsx "^1.1.1" @@ -12771,7 +12499,7 @@ react-toastify@^6.1.0: react-transition-group@^4.4.1: version "4.4.2" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz" integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== dependencies: "@babel/runtime" "^7.5.5" @@ -12781,7 +12509,7 @@ react-transition-group@^4.4.1: react@^16.8.6: version "16.14.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + resolved "https://registry.npmjs.org/react/-/react-16.14.0.tgz" integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== dependencies: loose-envify "^1.1.0" @@ -12790,23 +12518,15 @@ react@^16.8.6: react@^17.0.1: version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - read-pkg-up@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz" integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= dependencies: find-up "^2.0.0" @@ -12814,25 +12534,16 @@ read-pkg-up@^3.0.0: read-pkg-up@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: find-up "^4.1.0" read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - read-pkg@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= dependencies: load-json-file "^4.0.0" @@ -12841,7 +12552,7 @@ read-pkg@^3.0.0: read-pkg@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: "@types/normalize-package-data" "^2.4.0" @@ -12849,9 +12560,9 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" @@ -12864,7 +12575,7 @@ read-pkg@^5.2.0: readable-stream@^1.0.33: version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= dependencies: core-util-is "~1.0.0" @@ -12874,7 +12585,7 @@ readable-stream@^1.0.33: readable-stream@^3.0.6, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" @@ -12883,7 +12594,7 @@ readable-stream@^3.0.6, readable-stream@^3.5.0, readable-stream@^3.6.0: readable-stream@~1.0.15: version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" @@ -12893,7 +12604,7 @@ readable-stream@~1.0.15: readdirp@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: graceful-fs "^4.1.11" @@ -12902,29 +12613,21 @@ readdirp@^2.2.1: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" recursive-readdir@2.2.2: version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz" integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== dependencies: minimatch "3.0.4" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - redent@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + resolved "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz" integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= dependencies: indent-string "^3.0.0" @@ -12932,7 +12635,7 @@ redent@^2.0.0: redent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" @@ -12940,29 +12643,29 @@ redent@^3.0.0: regenerate-unicode-properties@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz" integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== dependencies: regenerate "^1.4.2" regenerate@^1.2.1, regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.11.0: version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.10.0: version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz" integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== dependencies: babel-runtime "^6.18.0" @@ -12971,14 +12674,14 @@ regenerator-transform@^0.10.0: regenerator-transform@^0.14.2: version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz" integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== dependencies: "@babel/runtime" "^7.8.4" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" @@ -12986,12 +12689,12 @@ regex-not@^1.0.0, regex-not@^1.0.2: regex-parser@^2.2.11: version "2.2.11" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + resolved "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz" integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== dependencies: call-bind "^1.0.2" @@ -12999,12 +12702,12 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: regexpp@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz" integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= dependencies: regenerate "^1.2.1" @@ -13013,7 +12716,7 @@ regexpu-core@^2.0.0: regexpu-core@^4.7.1: version "4.8.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz" integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== dependencies: regenerate "^1.4.2" @@ -13025,41 +12728,41 @@ regexpu-core@^4.7.1: regjsgen@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz" integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsgen@^0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz" integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.1.4: version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz" integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= dependencies: jsesc "~0.5.0" regjsparser@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz" integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== dependencies: jsesc "~0.5.0" relateurl@^0.2.7: version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= remove-trailing-separator@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= renderkid@^2.0.4: version "2.0.7" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz" integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== dependencies: css-select "^4.1.3" @@ -13070,24 +12773,24 @@ renderkid@^2.0.4: repeat-element@^1.1.2: version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.6.1: version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" -request@^2.85.0, request@^2.87.0, request@^2.88.0: +request@^2.85.0: version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" @@ -13113,61 +12816,61 @@ request@^2.85.0, request@^2.87.0, request@^2.88.0: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= resolve-cwd@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz" integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= dependencies: resolve-from "^3.0.0" resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" integrity sha1-six699nWiBvItuZTM17rywoYh0g= resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-pathname@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== resolve-url-loader@^3.1.2: version "3.1.4" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz#3c16caebe0b9faea9c7cc252fa49d2353c412320" + resolved "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz" integrity sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg== dependencies: adjust-sourcemap-loader "3.0.0" @@ -13183,12 +12886,12 @@ resolve-url-loader@^3.1.2: resolve-url@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.18.1: version "1.18.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz" integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== dependencies: is-core-module "^2.0.0" @@ -13196,7 +12899,7 @@ resolve@1.18.1: resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2: version "1.21.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz" integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA== dependencies: is-core-module "^2.8.0" @@ -13205,7 +12908,7 @@ resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.1 resolve@^2.0.0-next.3: version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz" integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== dependencies: is-core-module "^2.2.0" @@ -13213,7 +12916,7 @@ resolve@^2.0.0-next.3: resolve@~1.20.0: version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: is-core-module "^2.2.0" @@ -13221,34 +12924,34 @@ resolve@~1.20.0: resumer@~0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + resolved "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz" integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= dependencies: through "~2.3.4" ret@~0.1.10: version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== retry@^0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rework-visit@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + resolved "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz" integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= rework@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + resolved "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz" integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= dependencies: convert-source-map "^0.3.3" @@ -13256,38 +12959,38 @@ rework@1.0.1: rgb-regex@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + resolved "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz" integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= rgba-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + resolved "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@2.6.3: version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" @@ -13295,14 +12998,14 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: rlp@^2.0.0, rlp@^2.2.3: version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== dependencies: bn.js "^5.2.0" rollup-plugin-babel@^4.3.3: version "4.4.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" + resolved "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz" integrity sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw== dependencies: "@babel/helper-module-imports" "^7.0.0" @@ -13310,7 +13013,7 @@ rollup-plugin-babel@^4.3.3: rollup-plugin-terser@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413" + resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz" integrity sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w== dependencies: "@babel/code-frame" "^7.5.5" @@ -13321,14 +13024,14 @@ rollup-plugin-terser@^5.3.1: rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: version "2.8.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + resolved "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz" integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== dependencies: estree-walker "^0.6.1" rollup@^1.31.1: version "1.32.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" + resolved "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz" integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== dependencies: "@types/estree" "*" @@ -13337,67 +13040,67 @@ rollup@^1.31.1: rsvp@^4.8.4: version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + resolved "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + resolved "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz" integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= dependencies: aproba "^1.1.1" rustbn.js@~0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== rxjs@^6.6.3: version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-buffer@5.2.1, safe-buffer@>=5.1.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.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-event-emitter@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" + resolved "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz" integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== dependencies: events "^3.0.0" safe-regex@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sane@^4.0.3: version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + resolved "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz" integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== dependencies: "@cnakazawa/watch" "^1.0.3" @@ -13412,22 +13115,12 @@ sane@^4.0.3: sanitize.css@^10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" + resolved "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz" integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== -sass-graph@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" - integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^13.3.2" - sass-loader@8.0.2: version "8.0.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz" integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== dependencies: clone-deep "^4.0.1" @@ -13438,7 +13131,7 @@ sass-loader@8.0.2: sass-loader@^10.0.4: version "10.2.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.2.0.tgz#3d64c1590f911013b3fa48a0b22a83d5e1494716" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz" integrity sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw== dependencies: klona "^2.0.4" @@ -13447,10 +13140,10 @@ sass-loader@^10.0.4: schema-utils "^3.0.0" semver "^7.3.2" -sass@^1.27.0: - version "1.47.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.47.0.tgz#c22dd0eed2e4a991430dae0b03c8e694bc41c2b4" - integrity sha512-GtXwvwgD7/6MLUZPnlA5/8cdRgC9SzT5kAnnJMRmEZQFRE3J56Foswig4NyyyQGsnmNvg6EUM/FP0Pe9Y2zywQ== +sass@^1.57.0: + version "1.57.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.57.0.tgz#64c4144ed4e1c0ccb96dc18aef2c424cdbc0c12b" + integrity sha512-IZNEJDTK1cF5B1cGA593TPAV/1S0ysUDxq9XHjX/+SMy0QfUny+nfUsq5ZP7wWSl4eEf7wDJcEZ8ABYFmh3m/w== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -13458,19 +13151,19 @@ sass@^1.27.0: sax@~1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== saxes@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: xmlchars "^2.2.0" scheduler@^0.19.1: version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz" integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== dependencies: loose-envify "^1.1.0" @@ -13478,7 +13171,7 @@ scheduler@^0.19.1: scheduler@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" @@ -13486,7 +13179,7 @@ scheduler@^0.20.2: schema-utils@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz" integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== dependencies: ajv "^6.1.0" @@ -13495,7 +13188,7 @@ schema-utils@^1.0.0: schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7.1: version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: "@types/json-schema" "^7.0.5" @@ -13504,7 +13197,7 @@ schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7 schema-utils@^3.0.0, schema-utils@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: "@types/json-schema" "^7.0.8" @@ -13513,25 +13206,17 @@ schema-utils@^3.0.0, schema-utils@^3.1.1: scrypt-js@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz" integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - secp256k1@^3.0.1, secp256k1@^3.7.1: version "3.8.0" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz" integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== dependencies: bindings "^1.5.0" @@ -13545,7 +13230,7 @@ secp256k1@^3.0.1, secp256k1@^3.7.1: secp256k1@^4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: elliptic "^6.5.4" @@ -13554,61 +13239,56 @@ secp256k1@^4.0.1: select-hose@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= selfsigned@^1.10.7: version "1.10.14" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz" integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA== dependencies: node-forge "^0.10.0" semaphore@>=1.0.1, semaphore@^1.0.3: version "1.1.0" - resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" + resolved "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz" integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== semver@7.3.2: version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= - semver@~5.4.1: version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + resolved "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== send@0.17.2: version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + resolved "https://registry.npmjs.org/send/-/send-0.17.2.tgz" integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== dependencies: debug "2.6.9" @@ -13627,21 +13307,21 @@ send@0.17.2: serialize-javascript@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== dependencies: randombytes "^2.1.0" serialize-javascript@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== dependencies: randombytes "^2.1.0" serve-index@^1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= dependencies: accepts "~1.3.4" @@ -13654,7 +13334,7 @@ serve-index@^1.9.1: serve-static@1.14.2: version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz" integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== dependencies: encodeurl "~1.0.2" @@ -13662,19 +13342,19 @@ serve-static@1.14.2: parseurl "~1.3.3" send "0.17.2" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-immediate-shim@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + resolved "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" @@ -13684,27 +13364,27 @@ set-value@^2.0.0, set-value@^2.0.1: setimmediate@1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz" integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= setprototypeof@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 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" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -13712,53 +13392,53 @@ sha.js@^2.4.0, sha.js@^2.4.8: shallow-clone@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" shallowequal@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@1.7.2: version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== shellwords@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + resolved "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -13767,17 +13447,17 @@ side-channel@^1.0.4: signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.6" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz" integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== simple-concat@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^2.7.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz" integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== dependencies: decompress-response "^3.3.0" @@ -13786,29 +13466,29 @@ simple-get@^2.7.0: simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= dependencies: is-arrayish "^0.3.1" sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + resolved "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz" integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== dependencies: ansi-styles "^3.2.0" @@ -13817,7 +13497,7 @@ slice-ansi@^2.1.0: slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -13826,7 +13506,7 @@ slice-ansi@^4.0.0: snapdragon-node@^2.0.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" @@ -13835,14 +13515,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" @@ -13856,7 +13536,7 @@ snapdragon@^0.8.1: sockjs-client@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + resolved "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz" integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== dependencies: debug "^3.2.5" @@ -13868,7 +13548,7 @@ sockjs-client@1.4.0: sockjs@0.3.20: version "0.3.20" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz" integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== dependencies: faye-websocket "^0.10.0" @@ -13877,24 +13557,29 @@ sockjs@0.3.20: sort-keys@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz" integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= dependencies: is-plain-obj "^1.0.0" source-list-map@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1: +"source-map-js@>=0.6.2 <2.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-js@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz" integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: atob "^2.1.2" @@ -13905,7 +13590,7 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-resolve@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz" integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== dependencies: atob "^2.1.2" @@ -13913,14 +13598,14 @@ source-map-resolve@^0.6.0: source-map-support@^0.4.15: version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz" integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -13928,39 +13613,32 @@ source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.1 source-map-url@^0.4.0: version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" - source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.7.3, source-map@~0.7.2: version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== spdx-correct@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" @@ -13968,12 +13646,12 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" @@ -13981,12 +13659,12 @@ spdx-expression-parse@^3.0.0: spdx-license-ids@^3.0.0: version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz" integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== spdy-transport@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== dependencies: debug "^4.1.0" @@ -13998,7 +13676,7 @@ spdy-transport@^3.0.0: spdy@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" @@ -14009,24 +13687,24 @@ spdy@^4.0.2: split-on-first@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" @@ -14041,38 +13719,38 @@ sshpk@^1.7.0: ssri@^6.0.1: version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + resolved "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz" integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" ssri@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== dependencies: minipass "^3.1.1" stable@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^2.0.2: version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== dependencies: escape-string-regexp "^2.0.0" stackframe@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" + resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz" integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== static-extend@^0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" @@ -14080,24 +13758,17 @@ static-extend@^0.1.1: "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== - dependencies: - readable-stream "^2.0.1" - store@2.0.12: version "2.0.12" - resolved "https://registry.yarnpkg.com/store/-/store-2.0.12.tgz#8c534e2a0b831f72b75fc5f1119857c44ef5d593" + resolved "https://registry.npmjs.org/store/-/store-2.0.12.tgz" integrity sha1-jFNOKguDH3K3X8XxEZhXxE711ZM= stream-browserify@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz" integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" @@ -14105,7 +13776,7 @@ stream-browserify@^2.0.1: stream-browserify@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz" integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== dependencies: inherits "~2.0.4" @@ -14113,7 +13784,7 @@ stream-browserify@^3.0.0: stream-each@^1.1.0: version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + resolved "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz" integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== dependencies: end-of-stream "^1.1.0" @@ -14121,7 +13792,7 @@ stream-each@^1.1.0: stream-http@^2.7.2: version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz" integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" @@ -14132,22 +13803,22 @@ stream-http@^2.7.2: stream-shift@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== strict-uri-encode@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= strict-uri-encode@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz" integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= string-length@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" @@ -14155,39 +13826,30 @@ string-length@^4.0.1: string-natural-compare@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + resolved "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - string.prototype.matchall@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz" integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== dependencies: call-bind "^1.0.2" @@ -14201,7 +13863,7 @@ string.prototype.matchall@^4.0.6: string.prototype.trim@~1.2.4: version "1.2.5" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz#a587bcc8bfad8cb9829a577f5de30dd170c1682c" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz" integrity sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg== dependencies: call-bind "^1.0.2" @@ -14210,7 +13872,7 @@ string.prototype.trim@~1.2.4: string.prototype.trimend@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz" integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: call-bind "^1.0.2" @@ -14218,7 +13880,7 @@ string.prototype.trimend@^1.0.4: string.prototype.trimstart@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz" integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: call-bind "^1.0.2" @@ -14226,26 +13888,26 @@ string.prototype.trimstart@^1.0.4: string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~0.10.x: version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" stringify-object@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: get-own-enumerable-property-symbols "^3.0.0" @@ -14254,52 +13916,45 @@ stringify-object@^3.3.0: strip-ansi@6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== dependencies: ansi-regex "^5.0.0" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-comments@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + resolved "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz" integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== dependencies: babel-extract-comments "^1.0.0" @@ -14307,48 +13962,41 @@ strip-comments@^1.0.2: strip-eof@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-hex-prefix@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= dependencies: is-hex-prefixed "1.0.0" -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - strip-indent@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== style-loader@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz" integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== dependencies: loader-utils "^2.0.0" @@ -14356,7 +14004,7 @@ style-loader@1.3.0: styled-components@^5.3.3: version "5.3.3" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.3.tgz#312a3d9a549f4708f0fb0edc829eb34bde032743" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.3.tgz" integrity sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw== dependencies: "@babel/helper-module-imports" "^7.0.0" @@ -14372,7 +14020,7 @@ styled-components@^5.3.3: stylehacks@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz" integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== dependencies: browserslist "^4.0.0" @@ -14381,40 +14029,40 @@ stylehacks@^4.0.0: supports-color@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz" integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== dependencies: has-flag "^4.0.0" @@ -14422,17 +14070,17 @@ supports-hyperlinks@^2.0.0: supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-parser@^2.0.2: version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== svgo@^1.0.0, svgo@^1.2.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + resolved "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz" integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== dependencies: chalk "^2.4.1" @@ -14451,17 +14099,17 @@ svgo@^1.0.0, svgo@^1.2.2: symbol-observable@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz" integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== table@^5.2.3: version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + resolved "https://registry.npmjs.org/table/-/table-5.4.6.tgz" integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== dependencies: ajv "^6.10.2" @@ -14471,7 +14119,7 @@ table@^5.2.3: table@^6.0.9: version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + resolved "https://registry.npmjs.org/table/-/table-6.8.0.tgz" integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== dependencies: ajv "^8.0.1" @@ -14482,12 +14130,12 @@ table@^6.0.9: tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tape@^4.6.3: version "4.14.0" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.14.0.tgz#e4d46097e129817175b90925f2385f6b1bcfa826" + resolved "https://registry.npmjs.org/tape/-/tape-4.14.0.tgz" integrity sha512-z0+WrUUJuG6wIdWrl4W3rTte2CR26G6qcPOj3w1hfRdcmhF3kHBhOBW9VHsPVAkz08ZmGzp7phVpDupbLzrYKQ== dependencies: call-bind "~1.0.2" @@ -14506,18 +14154,9 @@ tape@^4.6.3: string.prototype.trim "~1.2.4" through "~2.3.8" -tar@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" - integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== - dependencies: - block-stream "*" - fstream "^1.0.12" - inherits "2" - tar@^6.0.2: version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz" integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== dependencies: chownr "^2.0.0" @@ -14529,12 +14168,12 @@ tar@^6.0.2: temp-dir@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz" integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= tempy@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8" + resolved "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz" integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== dependencies: temp-dir "^1.0.0" @@ -14543,7 +14182,7 @@ tempy@^0.3.0: terminal-link@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== dependencies: ansi-escapes "^4.2.1" @@ -14551,7 +14190,7 @@ terminal-link@^2.0.0: terser-webpack-plugin@4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz" integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== dependencies: cacache "^15.0.5" @@ -14566,7 +14205,7 @@ terser-webpack-plugin@4.2.3: terser-webpack-plugin@^1.4.3: version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz" integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== dependencies: cacache "^12.0.2" @@ -14581,7 +14220,7 @@ terser-webpack-plugin@^1.4.3: terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: version "4.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + resolved "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz" integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== dependencies: commander "^2.20.0" @@ -14590,7 +14229,7 @@ terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: terser@^5.3.4: version "5.10.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + resolved "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz" integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== dependencies: commander "^2.20.0" @@ -14599,7 +14238,7 @@ terser@^5.3.4: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -14608,17 +14247,17 @@ test-exclude@^6.0.0: text-table@0.2.0, text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= throat@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + resolved "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== through2@^2.0.0, through2@^2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: readable-stream "~2.3.6" @@ -14626,78 +14265,78 @@ through2@^2.0.0, through2@^2.0.3: through@~2.3.4, through@~2.3.8: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= thunky@^1.0.2: version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== timed-out@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= timers-browserify@^2.0.4: version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: setimmediate "^1.0.4" timsort@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + resolved "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= tiny-invariant@^1.0.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz" integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== tiny-warning@^1.0.0, tiny-warning@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== tmpl@1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-arraybuffer@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= to-fast-properties@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-hex@0.0.11: version "0.0.11" - resolved "https://registry.yarnpkg.com/to-hex/-/to-hex-0.0.11.tgz#22355e09e5b56f5ae2b32502c493320f021171ac" + resolved "https://registry.npmjs.org/to-hex/-/to-hex-0.0.11.tgz" integrity sha512-3FSU8sfjrVc9fWowwP9xrdhxbp5Wco8uVZLhMhfsNuCFo9Fu8ecD2MgJV/2iAw+755W3AcGSQYVZGOpBmJtNcA== dependencies: normalize-hex "0.0.2" to-object-path@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" @@ -14705,14 +14344,14 @@ to-regex-range@^2.1.0: 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" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" @@ -14722,17 +14361,17 @@ to-regex@^3.0.1, to-regex@^3.0.2: toggle-selection@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz" integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== dependencies: psl "^1.1.33" @@ -14741,7 +14380,7 @@ tough-cookie@^4.0.0: tough-cookie@~2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: psl "^1.1.28" @@ -14749,53 +14388,41 @@ tough-cookie@~2.5.0: tr46@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - trim-newlines@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz" integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= trim-right@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -"true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== - dependencies: - glob "^7.1.2" - tryer@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== ts-invariant@^0.9.4: version "0.9.4" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.9.4.tgz#42ac6c791aade267dd9dc65276549df5c5d71cac" + resolved "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.9.4.tgz" integrity sha512-63jtX/ZSwnUNi/WhXjnK8kz4cHHpYS60AnmA6ixz17l7E12a5puCWFlNpkne5Rl0J8TBPVHpGjsj4fxs8ObVLQ== dependencies: tslib "^2.1.0" ts-node@9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.0.0.tgz#e7699d2a110cc8c0d3b831715e417688683460b3" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz" integrity sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg== dependencies: arg "^4.1.0" @@ -14806,12 +14433,12 @@ ts-node@9.0.0: ts-pnp@1.2.0, ts-pnp@^1.1.6: version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + resolved "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== tsconfig-paths@^3.12.0: version "3.12.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz" integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== dependencies: "@types/json5" "^0.0.29" @@ -14821,95 +14448,95 @@ tsconfig-paths@^3.12.0: tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" tty-browserify@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl-util@^0.15.0: version "0.15.1" - resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= tweetnacl@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" type-detect@4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz" integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== type-fest@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== type-fest@^0.8.1: version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -14917,34 +14544,34 @@ type-is@~1.6.18: type@^1.0.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + resolved "https://registry.npmjs.org/type/-/type-2.5.0.tgz" integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== typedarray-to-buffer@3.1.5, 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" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.5.tgz#ae9dddfd1069f1cb5beb3ef3b2170dd7c1332389" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz" integrity sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ== unbox-primitive@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz" integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== dependencies: function-bind "^1.1.1" @@ -14954,7 +14581,7 @@ unbox-primitive@^1.0.1: uncontrollable@^7.2.1: version "7.2.1" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" + resolved "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz" integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== dependencies: "@babel/runtime" "^7.6.3" @@ -14964,17 +14591,17 @@ uncontrollable@^7.2.1: underscore@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" @@ -14982,17 +14609,17 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz" integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== unicode-property-aliases-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz" integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== union-value@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" @@ -15002,58 +14629,58 @@ union-value@^1.0.0: uniq@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + resolved "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= uniqs@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + resolved "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= unique-filename@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== dependencies: unique-slug "^2.0.0" unique-slug@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" unique-string@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz" integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= dependencies: crypto-random-string "^1.0.0" universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unquote@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + resolved "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz" integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= unset-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" @@ -15061,24 +14688,24 @@ unset-value@^1.0.0: upath@^1.1.1, upath@^1.1.2, upath@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-loader@4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== dependencies: loader-utils "^2.0.0" @@ -15087,7 +14714,7 @@ url-loader@4.1.1: url-parse@^1.4.3: version "1.5.4" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.4.tgz#e4f645a7e2a0852cc8a66b14b292a3e9a11a97fd" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz" integrity sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg== dependencies: querystringify "^2.1.1" @@ -15095,12 +14722,12 @@ url-parse@^1.4.3: url-set-query@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" + resolved "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz" integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= url@^0.11.0: version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" @@ -15108,22 +14735,22 @@ url@^0.11.0: use@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== utf8@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + resolved "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz" integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util.promisify@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz" integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== dependencies: define-properties "^1.1.2" @@ -15131,7 +14758,7 @@ util.promisify@1.0.0: util.promisify@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz" integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== dependencies: define-properties "^1.1.3" @@ -15141,63 +14768,63 @@ util.promisify@~1.0.0: util@0.10.3: version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz" integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" util@^0.11.0: version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + resolved "https://registry.npmjs.org/util/-/util-0.11.1.tgz" integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== dependencies: inherits "2.0.3" utila@~0.4: version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" + resolved "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= uuid@7.0.2: version "7.0.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.2.tgz#7ff5c203467e91f5e0d85cfcbaaf7d2ebbca9be6" + resolved "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz" integrity sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw== uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== uuid@^8.3.0: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uuidv4@6.0.6: version "6.0.6" - resolved "https://registry.yarnpkg.com/uuidv4/-/uuidv4-6.0.6.tgz#6966e8dd15760528a0f954843d24fdfdfda5a329" + resolved "https://registry.npmjs.org/uuidv4/-/uuidv4-6.0.6.tgz" integrity sha512-10YcruyGJtsG5SJnPG+8atr8toJa7xAOrcO7B7plYYiwpH1mQ8UZHjNSa2MrwGi6KWuyVrXGHr+Rce22F9UAiw== dependencies: uuid "7.0.2" v8-compile-cache@^2.0.3: version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8-to-istanbul@^7.0.0: version "7.1.2" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz" integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" @@ -15206,7 +14833,7 @@ v8-to-istanbul@^7.0.0: validate-npm-package-license@^3.0.1: version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" @@ -15214,22 +14841,22 @@ validate-npm-package-license@^3.0.1: value-equal@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= vendors@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + resolved "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz" integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== verror@1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" @@ -15238,33 +14865,33 @@ verror@1.10.0: vm-browserify@^1.0.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== w3c-hr-time@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" w3c-xmlserializer@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== dependencies: xml-name-validator "^3.0.0" walker@^1.0.7, walker@~1.0.5: version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" walletlink@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/walletlink/-/walletlink-2.4.2.tgz#c218d1e0906537eac2a2e0bb24ee8ad19ecc23a6" + resolved "https://registry.npmjs.org/walletlink/-/walletlink-2.4.2.tgz" integrity sha512-NCDSrfPwm51dSMIygkvaO0t4yQMMDHMEPXcDWS53spMsPXrxF5Xmg07l5XZFoUuS5D3ibeQFRi1illX7ppA24g== dependencies: "@metamask/safe-event-emitter" "2.0.0" @@ -15283,21 +14910,21 @@ walletlink@^2.4.2: warning@^4.0.0, warning@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" watchpack-chokidar2@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + resolved "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz" integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== dependencies: chokidar "^2.1.8" watchpack@^1.7.4: version "1.7.5" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz" integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== dependencies: graceful-fs "^4.1.2" @@ -15308,19 +14935,19 @@ watchpack@^1.7.4: wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" web-vitals@^0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-0.2.4.tgz#ec3df43c834a207fd7cdefd732b2987896e08511" + resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-0.2.4.tgz" integrity sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg== web3-provider-engine@15.0.4: version "15.0.4" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-15.0.4.tgz#5c336bcad2274dff5218bc8db003fa4e9e464c24" + resolved "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-15.0.4.tgz" integrity sha512-Ob9oK0TUZfVC7NXkB7CQSWAiCdCD/Xnlh2zTnV8NdJR8LCrMAy2i6JedU70JHaxw59y7mM4GnsYOTTGkquFnNQ== dependencies: async "^2.5.0" @@ -15348,7 +14975,7 @@ web3-provider-engine@15.0.4: web3-provider-engine@16.0.1: version "16.0.1" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-16.0.1.tgz#2600a39ede364cdc0a1fc773bf40a94f2177e605" + resolved "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-16.0.1.tgz" integrity sha512-/Eglt2aocXMBiDj7Se/lyZnNDaHBaoJlaUfbP5HkLJQC/HlGbR+3/W+dINirlJDhh7b54DzgykqY7ksaU5QgTg== dependencies: async "^2.5.0" @@ -15376,7 +15003,7 @@ web3-provider-engine@16.0.1: web3-utils@1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.1.tgz" integrity sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA== dependencies: bn.js "4.11.8" @@ -15389,7 +15016,7 @@ web3-utils@1.2.1: web3modal@^1.9.5: version "1.9.5" - resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.5.tgz#a1d6351a11358b376af5772f79f3dcdba6c38d1b" + resolved "https://registry.npmjs.org/web3modal/-/web3modal-1.9.5.tgz" integrity sha512-L5ME6zgoaCDa+T66skW9WpxGOJX6vU9v+7aLacoQJhU3AMTk784ionpX+Pg4UdhdM+UQW+odge32GkwEX11czQ== dependencies: detect-browser "^5.1.0" @@ -15401,22 +15028,22 @@ web3modal@^1.9.5: webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= webidl-conversions@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== webidl-conversions@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== webpack-dev-middleware@^3.7.2: version "3.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz" integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== dependencies: memory-fs "^0.4.1" @@ -15427,7 +15054,7 @@ webpack-dev-middleware@^3.7.2: webpack-dev-server@3.11.0: version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz" integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== dependencies: ansi-html "0.0.7" @@ -15466,7 +15093,7 @@ webpack-dev-server@3.11.0: webpack-log@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + resolved "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz" integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== dependencies: ansi-colors "^3.0.0" @@ -15474,7 +15101,7 @@ webpack-log@^2.0.0: webpack-manifest-plugin@2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" + resolved "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz" integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== dependencies: fs-extra "^7.0.0" @@ -15484,7 +15111,7 @@ webpack-manifest-plugin@2.2.0: webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== dependencies: source-list-map "^2.0.0" @@ -15492,7 +15119,7 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack- webpack@4.44.2: version "4.44.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + resolved "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz" integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== dependencies: "@webassemblyjs/ast" "1.9.0" @@ -15521,14 +15148,14 @@ webpack@4.44.2: websocket-driver@0.6.5: version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz" integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= dependencies: websocket-extensions ">=0.1.1" websocket-driver@>=0.5.1: version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: http-parser-js ">=0.5.1" @@ -15537,34 +15164,34 @@ websocket-driver@>=0.5.1: websocket-extensions@>=0.1.1: version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== whatwg-encoding@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" whatwg-fetch@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== whatwg-fetch@^3.4.1: version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== whatwg-mimetype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= dependencies: tr46 "~0.0.3" @@ -15572,7 +15199,7 @@ whatwg-url@^5.0.0: whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== dependencies: lodash "^4.7.0" @@ -15581,7 +15208,7 @@ whatwg-url@^8.0.0, whatwg-url@^8.5.0: which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -15592,52 +15219,45 @@ which-boxed-primitive@^1.0.2: which-module@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.2.9, which@^1.3.1: +which@^1.2.9, which@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1, which@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== workbox-background-sync@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz#5ae0bbd455f4e9c319e8d827c055bb86c894fd12" + resolved "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz" integrity sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA== dependencies: workbox-core "^5.1.4" workbox-broadcast-update@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz#0eeb89170ddca7f6914fa3523fb14462891f2cfc" + resolved "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz" integrity sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA== dependencies: workbox-core "^5.1.4" workbox-build@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-5.1.4.tgz#23d17ed5c32060c363030c8823b39d0eabf4c8c7" + resolved "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz" integrity sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow== dependencies: "@babel/core" "^7.8.4" @@ -15679,26 +15299,26 @@ workbox-build@^5.1.4: workbox-cacheable-response@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz#9ff26e1366214bdd05cf5a43da9305b274078a54" + resolved "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz" integrity sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA== dependencies: workbox-core "^5.1.4" workbox-core@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-5.1.4.tgz#8bbfb2362ecdff30e25d123c82c79ac65d9264f4" + resolved "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz" integrity sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg== workbox-expiration@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-5.1.4.tgz#92b5df461e8126114943a3b15c55e4ecb920b163" + resolved "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz" integrity sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ== dependencies: workbox-core "^5.1.4" workbox-google-analytics@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz#b3376806b1ac7d7df8418304d379707195fa8517" + resolved "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz" integrity sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA== dependencies: workbox-background-sync "^5.1.4" @@ -15708,35 +15328,35 @@ workbox-google-analytics@^5.1.4: workbox-navigation-preload@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz#30d1b720d26a05efc5fa11503e5cc1ed5a78902a" + resolved "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz" integrity sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ== dependencies: workbox-core "^5.1.4" workbox-precaching@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-5.1.4.tgz#874f7ebdd750dd3e04249efae9a1b3f48285fe6b" + resolved "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz" integrity sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA== dependencies: workbox-core "^5.1.4" workbox-range-requests@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz#7066a12c121df65bf76fdf2b0868016aa2bab859" + resolved "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz" integrity sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw== dependencies: workbox-core "^5.1.4" workbox-routing@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-5.1.4.tgz#3e8cd86bd3b6573488d1a2ce7385e547b547e970" + resolved "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz" integrity sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw== dependencies: workbox-core "^5.1.4" workbox-strategies@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-5.1.4.tgz#96b1418ccdfde5354612914964074d466c52d08c" + resolved "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz" integrity sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA== dependencies: workbox-core "^5.1.4" @@ -15744,7 +15364,7 @@ workbox-strategies@^5.1.4: workbox-streams@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-5.1.4.tgz#05754e5e3667bdc078df2c9315b3f41210d8cac0" + resolved "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz" integrity sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw== dependencies: workbox-core "^5.1.4" @@ -15752,12 +15372,12 @@ workbox-streams@^5.1.4: workbox-sw@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-5.1.4.tgz#2bb34c9f7381f90d84cef644816d45150011d3db" + resolved "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz" integrity sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA== workbox-webpack-plugin@5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz#7bfe8c16e40fe9ed8937080ac7ae9c8bde01e79c" + resolved "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz" integrity sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ== dependencies: "@babel/runtime" "^7.5.5" @@ -15769,28 +15389,28 @@ workbox-webpack-plugin@5.1.4: workbox-window@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-5.1.4.tgz#2740f7dea7f93b99326179a62f1cc0ca2c93c863" + resolved "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz" integrity sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw== dependencies: workbox-core "^5.1.4" worker-farm@^1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + resolved "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz" integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== dependencies: errno "~0.1.7" worker-rpc@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + resolved "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz" integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== dependencies: microevent.ts "~0.1.1" wrap-ansi@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== dependencies: ansi-styles "^3.2.0" @@ -15799,7 +15419,7 @@ wrap-ansi@^5.1.0: wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -15808,12 +15428,12 @@ wrap-ansi@^6.2.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write-file-atomic@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -15823,50 +15443,50 @@ write-file-atomic@^3.0.0: write@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + resolved "https://registry.npmjs.org/write/-/write-1.0.3.tgz" integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== dependencies: mkdirp "^0.5.1" ws@7.4.6: version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== ws@7.5.3: version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== ws@^5.1.1: version "5.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + resolved "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz" integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== dependencies: async-limiter "~1.0.0" ws@^6.2.1: version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + resolved "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz" integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== dependencies: async-limiter "~1.0.0" ws@^7.4.6: version "7.5.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz" integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== xhr-request-promise@^0.1.2: version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" + resolved "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz" integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== dependencies: xhr-request "^1.1.0" xhr-request@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" + resolved "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz" integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== dependencies: buffer-to-arraybuffer "^0.0.5" @@ -15879,14 +15499,14 @@ xhr-request@^1.1.0: xhr2-cookies@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" + resolved "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz" integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= dependencies: cookiejar "^2.1.1" xhr@^2.0.4, xhr@^2.2.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + resolved "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz" integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== dependencies: global "~4.4.0" @@ -15896,66 +15516,61 @@ xhr@^2.0.4, xhr@^2.2.0: xml-name-validator@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xmlchars@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xmlhttprequest@1.8.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + resolved "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== xtend@~2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + resolved "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz" integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= dependencies: object-keys "~0.4.0" y18n@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.0: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yargs-parser@^10.0.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz" integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== dependencies: camelcase "^4.1.0" yargs-parser@^13.1.2: version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" @@ -15963,7 +15578,7 @@ yargs-parser@^13.1.2: yargs-parser@^18.1.2: version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" @@ -15971,7 +15586,7 @@ yargs-parser@^18.1.2: yargs@^13.2.4, yargs@^13.3.2: version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" @@ -15987,7 +15602,7 @@ yargs@^13.2.4, yargs@^13.3.2: yargs@^15.4.1: version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" @@ -16004,22 +15619,22 @@ yargs@^15.4.1: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zen-observable-ts@^1.2.0: version "1.2.3" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.3.tgz#c2f5ccebe812faf0cfcde547e6004f65b1a6d769" + resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.3.tgz" integrity sha512-hc/TGiPkAWpByykMwDcem3SdUgA4We+0Qb36bItSuJC9xD0XVBZoFHYoadAomDSNf64CG8Ydj0Qb8Od8BUWz5g== dependencies: zen-observable "0.8.15" zen-observable@0.8.15: version "0.8.15" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== From 7525478e98b8c967d2a9d0e4e6e63dd526e1d14a Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 21 Dec 2022 10:44:51 -0600 Subject: [PATCH 198/278] summary layoutt --- src/components/Summary/Balance.tsx | 168 ++++++ .../{Welcome => Summary}/Features.tsx | 0 src/components/Summary/Indexes.tsx | 135 +++++ .../{Welcome => Summary}/Protocol.tsx | 153 +---- .../{Welcome => Summary}/Summary.tsx | 20 +- src/components/{Welcome => Summary}/index.tsx | 0 src/components/Welcome/Protocol2.tsx | 550 ------------------ src/components/Welcome/Summary2.tsx | 299 ---------- src/hooks/usePrices2.tsx | 2 +- src/styles/summary.scss | 9 +- src/styles/summary2.scss | 461 --------------- src/utils/utils.tsx | 12 +- yarn.lock | 233 ++++---- 13 files changed, 466 insertions(+), 1576 deletions(-) create mode 100644 src/components/Summary/Balance.tsx rename src/components/{Welcome => Summary}/Features.tsx (100%) create mode 100644 src/components/Summary/Indexes.tsx rename src/components/{Welcome => Summary}/Protocol.tsx (72%) rename src/components/{Welcome => Summary}/Summary.tsx (86%) rename src/components/{Welcome => Summary}/index.tsx (100%) delete mode 100644 src/components/Welcome/Protocol2.tsx delete mode 100644 src/components/Welcome/Summary2.tsx delete mode 100644 src/styles/summary2.scss diff --git a/src/components/Summary/Balance.tsx b/src/components/Summary/Balance.tsx new file mode 100644 index 0000000..288fb50 --- /dev/null +++ b/src/components/Summary/Balance.tsx @@ -0,0 +1,168 @@ +import React, { useContext, useEffect, useState } from "react"; +import { Spinner } from "react-bootstrap/esm/"; +import { ethers } from "ethers"; +import { useTranslation } from "react-i18next"; +import NumberFormat from "react-number-format"; +import { Provider } from "ethers-multicall"; +import { oraclesContext, tokensContext } from "../../state"; +import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; +import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; +import { getPriceInUSDFromPair, isUndefined, isInLayer1 } from "../../utils/utils"; +import { NETWORKS } from "../../utils/constants"; + +type props = { + currentChainId: number; + ethCallProvider: Provider | undefined; + signerAddress: string; +}; + +const Balance = ({ currentChainId, ethCallProvider, signerAddress }: props) => { + const { t } = useTranslation(); + const oracles = useContext(oraclesContext); + const tokens = useContext(tokensContext); + const [loading, setLoading] = useState(true); + const [indexBalance, setIndexBalance] = useState("0.0"); + const [ctxBalance, setCtxBalance] = useState("0.0"); + const [indexUsdBalance, setIndexUsdBalance] = useState("0.0"); + const [ctxUsdBalance, setCtxUsdBalance] = useState("0.0"); + + const loadData = async () => { + if (oracles.tcapOracleRead && tokens && !isUndefined(tokens.tcapTokenRead) && ethCallProvider) { + const currentIndexPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + // @ts-ignore + const [currentIndexPrice] = await ethCallProvider?.all([currentIndexPriceCall]); + const totalIndexPrice = currentIndexPrice.mul(10000000000); + const indexPrice = ethers.utils.formatEther(totalIndexPrice.div(10000000000)); + + let currentPriceCTX = 0; + if (signerAddress === "" || currentChainId === NETWORKS.mainnet.chainId) { + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); + // @ts-ignore + const [wethOraclePrice, reservesCtxPool] = await ethCallProvider?.all([ + wethOraclePriceCall, + reservesCtxPoolCall, + ]); + const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + currentPriceCTX = await getPriceInUSDFromPair( + reservesCtxPool[0], + reservesCtxPool[1], + parseFloat(currentPriceETH) + ); + } + + if (tokens.tcapTokenRead && signerAddress !== "") { + const currentTcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(signerAddress); + // @ts-ignore + const [currentIndexBalance] = await ethCallProvider?.all([currentTcapBalanceCall]); + const indexString = ethers.utils.formatEther(currentIndexBalance); + setIndexBalance(indexString); + const indexUSD = parseFloat(indexString) * parseFloat(indexPrice); + if (indexUSD < 0.0001) { + setIndexUsdBalance("0.0"); + } else { + setIndexUsdBalance(indexUSD.toString()); + } + if (currentChainId === NETWORKS.mainnet.chainId) { + const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(signerAddress); + // @ts-ignore + const [currentCtxBalance] = await ethCallProvider?.all([currentCtxBalanceCall]); + const ctxString = ethers.utils.formatEther(currentCtxBalance); + setCtxBalance(ctxString); + const ctxUSD = parseFloat(ctxString) * currentPriceCTX; + setCtxUsdBalance(ctxUSD.toString()); + } else { + setCtxBalance("21.5"); + setCtxUsdBalance("67.08"); + } + } + } + }; + + useEffect(() => { + const load = async () => { + setLoading(true); + await loadData(); + setLoading(false); + }; + load(); + // eslint-disable-next-line + }, [currentChainId, ethCallProvider, signerAddress]); + + return ( +
+ {loading ? ( +
+ +
+ ) : ( +
+
+ +
+
+ <>{t("welcome.tcap-balance")} +
+
+ +
+
+
+
+ +
+
TCAP USD Balance
+
+ +
+
+
+
+ +
+
+ <>{t("welcome.ctx-balance")} +
+
+ +
+
+
+
+ +
+
CTX USD Balance
+
+ +
+
+
+
+ )} +
+ ); +}; + +export default Balance; diff --git a/src/components/Welcome/Features.tsx b/src/components/Summary/Features.tsx similarity index 100% rename from src/components/Welcome/Features.tsx rename to src/components/Summary/Features.tsx diff --git a/src/components/Summary/Indexes.tsx b/src/components/Summary/Indexes.tsx new file mode 100644 index 0000000..a552aab --- /dev/null +++ b/src/components/Summary/Indexes.tsx @@ -0,0 +1,135 @@ +import React, { useContext, useEffect, useState } from "react"; +import { Spinner } from "react-bootstrap/esm/"; +import { ethers } from "ethers"; +import { useTranslation } from "react-i18next"; +import NumberFormat from "react-number-format"; +import { Provider } from "ethers-multicall"; +import { oraclesContext, tokensContext } from "../../state"; +import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; +import { isUndefined } from "../../utils/utils"; + +type props = { + currentChainId: number; + ethCallProvider: Provider | undefined; +}; + +const Indexes = ({ currentChainId, ethCallProvider }: props) => { + const { t } = useTranslation(); + const oracles = useContext(oraclesContext); + const tokens = useContext(tokensContext); + const [loading, setLoading] = useState(true); + const [marketCap, setMarketCap] = useState("0.0"); + const [indexOraclePrice, setIndexOraclePrice] = useState("0.0"); + const [indexMarketPrice, setIndexMarketPrice] = useState("0.0"); + const [totalSupply, setTotalSupply] = useState("0.0"); + + const loadData = async () => { + if (oracles.tcapOracleRead && tokens && !isUndefined(tokens.tcapTokenRead)) { + const currentTotalSupplyCall = await tokens.tcapTokenRead?.totalSupply(); + const currentIndexPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); + + // @ts-ignore + const [currentTotalSupply, currentIndexPrice] = await ethCallProvider?.all([ + currentTotalSupplyCall, + currentIndexPriceCall, + ]); + setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); + const totalIndexMarketCap = currentIndexPrice.mul(10000000000); + const indexPrice = ethers.utils.formatEther(totalIndexMarketCap.div(10000000000)); + setMarketCap(ethers.utils.formatEther(totalIndexMarketCap)); + setIndexOraclePrice(indexPrice); + + /* await fetch("https://api.cryptex.finance/tcap-market-price") + .then((response) => response.json()) + .then((data) => setIndexMarketPrice(data)); */ + } + }; + + useEffect(() => { + const load = async () => { + setLoading(true); + await loadData(); + setLoading(false); + }; + load(); + // eslint-disable-next-line + }, [currentChainId, ethCallProvider]); + + return ( +
+ {loading ? ( +
+ +
+ ) : ( +
+
+ +
+
+ <>{t("welcome.tcap")} +
+
+ +
+
+
+
+ +
+
TCAP Oracle Price
+
+ +
+
+
+
+ +
+
TCAP Market Price
+
+ +
+
+
+
+ +
+
+ <>{t("welcome.summary.total-supply")} +
+
+ +
+
+
+
+ )} +
+ ); +}; + +export default Indexes; diff --git a/src/components/Welcome/Protocol.tsx b/src/components/Summary/Protocol.tsx similarity index 72% rename from src/components/Welcome/Protocol.tsx rename to src/components/Summary/Protocol.tsx index 196de16..eee68e1 100644 --- a/src/components/Welcome/Protocol.tsx +++ b/src/components/Summary/Protocol.tsx @@ -7,7 +7,6 @@ import { Provider } from "ethers-multicall"; import { useLazyQuery, gql } from "@apollo/client"; import { networkContext, oraclesContext, signerContext, tokensContext } from "../../state"; import { ReactComponent as StakeIcon } from "../../assets/images/graph/stake.svg"; -import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; import { ReactComponent as WETHIcon } from "../../assets/images/graph/weth.svg"; import { ReactComponent as DAIIcon } from "../../assets/images/graph/DAI.svg"; import { ReactComponent as AAVEIcon } from "../../assets/images/graph/aave.svg"; @@ -63,14 +62,6 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => { } `; - const getMaticUSD = async () => { - const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); - // @ts-ignore - const [maticOraclePrice] = await signer.ethcallProvider?.all([maticOraclePriceCall]); - const maticUSD = ethers.utils.formatEther(maticOraclePrice.mul(10000000000)); - return maticUSD; - }; - const loadStaked = async (data: any) => { if ( oracles && @@ -80,84 +71,6 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => { !isUndefined(tokens.tcapTokenRead) && validOracles(currentNetwork.chainId || 1, oracles) ) { - const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); - const currentTotalSupplyCall = await tokens.tcapTokenRead?.totalSupply(); - const ethcalls = [daiOraclePriceCall, currentTotalSupplyCall]; - - if (isInLayer1(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(aaveOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(wbtcOraclePriceCall); - ethcalls.push(usdcOraclePriceCall); - } - if (isOptimism(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); - const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(snxOraclePriceCall); - ethcalls.push(uniOraclePriceCall); - } - if (isPolygon(currentNetwork.chainId)) { - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - ethcalls.push(wbtcOraclePriceCall); - } - if (isArbitrum(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - } - - let daiOraclePrice; - let currentTotalSupply; - let wethOraclePrice; - let aaveOraclePrice; - let linkOraclePrice; - let snxOraclePrice; - let uniOraclePrice; - let wbtcOraclePrice; - let usdcOraclePrice; - - if (isInLayer1(currentNetwork.chainId)) { - // @ts-ignore - [ - daiOraclePrice, - currentTotalSupply, - wethOraclePrice, - aaveOraclePrice, - linkOraclePrice, - wbtcOraclePrice, - usdcOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); - } else if (isArbitrum(currentNetwork.chainId)) { - // @ts-ignore - [daiOraclePrice, currentTotalSupply, wethOraclePrice] = await signer.ethcallProvider?.all( - ethcalls - ); - } else if (isOptimism(currentNetwork.chainId)) { - // @ts-ignore - [ - daiOraclePrice, - currentTotalSupply, - wethOraclePrice, - linkOraclePrice, - snxOraclePrice, - uniOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); - } else { - // @ts-ignore - [daiOraclePrice, currentTotalSupply, wbtcOraclePrice] = await signer.ethcallProvider?.all( - ethcalls - ); - } - let currentDAIStake = BigNumber.from(0); let currentWETHStake = BigNumber.from(0); let currentAAVEStake = BigNumber.from(0); @@ -297,48 +210,18 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => { const formatUSDC = ethers.utils.formatUnits(currentUSDCStake, 6); setUSDCStake(formatUSDC); - const daiUSD = ethers.utils.formatEther(daiOraclePrice.mul(10000000000)); - let ethUSD = "0"; - let aaveUSD = "0"; - let linkUSD = "0"; - let snxUSD = "0"; - let uniUSD = "0"; - let maticUSD = "0"; - let wbtcUSD = "0"; - let usdcUSD = "0"; - if (isInLayer1(currentNetwork.chainId)) { - ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - aaveUSD = ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)); - linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); - wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); - usdcUSD = ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)); - } - if (isArbitrum(currentNetwork.chainId)) { - ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - } - if (isOptimism(currentNetwork.chainId)) { - ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); - snxUSD = ethers.utils.formatEther(snxOraclePrice.mul(10000000000)); - uniUSD = ethers.utils.formatEther(uniOraclePrice.mul(10000000000)); - } - if (isPolygon(currentNetwork.chainId)) { - maticUSD = await getMaticUSD(); - wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); - } - const totalUSD = - toUSD(ethUSD, formatETH) + - toUSD(daiUSD, formatDAI) + - toUSD(aaveUSD, formatAAVE) + - toUSD(linkUSD, formatLINK) + - toUSD(snxUSD, formatSNX) + - toUSD(uniUSD, formatUNI) + - toUSD(maticUSD, formatMATIC) + - toUSD(wbtcUSD, formatWBTC) + - toUSD(usdcUSD, formatUSDC); + toUSD(prices.wethOraclePrice, formatETH) + + toUSD(prices.daiOraclePrice, formatDAI) + + toUSD(prices.aaveOraclePrice, formatAAVE) + + toUSD(prices.linkOraclePrice, formatLINK) + + toUSD(prices.snxOraclePrice, formatSNX) + + toUSD(prices.uniOraclePrice, formatUNI) + + toUSD(prices.maticOraclePrice, formatMATIC) + + toUSD(prices.wbtcOraclePrice, formatWBTC) + + toUSD(prices.usdcOraclePrice, formatUSDC); setTotalStake(totalUSD.toString()); - setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); + // setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); } }; @@ -390,22 +273,6 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => {
-
- -
-
- <>{t("welcome.summary.total-supply")} -
-
- -
-
-
{!isPolygon(currentNetwork.chainId) && (
diff --git a/src/components/Welcome/Summary.tsx b/src/components/Summary/Summary.tsx similarity index 86% rename from src/components/Welcome/Summary.tsx rename to src/components/Summary/Summary.tsx index 8b7aa7d..16dbf52 100644 --- a/src/components/Welcome/Summary.tsx +++ b/src/components/Summary/Summary.tsx @@ -4,6 +4,8 @@ import { Provider } from "ethers-multicall"; import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; import { Card, Col, Dropdown } from "react-bootstrap/esm"; import "../../styles/summary.scss"; +import Balance from "./Balance"; +import Indexes from "./Indexes"; import Protocol from "./Protocol"; import { GRAPHQL_ENDPOINT, NETWORKS } from "../../utils/constants"; import { getDefaultProvider } from "../../utils/utils"; @@ -22,8 +24,8 @@ type props = { const Summary = ({ signerAddress, loadingContracts }: props) => { const options = [ { id: "0", name: "My Balance" }, - { id: "2", name: "Indexes Summary" }, - { id: "3", name: "Vaults Summary" }, + { id: "1", name: "TCAP Summary" }, + { id: "2", name: "Vaults Summary" }, ]; let chains = [ { id: NETWORKS.mainnet.chainId, name: "Mainnet" }, @@ -124,7 +126,19 @@ const Summary = ({ signerAddress, loadingContracts }: props) => { - + {currentOption.id === options[0].id && ( + + )} + {currentOption.id === options[1].id && ( + + )} + {currentOption.id === options[2].id && ( + + )} diff --git a/src/components/Welcome/index.tsx b/src/components/Summary/index.tsx similarity index 100% rename from src/components/Welcome/index.tsx rename to src/components/Summary/index.tsx diff --git a/src/components/Welcome/Protocol2.tsx b/src/components/Welcome/Protocol2.tsx deleted file mode 100644 index 607f03c..0000000 --- a/src/components/Welcome/Protocol2.tsx +++ /dev/null @@ -1,550 +0,0 @@ -import React, { useContext, useEffect, useState } from "react"; -import Card from "react-bootstrap/esm/Card"; -import Spinner from "react-bootstrap/Spinner"; -import { BigNumber, ethers } from "ethers"; -import { useTranslation } from "react-i18next"; -import NumberFormat from "react-number-format"; -import { networkContext, oraclesContext, signerContext, tokensContext } from "../../state"; -import { ReactComponent as StakeIcon } from "../../assets/images/graph/stake.svg"; -import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; -import { ReactComponent as WETHIcon } from "../../assets/images/graph/weth.svg"; -import { ReactComponent as DAIIcon } from "../../assets/images/graph/DAI.svg"; -import { ReactComponent as AAVEIcon } from "../../assets/images/graph/aave.svg"; -import { ReactComponent as LINKIcon } from "../../assets/images/graph/chainlink.svg"; -import { ReactComponent as UNIIcon } from "../../assets/images/graph/uni.svg"; -import { ReactComponent as SNXIcon } from "../../assets/images/graph/snx.svg"; -import { ReactComponent as POLYGONIcon } from "../../assets/images/graph/polygon3.svg"; -import { ReactComponent as WBTCIcon } from "../../assets/images/graph/wbtc.svg"; -import { ReactComponent as USDCIcon } from "../../assets/images/graph/usdc.svg"; -import cryptexJson from "../../contracts/cryptex.json"; -import { - isArbitrum, - isInLayer1, - isOptimism, - isPolygon, - isUndefined, - toUSD, - validOracles, -} from "../../utils/utils"; -import { NETWORKS } from "../../utils/constants"; - -type props = { - data: any; -}; - -const Protocol2 = ({ data }: props) => { - const { t } = useTranslation(); - const currentNetwork = useContext(networkContext); - const tokens = useContext(tokensContext); - const signer = useContext(signerContext); - const oracles = useContext(oraclesContext); - const [ethStake, setETHStake] = useState("0"); - const [daiStake, setDAIStake] = useState("0"); - const [maticStake, setMATICStake] = useState("0"); - const [aaveStake, setAaveStake] = useState("0"); - const [linkStake, setLinkStake] = useState("0"); - const [snxStake, setSNXStake] = useState("0"); - const [uniStake, setUNIStake] = useState("0"); - const [wbtcStake, setWBTCStake] = useState("0"); - const [usdcStake, setUSDCStake] = useState("0"); - const [TotalStake, setTotalStake] = useState("0"); - const [totalSupply, setTotalSupply] = useState("0.0"); - const [loading, setLoading] = useState(true); - - const getMaticUSD = async () => { - const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); - // @ts-ignore - const [maticOraclePrice] = await signer.ethcallProvider?.all([maticOraclePriceCall]); - const maticUSD = ethers.utils.formatEther(maticOraclePrice.mul(10000000000)); - return maticUSD; - }; - - useEffect(() => { - const load = async () => { - if ( - oracles && - tokens && - data && - signer && - !isUndefined(tokens.tcapTokenRead) && - validOracles(currentNetwork.chainId || 1, oracles) - ) { - const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); - const currentTotalSupplyCall = await tokens.tcapTokenRead?.totalSupply(); - const ethcalls = [daiOraclePriceCall, currentTotalSupplyCall]; - - if (isInLayer1(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(aaveOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(wbtcOraclePriceCall); - ethcalls.push(usdcOraclePriceCall); - } - if (isOptimism(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); - const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(snxOraclePriceCall); - ethcalls.push(uniOraclePriceCall); - } - if (isPolygon(currentNetwork.chainId)) { - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - ethcalls.push(wbtcOraclePriceCall); - } - if (isArbitrum(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - } - - let daiOraclePrice; - let currentTotalSupply; - let wethOraclePrice; - let aaveOraclePrice; - let linkOraclePrice; - let snxOraclePrice; - let uniOraclePrice; - let wbtcOraclePrice; - let usdcOraclePrice; - - if (isInLayer1(currentNetwork.chainId)) { - // @ts-ignore - [ - daiOraclePrice, - currentTotalSupply, - wethOraclePrice, - aaveOraclePrice, - linkOraclePrice, - wbtcOraclePrice, - usdcOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); - } else if (isArbitrum(currentNetwork.chainId)) { - // @ts-ignore - [daiOraclePrice, currentTotalSupply, wethOraclePrice] = await signer.ethcallProvider?.all( - ethcalls - ); - } else if (isOptimism(currentNetwork.chainId)) { - // @ts-ignore - [ - daiOraclePrice, - currentTotalSupply, - wethOraclePrice, - linkOraclePrice, - snxOraclePrice, - uniOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); - } else { - // @ts-ignore - [daiOraclePrice, currentTotalSupply, wbtcOraclePrice] = await signer.ethcallProvider?.all( - ethcalls - ); - } - - let currentDAIStake = BigNumber.from(0); - let currentWETHStake = BigNumber.from(0); - let currentAAVEStake = BigNumber.from(0); - let currentLINKStake = BigNumber.from(0); - let currentSNXStake = BigNumber.from(0); - let currentUNIStake = BigNumber.from(0); - let currentMATICStake = BigNumber.from(0); - let currentWBTCStake = BigNumber.from(0); - let currentUSDCStake = BigNumber.from(0); - - const networkId = currentNetwork.chainId; - // @ts-ignore - let contracts; - switch (networkId) { - case NETWORKS.mainnet.chainId: - contracts = cryptexJson[1].mainnet.contracts; - break; - case NETWORKS.goerli.chainId: - contracts = cryptexJson[5].goerli.contracts; - break; - case NETWORKS.optimism.chainId: - contracts = cryptexJson[10].optimism.contracts; - break; - case NETWORKS.okovan.chainId: - contracts = cryptexJson[69].okovan.contracts; - break; - case NETWORKS.polygon.chainId: - contracts = cryptexJson[137].polygon.contracts; - break; - case NETWORKS.arbitrum.chainId: - contracts = cryptexJson[42161].arbitrum.contracts; - break; - case NETWORKS.arbitrum_goerli.chainId: - contracts = cryptexJson[421613].arbitrum_goerli.contracts; - break; - case NETWORKS.mumbai.chainId: - contracts = cryptexJson[80001].mumbai.contracts; - break; - default: - contracts = cryptexJson[5].goerli.contracts; - break; - } - - await data.states.forEach((s: any) => { - const cAddress = s.id.toLowerCase(); - // @ts-ignore - if (cAddress === contracts.DAIVaultHandler.address.toLowerCase()) { - currentDAIStake = currentDAIStake.add( - s.amountStaked ? s.amountStaked : BigNumber.from(0) - ); - } - - if (isPolygon(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.MATICVaultHandler.address.toLowerCase()) { - currentMATICStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - } - if (isInLayer1(currentNetwork.chainId) || isPolygon(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.HardWBTCVaultHandler.address.toLowerCase()) { - currentWBTCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - } - if (isInLayer1(currentNetwork.chainId) || isOptimism(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { - currentWETHStake = currentWETHStake.add( - s.amountStaked ? s.amountStaked : BigNumber.from(0) - ); - } - // @ts-ignore - if (cAddress === contracts.LinkVaultHandler.address.toLowerCase()) { - currentLINKStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - } - - if (isInLayer1(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.AaveVaultHandler.address.toLowerCase()) { - currentAAVEStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - // @ts-ignore - if (cAddress === contracts.HardUSDCVaultHandler.address.toLowerCase()) { - currentUSDCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - // @ts-ignore - if (cAddress === contracts.HardWETHVaultHandler.address.toLowerCase()) { - currentWETHStake = currentWETHStake.add( - s.amountStaked ? s.amountStaked : BigNumber.from(0) - ); - } - // @ts-ignore - if (cAddress === contracts.HardDaiVaultHandler.address.toLowerCase()) { - currentDAIStake = currentDAIStake.add( - s.amountStaked ? s.amountStaked : BigNumber.from(0) - ); - } - } - if (isOptimism(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.SNXVaultHandler.address.toLowerCase()) { - currentSNXStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - // @ts-ignore - if (cAddress === contracts.UNIVaultHandler.address.toLowerCase()) { - currentUNIStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); - } - } - - if (isArbitrum(currentNetwork.chainId)) { - // @ts-ignore - if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { - currentWETHStake = currentWETHStake.add( - s.amountStaked ? s.amountStaked : BigNumber.from(0) - ); - } - } - }); - - const formatDAI = ethers.utils.formatEther(currentDAIStake); - setDAIStake(formatDAI); - const formatETH = ethers.utils.formatEther(currentWETHStake); - setETHStake(formatETH); - const formatAAVE = ethers.utils.formatEther(currentAAVEStake); - setAaveStake(formatAAVE); - const formatLINK = ethers.utils.formatEther(currentLINKStake); - setLinkStake(formatLINK); - const formatSNX = ethers.utils.formatEther(currentSNXStake); - setSNXStake(formatSNX); - const formatUNI = ethers.utils.formatEther(currentUNIStake); - setUNIStake(formatUNI); - const formatMATIC = ethers.utils.formatEther(currentMATICStake); - setMATICStake(formatMATIC); - const formatWBTC = ethers.utils.formatUnits(currentWBTCStake, 8); - setWBTCStake(formatWBTC); - const formatUSDC = ethers.utils.formatUnits(currentUSDCStake, 6); - setUSDCStake(formatUSDC); - - const daiUSD = ethers.utils.formatEther(daiOraclePrice.mul(10000000000)); - let ethUSD = "0"; - let aaveUSD = "0"; - let linkUSD = "0"; - let snxUSD = "0"; - let uniUSD = "0"; - let maticUSD = "0"; - let wbtcUSD = "0"; - let usdcUSD = "0"; - if (isInLayer1(currentNetwork.chainId)) { - ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - aaveUSD = ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)); - linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); - wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); - usdcUSD = ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)); - } - if (isArbitrum(currentNetwork.chainId)) { - ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - } - if (isOptimism(currentNetwork.chainId)) { - ethUSD = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - linkUSD = ethers.utils.formatEther(linkOraclePrice.mul(10000000000)); - snxUSD = ethers.utils.formatEther(snxOraclePrice.mul(10000000000)); - uniUSD = ethers.utils.formatEther(uniOraclePrice.mul(10000000000)); - } - if (isPolygon(currentNetwork.chainId)) { - maticUSD = await getMaticUSD(); - wbtcUSD = ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)); - } - - const totalUSD = - toUSD(ethUSD, formatETH) + - toUSD(daiUSD, formatDAI) + - toUSD(aaveUSD, formatAAVE) + - toUSD(linkUSD, formatLINK) + - toUSD(snxUSD, formatSNX) + - toUSD(uniUSD, formatUNI) + - toUSD(maticUSD, formatMATIC) + - toUSD(wbtcUSD, formatWBTC) + - toUSD(usdcUSD, formatUSDC); - setTotalStake(totalUSD.toString()); - setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); - } - setLoading(false); - }; - load(); - // eslint-disable-next-line - }, [data]); - - return ( - - -

- <>{t("welcome.summary.title")} -

-
- - {loading ? ( -
- -
- ) : ( -
-
- -
-
- <>{t("welcome.summary.staked-usd")} -
-
- -
-
-
-
- -
-
- <>{t("welcome.summary.total-supply")} -
-
- -
-
-
- {!isPolygon(currentNetwork.chainId) && ( -
- -
-
- <>{t("welcome.summary.staked-eth")} -
-
- -
-
-
- )} -
- -
-
- <>{t("welcome.summary.staked-dai")} -
-
- -
-
-
- {isInLayer1(currentNetwork.chainId) && ( -
- -
-
- <>{t("welcome.summary.staked-aave")} -
-
- -
-
-
- )} - {!isPolygon(currentNetwork.chainId) && ( -
- -
-
- <>{t("welcome.summary.staked-link")} -
-
- -
-
-
- )} - {isOptimism(currentNetwork.chainId) && ( - <> -
- -
-

- <>{t("welcome.summary.staked-uni")} -

-
- -
-
-
-
- -
-

- <>{t("welcome.summary.staked-snx")} -

-
- -
-
-
- - )} - {isPolygon(currentNetwork.chainId) && ( -
- -
-
- <>{t("welcome.summary.staked-matic")} -
-
- -
-
-
- )} - {!isOptimism(currentNetwork.chainId) && ( -
- -
-
- <>{t("welcome.summary.staked-wbtc")} -
-
- -
-
-
- )} -
- -
-
- <>{t("welcome.summary.staked-usdc")} -
-
- -
-
-
-
- )} -
-
- ); -}; - -export default Protocol2; diff --git a/src/components/Welcome/Summary2.tsx b/src/components/Welcome/Summary2.tsx deleted file mode 100644 index 80db002..0000000 --- a/src/components/Welcome/Summary2.tsx +++ /dev/null @@ -1,299 +0,0 @@ -import React, { useContext, useEffect, useState } from "react"; -import Button from "react-bootstrap/esm/Button"; -import Card from "react-bootstrap/esm/Card"; -import Col from "react-bootstrap/esm/Col"; -import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; -import Tooltip from "react-bootstrap/esm/Tooltip"; -import { GiSpottedMushroom } from "react-icons/gi"; -import { FaArrowRight } from "react-icons/fa"; -import { useHistory } from "react-router-dom"; -import { useTranslation } from "react-i18next"; -import { ethers } from "ethers"; -import NumberFormat from "react-number-format"; -import { useQuery, gql } from "@apollo/client"; -import { - networkContext, - oraclesContext, - signerContext, - tokensContext, - Web3ModalContext, -} from "../../state"; -import { - makeShortAddress, - getPriceInUSDFromPair, - getENS, - isInLayer1, - isGoerli, -} from "../../utils/utils"; -import "../../styles/summary2.scss"; -import Protocol2 from "./Protocol2"; -import { ReactComponent as VaultIcon } from "../../assets/images/welcome/vault.svg"; -import { ReactComponent as StakeIcon } from "../../assets/images/welcome/stake.svg"; -import { ReactComponent as FarmIcon } from "../../assets/images/welcome/farm.svg"; -import Loading from "../Loading"; - -type props = { - signerAddress: string; - loadingContracts: boolean; -}; - -const Summary2 = ({ signerAddress, loadingContracts }: props) => { - const { t } = useTranslation(); - const history = useHistory(); - const [address, setAddress] = useState(""); - const [currentAddress, setCurrentAddress] = useState(""); - const [tcapBalance, setTcapBalance] = useState("0.0"); - const [tcapUSDBalance, setTcapUSDBalance] = useState("0.0"); - const [totalPrice, setTotalPrice] = useState("0.0"); - const [tcapPrice, setTcapPrice] = useState("0.0"); - const [ctxPrice, setCtxPrice] = useState("0.0"); - const [ctxUSDBalance, setCtxUSDBalance] = useState("0.0"); - const [ctxBalance, setCtxBalance] = useState("0.0"); - const [isLoading, setIsLoading] = useState(true); - const currentNetwork = useContext(networkContext); - const signer = useContext(signerContext); - const web3Modal = useContext(Web3ModalContext); - const tokens = useContext(tokensContext); - const oracles = useContext(oraclesContext); - - const VAULTS_STATE = gql` - { - states { - amountStaked - id - } - } - `; - - const { data } = useQuery(VAULTS_STATE, { - notifyOnNetworkStatusChange: true, - pollInterval: 35000, - fetchPolicy: "no-cache", - }); - - useEffect(() => { - const loadAddress = async () => { - if (oracles.tcapOracleRead) { - const currentTcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - // @ts-ignore - const [currentTcapPrice] = await signer.ethcallProvider?.all([currentTcapPriceCall]); - const TotalTcapPrice = currentTcapPrice.mul(10000000000); - const tPrice = ethers.utils.formatEther(TotalTcapPrice.div(10000000000)); - setTotalPrice(ethers.utils.formatEther(TotalTcapPrice)); - setTcapPrice(tPrice); - - let currentPriceCTX = 0; - if ( - !isGoerli(currentNetwork.chainId) && - (signerAddress === "" || isInLayer1(currentNetwork.chainId)) - ) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); - // @ts-ignore - const [wethOraclePrice, reservesCtxPool] = await signer.ethcallProvider?.all([ - wethOraclePriceCall, - reservesCtxPoolCall, - ]); - const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - currentPriceCTX = await getPriceInUSDFromPair( - reservesCtxPool[0], - reservesCtxPool[1], - parseFloat(currentPriceETH) - ); - setCtxPrice(currentPriceCTX.toString()); - } - - if ( - signer.signer && - tokens.tcapTokenRead && - signerAddress !== "" && - signerAddress !== currentAddress - ) { - const ens = await getENS(signerAddress); - if (ens) { - setAddress(ens); - } else { - setAddress(makeShortAddress(signerAddress)); - } - - const currentTcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(signerAddress); - // @ts-ignore - const [currentTcapBalance] = await signer.ethcallProvider?.all([currentTcapBalanceCall]); - const tcapString = ethers.utils.formatEther(currentTcapBalance); - setTcapBalance(tcapString); - const tcapUSD = parseFloat(tcapString) * parseFloat(tPrice); - if (tcapUSD < 0.0001) { - setTcapUSDBalance("0.0"); - } else { - setTcapUSDBalance(tcapUSD.toString()); - } - if (isInLayer1(currentNetwork.chainId)) { - const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(signerAddress); - // @ts-ignore - const [currentCtxBalance] = await signer.ethcallProvider?.all([currentCtxBalanceCall]); - const ctxString = ethers.utils.formatEther(currentCtxBalance); - setCtxBalance(ctxString); - const ctxUSD = parseFloat(ctxString) * currentPriceCTX; - setCtxUSDBalance(ctxUSD.toString()); - } - setCurrentAddress(signerAddress); - } - setIsLoading(false); - } - }; - loadAddress(); - - // eslint-disable-next-line - }, [signerAddress, loadingContracts]); - - if (isLoading) { - return ; - } - - return ( -
-
-
-

- - - <>{t("welcome.tcap-info")} - - } - > - - -

-

- <>{t("welcome.tcap")}: -

-
-
-

- -

-

- <>{t("welcome.tcap-price")} -

-
- {isInLayer1(currentNetwork.chainId) && ( -
-

- -

-

- <>{t("welcome.ctx-price")} -

-
- )} -
-

- -

-

- <>{t("welcome.tcap-balance")} -

-
-
-

- -

-

- <>{t("welcome.ctx-balance")} -

-
-
-
- - - -

Use Cryptex For

-
- - - - - - -
- - - - -
-
- ); -}; - -export default Summary2; diff --git a/src/hooks/usePrices2.tsx b/src/hooks/usePrices2.tsx index f3c68e1..f66efee 100644 --- a/src/hooks/usePrices2.tsx +++ b/src/hooks/usePrices2.tsx @@ -116,7 +116,7 @@ export const usePrices2 = ( loadPrices(); }, // eslint-disable-next-line - [] + [chainId, ethcallProvider] ); return oraclePrices; diff --git a/src/styles/summary.scss b/src/styles/summary.scss index ddbab78..f0f98b8 100644 --- a/src/styles/summary.scss +++ b/src/styles/summary.scss @@ -161,11 +161,11 @@ } } - .protocol { + .protocol, .indexes, .balance { width: 100%; .detail { display: grid; - grid-template-columns: auto auto; + grid-template-columns: 50% 50%; gap: 1rem; row-gap: 1.7rem; height: fit-content; @@ -184,6 +184,11 @@ border-radius: 5px; } + .market-cap { + grid-column-start: 1; + grid-column-end: 3; + } + .asset { display: flex; flex-direction: row; diff --git a/src/styles/summary2.scss b/src/styles/summary2.scss deleted file mode 100644 index a695370..0000000 --- a/src/styles/summary2.scss +++ /dev/null @@ -1,461 +0,0 @@ -@import "./colors"; -@import "./fonts"; - -.summary2 { - display: flex; - flex-direction: column; - padding: 3rem 2rem; - padding-bottom: 2rem; - - .spinner-container { - padding-top: 3rem; - width: 100%; - } - - h2 { - font-size: 1.375rem; - margin-bottom: 0rem; - } - - h3 { - font-size: 1.1rem; - margin-bottom: 0rem; - } - - h4 { - font-size: 0.9rem; - } - - h5 { - font-size: 0.9rem; - text-align: right; - } - - h6 { - color: $off-white; - } - - .btn { - background-color: $darker; - width: 7rem; - height: 2.7rem; - font-size: 0.8rem; - - &.question { - border-radius: 2px; - width: 20px; - height: 20px; - margin-right: 0px; - font-size: 10px; - padding: 2px; - margin-left: 5px; - } - } - - .btn:disabled { - color: $light; - opacity: 0.8; - } - - #connect { - background-color: $pink; - width: 15rem; - height: 3rem; - border-radius: 0; - font-size: 1rem; - } - - .prices { - display: flex; - flex-direction: row; - justify-content: space-between; - padding: 1rem; - margin: 0rem 1rem; - border: 0.7px solid #a440f2; - border-radius: 5px; - background-color: #281e31; - - .token-price { - display: flex; - flex-direction: column; - margin-left: 0.5rem; - margin-right: 1.5rem; - } - - .number { - display: flex; - flex-direction: row; - align-items: center; - margin-bottom: 0.5rem; - } - - h4 { - margin-bottom: 0rem; - - @media (max-width: 1499px) { - font-size: 0.8rem; - } - - @media (max-width: 1400px) { - font-size: 0.75rem; - } - - @media (max-width: 1320px) { - font-size: 0.7rem; - } - - @media (max-width: 1279px) { - font-size: 0.65rem; - } - } - } - - .summary-protocol { - display: flex; - flex-direction: row; - flex-wrap: wrap; - margin-top: 2rem; - } - - .card { - padding: 1.5rem; - - &-header { - padding: 0.5rem 1rem; - } - - .cls-1 { - fill: $darker; - } - - b { - font-family: "Nineteen Ninety Seven"; - color: $purple; - } - - .row { - margin-top: 0rem; - } - - &.diamond { - padding-bottom: 0rem; - - p { - width: 80%; - } - - .btn { - width: 11.0625rem; - margin-bottom: 0.8rem; - margin-left: 0.8rem; - border-radius: 5px; - - &.neon-green { - box-shadow: 0px 0px 39px -6px rgba(63, 217, 180, 0.4); - } - - &.neon-blue { - box-shadow: 0px 0px 39px -6px rgba(15, 217, 255, 0.4); - } - } - } - } - - .col-wrapper { - p { - font-size: 1rem; - } - - div[class*="col-"] { - padding: 0rem; - } - - .balance { - margin-bottom: 1.5rem; - padding-bottom: 0.8rem; - } - } - - .features { - &-title { - margin-bottom: 2rem; - } - - .btn-feature { - display: flex; - justify-content: space-between; - align-items: center; - background-color: $darkest; - margin-bottom: 1.5rem; - padding: 0rem 2rem; - width: 100%; - height: 5rem; - border: 0.7px solid $highlight; - } - .feature-content { - display: flex; - - svg { - height: 25px; - margin-right: 1.5rem; - -webkit-filter: drop-shadow(3px 3px 2px $highlight); - filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); - } - - .stake-icon { - height: 30px; - } - } - } - - .balance-section { - display: flex; - flex-direction: row; - justify-content: space-between; - - p { - margin-bottom: 0rem; - margin-left: 1rem; - } - - .balance-box { - display: flex; - flex-direction: column; - justify-content: space-between; - - h5 { - text-align: left; - margin-bottom: 0rem; - margin-left: 0.5rem; - } - - svg { - height: 2rem; - } - - .title { - display: flex; - justify-content: flex-end; - padding-top: 0.7rem; - padding-bottom: 0.9rem; - } - - .values { - display: flex; - flex-direction: column; - align-items: flex-end; - - h5 { - font-size: 1.2rem; - } - } - - .asset-value { - display: flex; - align-items: center; - flex-direction: row-reverse; - } - } - } - - .protocol { - height: 100%; - padding-left: 1rem; - padding-right: 1rem; - - .card-body { - display: flex; - } - - svg { - width: 2rem; - } - - .weth { - height: 2.1rem; - width: 1rem; - } - - .totals { - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - height: fit-content; - padding: 0.7rem; - background-color: #281e31; - border: 0.7px solid $highlight; - border-radius: 5px; - } - - .detail { - display: grid; - grid-template-columns: auto auto; - gap: 1rem; - row-gap: 1.7rem; - height: fit-content; - width: 100%; - } - - .asset { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - height: fit-content; - min-height: 4rem; - padding: 0.7rem; - background-color: #281e31; - border: 0.7px solid $highlight; - border-radius: 5px; - - h5 { - margin-bottom: 0.5rem; - } - } - - .staked { - display: flex; - flex-direction: column-reverse; - margin-left: 1rem; - - h6 { - margin-bottom: 0rem; - text-align: right; - } - } - - .card-footer { - padding-top: 2rem; - padding-bottom: 0rem; - } - - .use-tcap { - display: flex; - justify-content: space-evenly; - - .btn.neon-blue { - box-shadow: 0px 0px 14px -6px $blue; - } - } - - @media (min-width: 1149px) and (max-width: 1320px) { - h6 { - font-size: 0.9rem; - } - } - - @media (min-width: 760px) and (max-width: 1150px) { - .detail { - grid-template-columns: auto; - } - } - } - - @media (max-width: 1000px) { - padding: 3rem 1.2rem; - - .card-wrapper { - .card { - margin-bottom: 1.2rem; - - &.diamond { - p { - width: 85%; - } - } - } - } - } - - @media (max-width: 769px) { - .prices { - flex-wrap: wrap; - padding: 0.5rem; - - .token-price { - margin-bottom: 0.5rem; - } - - h4 { - font-size: 0.68rem; - } - } - - .protocol { - margin-top: 2rem; - } - } - - @media (max-width: 600px) { - .prices { - .token-price.total { - flex-direction: column; - align-items: flex-start; - margin-bottom: 1rem; - - .number { - margin-left: 0rem; - margin-bottom: 0.2rem; - } - } - - h4 { - font-size: 0.85rem; - } - } - } - - @media (max-width: 550px) { - padding-left: 1rem; - padding-right: 1rem; - - h2 { - font-size: 1.2rem; - } - - .card-header { - padding: 0.5rem 0rem; - } - - .card-body { - padding-left: 0rem; - padding-right: 0rem; - } - - .prices { - .title { - display: none; - } - - .token-price { - width: 100%; - margin-right: 0rem; - justify-content: space-between; - } - } - - .balance-section { - flex-direction: column; - - .balance-box { - margin-bottom: 1.2rem; - - .title { - justify-content: flex-start; - } - - .values { - align-items: flex-start; - } - } - } - - .protocol { - .detail { - grid-template-columns: auto; - row-gap: 1rem; - } - } - } -} diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index ba29014..1f7f1b3 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -323,7 +323,11 @@ export const isGoerli = (chainId: number | undefined) => { export const getDefaultProvider = (chainId: number | undefined) => { let provider; - if (chainId === NETWORKS.okovan.chainId) { + if (chainId === NETWORKS.arbitrum_goerli.chainId) { + provider = ethers.getDefaultProvider(chainId, { + infura: process.env.REACT_APP_INFURA_ID, + }); + } else if (chainId === NETWORKS.okovan.chainId) { provider = ethers.getDefaultProvider(process.env.REACT_APP_ALCHEMY_URL_OKOVAN); } else if (chainId === NETWORKS.optimism.chainId) { // provider = ethers.getDefaultProvider(process.env.REACT_APP_ALCHEMY_URL_OPTIMISM); @@ -337,6 +341,12 @@ export const getDefaultProvider = (chainId: number | undefined) => { case NETWORKS.goerli.chainId: alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_GOERLI; break; + case NETWORKS.arbitrum.chainId: + alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_ARBITRUM; + break; + case NETWORKS.arbitrum_goerli.chainId: + alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_ARBITRUM_GOERLI; + break; case NETWORKS.polygon.chainId: alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_POLYGON; break; diff --git a/yarn.lock b/yarn.lock index 67bf8bd..ecf2776 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,9 +16,9 @@ "@jridgewell/trace-mapping" "^0.3.9" "@apollo/client@^3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.1.tgz#86ce47c18a0714e229231148b0306562550c2248" - integrity sha512-xu5M/l7p9gT9Fx7nF3AQivp0XukjB7TM7tOd5wifIpI8RskYveL4I+rpTijzWrnqCPZabkbzJKH7WEAKdctt9w== + version "3.7.2" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.2.tgz#71b6846c1d99b81d041a1134f5679e30ec0363a0" + integrity sha512-ohAIpXl3mTa1Fd3GT/K37VwQJfTIuuJRp4aOlJ4q/hlx0Wxh+RqDrbn0awtVCOdhGDQN+CQQmVzIqFKn6GziXQ== dependencies: "@graphql-typed-document-node/core" "^3.1.1" "@wry/context" "^0.7.0" @@ -1142,7 +1142,7 @@ core-js-pure "^3.25.1" regenerator-runtime "^0.13.11" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.19.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.19.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.20.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== @@ -2047,11 +2047,11 @@ pocket-js-core "0.0.3" "@react-aria/ssr@^3.2.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.4.0.tgz#a2b9a170214f56e41d3c4c933d0d8fcffa07a12a" - integrity sha512-qzuGk14/fUyUAoW/EBwgFcuMkVNXJVGlezTgZ1HovpCZ+p9844E7MUFHE7CuzFzPEIkVeqhBNIoIu+VJJ8YCOA== + version "3.4.1" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.4.1.tgz#79e8bb621487e8f52890c917d3c734f448ba95e7" + integrity sha512-NmhoilMDyIfQiOSdQgxpVH2tC2u85Y0mVijtBNbI9kcDYLEiW/r6vKYVKtkyU+C4qobXhGMPfZ70PTc0lysSVA== dependencies: - "@babel/runtime" "^7.6.2" + "@swc/helpers" "^0.4.14" "@react-hook/media-query@^1.1.1": version "1.1.1" @@ -2238,6 +2238,13 @@ "@svgr/plugin-svgo" "^5.4.0" loader-utils "^2.0.0" +"@swc/helpers@^0.4.14": + version "0.4.14" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" + integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== + dependencies: + tslib "^2.4.0" + "@testing-library/dom@^7.28.1": version "7.31.2" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.31.2.tgz#df361db38f5212b88555068ab8119f5d841a8c4a" @@ -2402,9 +2409,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@*": - version "29.2.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.3.tgz#f5fd88e43e5a9e4221ca361e23790d48fcf0a211" - integrity sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w== + version "29.2.4" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.4.tgz#9c155c4b81c9570dbd183eb8604aa0ae80ba5a5b" + integrity sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2438,14 +2445,14 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": - version "18.11.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" - integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== + version "18.11.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.17.tgz#5c009e1d9c38f4a2a9d45c0b0c493fe6cdb4bcb5" + integrity sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng== "@types/node@^14.14.2": - version "14.18.33" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.33.tgz#8c29a0036771569662e4635790ffa9e057db379b" - integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== + version "14.18.35" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.35.tgz#879c4659cb7b3fe515844f029c75079c941bb65c" + integrity sha512-2ATO8pfhG1kDvw4Lc4C0GXIMSQFFJBCo/R1fSgTwmUlq5oy95LXyjDQinsRVgQY6gp6ghh3H91wk9ES5/5C+Tw== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2465,9 +2472,9 @@ "@types/node" "*" "@types/prettier@^2.0.0": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/prop-types@*": version "15.7.5" @@ -2518,9 +2525,9 @@ "@types/react" "*" "@types/react@*", "@types/react@>=16.9.11", "@types/react@^18.0.24": - version "18.0.25" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.25.tgz#8b1dcd7e56fe7315535a4af25435e0bb55c8ae44" - integrity sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g== + version "18.0.26" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" + integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2613,9 +2620,9 @@ "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.15" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.15.tgz#5b62c89fb049e2fc8378394a2861a593055f0866" - integrity sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg== + version "17.0.17" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.17.tgz#5672e5621f8e0fca13f433a8017aae4b7a2a03e7" + integrity sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g== dependencies: "@types/yargs-parser" "*" @@ -3157,9 +3164,9 @@ address@1.1.2: integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== address@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.1.tgz#25bb61095b7522d65b357baa11bc05492d4c8acd" - integrity sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA== + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== adjust-sourcemap-loader@3.0.0: version "3.0.0" @@ -3641,9 +3648,9 @@ aws4@^1.8.0: integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axe-core@^4.4.3: - version "4.5.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.5.2.tgz#823fdf491ff717ac3c58a52631d4206930c1d9f7" - integrity sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA== + version "4.6.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.1.tgz#79cccdee3e3ab61a8f42c458d4123a6768e6fbce" + integrity sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w== axios@^0.18.0: version "0.18.1" @@ -4432,9 +4439,9 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== bignumber.js@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" - integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== binary-extensions@^1.0.0: version "1.13.1" @@ -4951,9 +4958,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001400: - version "1.0.30001434" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz#ec1ec1cfb0a93a34a0600d37903853030520a4e5" - integrity sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA== + version "1.0.30001439" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz#ab7371faeb4adff4b74dad1718a6fd122e45d9cb" + integrity sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A== capture-exit@^2.0.0: version "2.0.0" @@ -5891,14 +5898,14 @@ decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.2.1: - version "10.4.2" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.2.tgz#0341651d1d997d86065a2ce3a441fbd0d8e8b98e" - integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== decompress-response@^3.3.0: version "3.3.0" @@ -6374,11 +6381,6 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== - emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" @@ -6451,9 +6453,9 @@ error-stack-parser@^2.0.6: stackframe "^1.3.4" es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== + version "1.20.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.5.tgz#e6dc99177be37cacda5988e692c3fa8b218e95d2" + integrity sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -6461,6 +6463,7 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: function.prototype.name "^1.1.5" get-intrinsic "^1.1.3" get-symbol-description "^1.0.0" + gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" has-symbols "^1.0.3" @@ -6476,8 +6479,8 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" unbox-primitive "^1.0.2" es-array-method-boxes-properly@^1.0.0: @@ -7674,9 +7677,9 @@ fast-safe-stringify@^2.0.6: integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.14.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" + integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== dependencies: reusify "^1.0.4" @@ -8221,9 +8224,9 @@ globals@^12.1.0: type-fest "^0.8.1" globals@^13.6.0, globals@^13.9.0: - version "13.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" - integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== + version "13.19.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" + integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== dependencies: type-fest "^0.20.2" @@ -8744,9 +8747,9 @@ ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" - integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immediate@^3.2.3: version "3.3.0" @@ -8883,11 +8886,11 @@ internal-ip@^4.3.0: ipaddr.js "^1.9.0" internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" + integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== dependencies: - get-intrinsic "^1.1.0" + get-intrinsic "^1.1.3" has "^1.0.3" side-channel "^1.0.4" @@ -10130,9 +10133,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + version "2.2.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" + integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== jsonfile@^4.0.0: version "4.0.0" @@ -10245,17 +10248,17 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== -language-subtag-registry@~0.3.2: +language-subtag-registry@^0.3.20: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== language-tags@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + version "1.0.7" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.7.tgz#41cc248730f3f12a452c2e2efe32bc0bbce67967" + integrity sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw== dependencies: - language-subtag-registry "~0.3.2" + language-subtag-registry "^0.3.20" last-call-webpack-plugin@^3.0.0: version "3.0.0" @@ -10367,15 +10370,6 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - loader-utils@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" @@ -10890,6 +10884,13 @@ minipass@^3.0.0, minipass@^3.1.1: dependencies: yallist "^4.0.0" +minipass@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.0.tgz#7cebb0f9fa7d56f0c5b17853cbe28838a8dbbd3b" + integrity sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw== + dependencies: + yallist "^4.0.0" + minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -11157,9 +11158,9 @@ node-releases@^1.1.61: integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + version "2.0.8" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" + integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== node-sass@^4.14.1: version "4.14.1" @@ -12570,9 +12571,9 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po source-map "^0.6.1" postcss@^8.1.0: - version "8.4.19" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" - integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== + version "8.4.20" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56" + integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" @@ -12616,9 +12617,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.1.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" - integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== + version "2.8.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" + integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== pretty-bytes@^5.3.0: version "5.6.0" @@ -12960,9 +12961,9 @@ react-blockies@^1.4.1: prop-types "^15.5.10" react-bootstrap@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.6.0.tgz#bd125889cc9d2bbd7c89334a7c54980ff0a65b94" - integrity sha512-WnDgN6PR8WZKo2Og5J8EafFi4BsABjc96lNuMNfksrgiPDCw18/woWQCNhAeHFZQWTQ/PijkOrQ9ncTWwO//AA== + version "2.7.0" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.7.0.tgz#4a8f0311bccac477dc925366763c536f46e4393b" + integrity sha512-Jcrn6aUuRVBeSB6dzKODKZU1TONOdhAxu0IDm4Sv74SJUm98dMdhSotF2SNvFEADANoR+stV+7TK6SNX1wWu5w== dependencies: "@babel/runtime" "^7.17.2" "@restart/hooks" "^0.4.6" @@ -13039,9 +13040,9 @@ react-i18next@^11.15.3: html-parse-stringify "^3.0.1" react-icons@^4.3.1: - version "4.6.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.6.0.tgz#f83eda179af5d02c047449a20b702c858653d397" - integrity sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g== + version "4.7.1" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.7.1.tgz#0f4b25a5694e6972677cb189d2a72eabea7a8345" + integrity sha512-yHd3oKGMgm7zxo3EA7H2n7vxSoiGmHk5t6Ou4bXsfcgWyhfDKMpyKfhHR6Bjnn63c+YXBLBPUql9H4wPJM6sXw== react-is@^16.13.1, react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" @@ -13579,16 +13580,16 @@ resolve-pathname@^3.0.0: integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== resolve-url-loader@^3.1.2: - version "3.1.4" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz#3c16caebe0b9faea9c7cc252fa49d2353c412320" - integrity sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg== + version "3.1.5" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.5.tgz#1dce0847d4a2ef43c51f63c9fd30bf6dfbf26716" + integrity sha512-mgFMCmrV/tA4738EsFmPFE5/MaqSgUMe8LK971kVEKA/RrNVb7+VqFsg/qmKyythf34eyq476qIobP/gfFBGSQ== dependencies: adjust-sourcemap-loader "3.0.0" camelcase "5.3.1" compose-function "3.0.3" convert-source-map "1.7.0" es6-iterator "2.0.3" - loader-utils "1.2.3" + loader-utils "^1.2.3" postcss "7.0.36" rework "1.0.1" rework-visit "1.0.0" @@ -13868,9 +13869,9 @@ sass-loader@^10.0.4: semver "^7.3.2" sass@^1.27.0: - version "1.56.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.1.tgz#94d3910cd468fd075fa87f5bb17437a0b617d8a7" - integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ== + version "1.57.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5" + integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -14619,7 +14620,7 @@ string.prototype.trim@~1.2.6: define-properties "^1.1.4" es-abstract "^1.20.4" -string.prototype.trimend@^1.0.5: +string.prototype.trimend@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== @@ -14628,7 +14629,7 @@ string.prototype.trimend@^1.0.5: define-properties "^1.1.4" es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.5: +string.prototype.trimstart@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== @@ -14929,13 +14930,13 @@ tar@^2.0.0: inherits "2" tar@^6.0.2: - version "6.1.12" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.12.tgz#3b742fb05669b55671fb769ab67a7791ea1a62e6" - integrity sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw== + version "6.1.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" + integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^3.0.0" + minipass "^4.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -15002,9 +15003,9 @@ terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.3.4: - version "5.16.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.0.tgz#29362c6f5506e71545c73b069ccd199bb28f7f54" - integrity sha512-KjTV81QKStSfwbNiwlBXfcgMcOloyuRdb62/iLFPGBcVNF4EXjhdYBhYHmbJpiBrVxZhDvltE11j+LBQUxEEJg== + version "5.16.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" + integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -15244,7 +15245,7 @@ tslib@1.14.1, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== From 958391bcf3ea16090d90eec9e9f255dc8aeddd37 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 21 Dec 2022 16:55:25 -0600 Subject: [PATCH 199/278] added summary page warnings --- src/App.tsx | 7 +- src/components/Farm/UniV3Rewards/index.tsx | 8 +- src/components/Summary/Balance.tsx | 130 +++++++++-------- src/components/Summary/Features.tsx | 119 +++++++++------ src/components/Summary/Protocol.tsx | 1 - src/components/Summary/Summary.tsx | 5 +- src/components/Summary/index.tsx | 7 +- .../Summary/warnings/VaultsWarning.tsx | 135 ++++++++++++++++++ src/components/Summary/warnings/index.tsx | 1 + src/components/Vaults/common.tsx | 40 +++--- src/components/Vaults/monitoring/index.tsx | 6 +- src/styles/summary.scss | 15 +- src/utils/univ3.tsx | 2 +- 13 files changed, 327 insertions(+), 149 deletions(-) create mode 100644 src/components/Summary/warnings/VaultsWarning.tsx create mode 100644 src/components/Summary/warnings/index.tsx diff --git a/src/App.tsx b/src/App.tsx index 8408bf7..74abd80 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -15,7 +15,7 @@ import Container from "react-bootstrap/esm/Container"; import Header from "./components/Header"; import Sidebar from "./components/Sidebar"; import Topbar from "./components/Topbar"; -import WelcomeWrapper from "./components/Welcome/index"; +import SummaryPage from "./components/Summary/index"; import Vaults from "./components/Vaults"; import Delegators from "./components/Governance/Delegators"; import MushroomNft from "./components/MushroomNft"; @@ -1024,10 +1024,7 @@ const App = () => { - + diff --git a/src/components/Farm/UniV3Rewards/index.tsx b/src/components/Farm/UniV3Rewards/index.tsx index a46d875..4dd4c05 100644 --- a/src/components/Farm/UniV3Rewards/index.tsx +++ b/src/components/Farm/UniV3Rewards/index.tsx @@ -34,7 +34,7 @@ const UniV3Rewards = ({ signer }: props) => { clientOracle( process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_UNIV3_ENDPOINT.mainnet - : GRAPHQL_UNIV3_ENDPOINT.rinkeby + : GRAPHQL_UNIV3_ENDPOINT.goerli ) ); @@ -44,8 +44,8 @@ const UniV3Rewards = ({ signer }: props) => { case NETWORKS.mainnet.chainId: setApolloClient(clientOracle(GRAPHQL_UNIV3_ENDPOINT.mainnet)); break; - case NETWORKS.rinkeby.chainId: - setApolloClient(clientOracle(GRAPHQL_UNIV3_ENDPOINT.rinkeby)); + case NETWORKS.goerli.chainId: + setApolloClient(clientOracle(GRAPHQL_UNIV3_ENDPOINT.goerli)); break; default: setApolloClient(clientOracle(GRAPHQL_UNIV3_ENDPOINT.mainnet)); @@ -64,7 +64,7 @@ const UniV3Rewards = ({ signer }: props) => { signer.signer ); let poolRead = new Contract(UNIV3.mainnet.tcapPool.id, toFragment(UniV3Pool)); - if (currentNetwork.chainId === NETWORKS.rinkeby.chainId) { + if (currentNetwork.chainId === NETWORKS.goerli.chainId) { poolRead = new Contract(UNIV3.rinkeby.tcapPool.id, toFragment(UniV3Pool)); } diff --git a/src/components/Summary/Balance.tsx b/src/components/Summary/Balance.tsx index 288fb50..fb79f88 100644 --- a/src/components/Summary/Balance.tsx +++ b/src/components/Summary/Balance.tsx @@ -7,8 +7,9 @@ import { Provider } from "ethers-multicall"; import { oraclesContext, tokensContext } from "../../state"; import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; -import { getPriceInUSDFromPair, isUndefined, isInLayer1 } from "../../utils/utils"; +import { getPriceInUSDFromPair, isUndefined } from "../../utils/utils"; import { NETWORKS } from "../../utils/constants"; +import { VaultsWarning } from "./warnings/index"; type props = { currentChainId: number; @@ -96,70 +97,79 @@ const Balance = ({ currentChainId, ethCallProvider, signerAddress }: props) => {
) : ( -
-
- -
-
- <>{t("welcome.tcap-balance")} -
-
- -
+ <> +
+
+ +
+
+ <>{t("welcome.tcap-balance")} +
+
+ +
+
-
-
- -
-
TCAP USD Balance
-
- -
+
+ +
+
TCAP USD Balance
+
+ +
+
-
-
- -
-
- <>{t("welcome.ctx-balance")} -
-
- -
+
+ +
+
+ <>{t("welcome.ctx-balance")} +
+
+ +
+
-
-
- -
-
CTX USD Balance
-
- -
+
+ +
+
CTX USD Balance
+
+ +
+
-
+
+ +
+ )}
); diff --git a/src/components/Summary/Features.tsx b/src/components/Summary/Features.tsx index 9c96cc4..d122a00 100644 --- a/src/components/Summary/Features.tsx +++ b/src/components/Summary/Features.tsx @@ -2,56 +2,81 @@ import React from "react"; import { Button, Card, Col } from "react-bootstrap/esm"; import { GiSpottedMushroom } from "react-icons/gi"; import { FaArrowRight } from "react-icons/fa"; +import { useHistory } from "react-router-dom"; import { ReactComponent as VaultIcon } from "../../assets/images/welcome/vault.svg"; import { ReactComponent as StakeIcon } from "../../assets/images/welcome/stake.svg"; import { ReactComponent as FarmIcon } from "../../assets/images/welcome/farm.svg"; -const Features = () => ( - - - -

Use Cryptex For

-
- - - - - - -
- -); +const Features = () => { + const history = useHistory(); + + return ( + + + +

Use Cryptex For

+
+ + + + + + +
+ + ); +}; export default Features; diff --git a/src/components/Summary/Protocol.tsx b/src/components/Summary/Protocol.tsx index eee68e1..58cc793 100644 --- a/src/components/Summary/Protocol.tsx +++ b/src/components/Summary/Protocol.tsx @@ -51,7 +51,6 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => { const [wbtcStake, setWBTCStake] = useState("0"); const [usdcStake, setUSDCStake] = useState("0"); const [TotalStake, setTotalStake] = useState("0"); - const [totalSupply, setTotalSupply] = useState("0.0"); const VAULTS_STATE = gql` { diff --git a/src/components/Summary/Summary.tsx b/src/components/Summary/Summary.tsx index 16dbf52..3c75923 100644 --- a/src/components/Summary/Summary.tsx +++ b/src/components/Summary/Summary.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useEffect, useState } from "react"; +import React, { useEffect, useState } from "react"; import { ethers } from "ethers"; import { Provider } from "ethers-multicall"; import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; @@ -18,10 +18,9 @@ const clientOracle = (graphqlEndpoint: string) => type props = { signerAddress: string; - loadingContracts: boolean; }; -const Summary = ({ signerAddress, loadingContracts }: props) => { +const Summary = ({ signerAddress }: props) => { const options = [ { id: "0", name: "My Balance" }, { id: "1", name: "TCAP Summary" }, diff --git a/src/components/Summary/index.tsx b/src/components/Summary/index.tsx index dacc53e..eea41e8 100644 --- a/src/components/Summary/index.tsx +++ b/src/components/Summary/index.tsx @@ -5,14 +5,13 @@ import Summary from "./Summary"; type props = { signerAddress: string; - loadingContracts: boolean; }; -const WelcomeWrapper = ({ signerAddress, loadingContracts }: props) => ( +const SummaryPage = ({ signerAddress }: props) => (
- +
); -export default WelcomeWrapper; +export default SummaryPage; diff --git a/src/components/Summary/warnings/VaultsWarning.tsx b/src/components/Summary/warnings/VaultsWarning.tsx new file mode 100644 index 0000000..7e2c59d --- /dev/null +++ b/src/components/Summary/warnings/VaultsWarning.tsx @@ -0,0 +1,135 @@ +import React, { useState } from "react"; +import { Button, Spinner } from "react-bootstrap/esm/"; +import { FaArrowRight } from "react-icons/fa"; +import { ethers } from "ethers"; +import { Provider } from "ethers-multicall"; +import { useHistory } from "react-router-dom"; +import { useQuery, gql } from "@apollo/client"; +import { usePrices2, useRatios } from "../../../hooks"; +import { getCollateralPrice, getMinRatio } from "../../Vaults/common"; +import { getRatio2, isUndefined } from "../../../utils/utils"; + +type props = { + chainId: number; + ethCallProvider: Provider | undefined; + ownerAddress: string; +}; + +export const VaultsWarning = ({ chainId, ethCallProvider, ownerAddress }: props) => { + const history = useHistory(); + const prices = usePrices2(chainId, ethCallProvider); + const ratios = useRatios(); + const [loadingVaults, setLoadingVaults] = useState(false); + const [liquidableVaults, setLiquidableVaults] = useState(0); + + console.log("ownerAddress: ", ownerAddress); + + const VAULTS = gql` + query ownerVaults($ownerAddress: String!) { + vaults(where: { owner: $ownerAddress }) { + id + vaultId + owner + collateral + debt + currentRatio + tokenSymbol + hardVault + blockTS + underlyingProtocol { + underlyingToken { + decimals + } + } + } + } + `; + + const isVaultLiquidable = ( + collateralWei: ethers.BigNumberish, + debtWei: ethers.BigNumberish, + symbol: string, + isHardVault: boolean, + decimals: number + ) => { + const collateralText = ethers.utils.formatUnits(collateralWei, decimals); + const debtText = ethers.utils.formatEther(debtWei); + const collateralPrice = getCollateralPrice(prices, symbol); + const minRatio = getMinRatio(ratios, symbol, isHardVault); + + const ratio = getRatio2( + collateralText, + collateralPrice, + debtText, + prices.tcapOraclePrice || "1" + ); + + return ratio < minRatio; + }; + + const loadVaults = async (vaultsData: any) => { + setLoadingVaults(true); + let liqVaults = 0; + console.log("vaultsData: ", vaultsData); + // @ts-ignore + vaultsData.vaults.forEach((v) => { + const cVaultDecimals = v.underlyingProtocol.underlyingToken.decimals; + const isLiquidable = isVaultLiquidable( + v.collateral, + v.debt, + v.tokenSymbol, + v.hardVault, + cVaultDecimals + ); + console.log("isLiquidable: ", isLiquidable); + if (isLiquidable) { + liqVaults += 1; + } + }); + setLiquidableVaults(liqVaults); + setLoadingVaults(false); + }; + + const { loading } = useQuery(VAULTS, { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + variables: { ownerAddress }, + // skip: skipQuery, + onError: (error) => { + console.log(error); + }, + onCompleted: (data: any) => { + if (!isUndefined(data)) { + loadVaults(data); + } + }, + }); + + if (loading || loadingVaults) { + return ( +
+ +
+ ); + } + + return ( + <> + {liquidableVaults > 0 && ( + + )} + + ); +}; diff --git a/src/components/Summary/warnings/index.tsx b/src/components/Summary/warnings/index.tsx new file mode 100644 index 0000000..fc890e1 --- /dev/null +++ b/src/components/Summary/warnings/index.tsx @@ -0,0 +1 @@ +export * from "./VaultsWarning"; diff --git a/src/components/Vaults/common.tsx b/src/components/Vaults/common.tsx index 53a48fe..e996303 100644 --- a/src/components/Vaults/common.tsx +++ b/src/components/Vaults/common.tsx @@ -54,34 +54,34 @@ export const OPTIMISM_COLLATERALS = [ export const getMinRatio = (ratios: VaultsRatioType, symbol: string, isHardVault: boolean) => { let minRatio = 200; switch (symbol) { - case "ETH": + case TOKENS_SYMBOLS.ETH: minRatio = isHardVault ? ratios.hardEthRatio : ratios.ethRatio; break; - case "WETH": + case TOKENS_SYMBOLS.WETH: minRatio = isHardVault ? ratios.hardWethRatio : ratios.ethRatio; break; - case "DAI": + case TOKENS_SYMBOLS.DAI: minRatio = isHardVault ? ratios.hardDaiRatio : ratios.daiRatio; break; - case "AAVE": + case TOKENS_SYMBOLS.AAVE: minRatio = ratios.aaveRatio; break; - case "LINK": + case TOKENS_SYMBOLS.LINK: minRatio = ratios.linkRatio; break; - case "UNI": + case TOKENS_SYMBOLS.UNI: minRatio = ratios.uniRatio; break; - case "SNX": + case TOKENS_SYMBOLS.SNX: minRatio = ratios.snxRatio; break; - case "MATIC": + case TOKENS_SYMBOLS.MATIC: minRatio = ratios.maticRatio; break; - case "WBTC": + case TOKENS_SYMBOLS.WBTC: minRatio = ratios.wbtcRatio; break; - case "USDC": + case TOKENS_SYMBOLS.USDC: minRatio = ratios.hardUsdcRatio; break; default: @@ -94,34 +94,34 @@ export const getMinRatio = (ratios: VaultsRatioType, symbol: string, isHardVault export const getCollateralPrice = (prices: OraclePricesType, symbol: string) => { let price = "0"; switch (symbol) { - case "ETH": + case TOKENS_SYMBOLS.ETH: price = prices.wethOraclePrice; break; - case "WETH": + case TOKENS_SYMBOLS.WETH: price = prices.wethOraclePrice; break; - case "DAI": + case TOKENS_SYMBOLS.DAI: price = prices.daiOraclePrice; break; - case "AAVE": + case TOKENS_SYMBOLS.AAVE: price = prices.aaveOraclePrice; break; - case "LINK": + case TOKENS_SYMBOLS.LINK: price = prices.linkOraclePrice; break; - case "UNI": + case TOKENS_SYMBOLS.UNI: price = prices.uniOraclePrice; break; - case "SNX": + case TOKENS_SYMBOLS.SNX: price = prices.snxOraclePrice; break; - case "MATIC": + case TOKENS_SYMBOLS.MATIC: price = prices.maticOraclePrice; break; - case "WBTC": + case TOKENS_SYMBOLS.WBTC: price = prices.wbtcOraclePrice; break; - case "USDC": + case TOKENS_SYMBOLS.USDC: price = prices.usdcOraclePrice; break; default: diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index 7b51654..1810e6b 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -396,11 +396,11 @@ const Monitoring = ({ setVaultToUpdate }: props) => { } if (!showAllVaults) { - addVault = v.tokenSymbol === "WETH" || v.tokenSymbol === "DAI"; + addVault = v.tokenSymbol === TOKENS_SYMBOLS.WETH || v.tokenSymbol === TOKENS_SYMBOLS.DAI; } - if (addVault && v.tokenSymbol !== "WBTC") { + if (addVault && v.tokenSymbol !== TOKENS_SYMBOLS.WBTC) { let vaultUrl = ""; - const symbol = v.tokenSymbol === "WETH" ? "ETH" : v.tokenSymbol; + const symbol = v.tokenSymbol === TOKENS_SYMBOLS.WETH ? TOKENS_SYMBOLS.ETH : v.tokenSymbol; if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { vaultUrl = window.location.origin.concat("/vault/").concat(symbol); } diff --git a/src/styles/summary.scss b/src/styles/summary.scss index f0f98b8..983e888 100644 --- a/src/styles/summary.scss +++ b/src/styles/summary.scss @@ -236,5 +236,18 @@ grid-template-columns: auto; } } - } + } + + .balance { + .warnings { + padding: 1.5rem 0rem; + &-vaults { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1.7rem 1rem; + width: 100%; + } + } + } } diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx index 44a41ea..bc73fd0 100644 --- a/src/utils/univ3.tsx +++ b/src/utils/univ3.tsx @@ -44,7 +44,7 @@ export const UNIV3 = { export const GRAPHQL_UNIV3_ENDPOINT = { mainnet: "https://api.thegraph.com/subgraphs/name/jdestephen/cryptex-univ3", - rinkeby: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-rinkeby-two", + goerli: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-rinkeby-two", }; export const encodeIncentive = (dataMap: any): string => { From 4c9347ebefb705a8f890ec41ea6d5d54b146fc41 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 22 Dec 2022 15:39:12 -0600 Subject: [PATCH 200/278] show 4 dedcimals oon reward --- src/components/Governance/StakerStats.tsx | 2 +- yarn.lock | 585 +++++++++++----------- 2 files changed, 292 insertions(+), 295 deletions(-) diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 03767da..86a2111 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -138,7 +138,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro displayType="text" thousandSeparator prefix="" - decimalScale={2} + decimalScale={4} />{" "} CTX diff --git a/yarn.lock b/yarn.lock index 9fc5ce6..f26f496 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,9 +16,9 @@ "@jridgewell/trace-mapping" "^0.3.9" "@apollo/client@^3.2.5": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.1.tgz#86ce47c18a0714e229231148b0306562550c2248" - integrity sha512-xu5M/l7p9gT9Fx7nF3AQivp0XukjB7TM7tOd5wifIpI8RskYveL4I+rpTijzWrnqCPZabkbzJKH7WEAKdctt9w== + version "3.7.3" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.3.tgz#ab3fe31046e74bc1a3762363a185ba5bcfffc58b" + integrity sha512-nzZ6d6a4flLpm3pZOGpuAUxLlp9heob7QcCkyIqZlCLvciUibgufRfYTwfkWCc4NaGHGSZyodzvfr79H6oUwGQ== dependencies: "@graphql-typed-document-node/core" "^3.1.1" "@wry/context" "^0.7.0" @@ -55,7 +55,7 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== @@ -83,32 +83,32 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.5", "@babel/core@^7.8.4", "@babel/core@^7.9.0": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" - integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.7.tgz#37072f951bd4d28315445f66e0ec9f6ae0c8c35f" + integrity sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-module-transforms" "^7.20.2" - "@babel/helpers" "^7.20.5" - "@babel/parser" "^7.20.5" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.7" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" - integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== +"@babel/generator@^7.12.1", "@babel/generator@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" + integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== dependencies: - "@babel/types" "^7.20.5" + "@babel/types" "^7.20.7" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -127,27 +127,28 @@ "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" - integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== +"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== dependencies: - "@babel/compat-data" "^7.20.0" + "@babel/compat-data" "^7.20.5" "@babel/helper-validator-option" "^7.18.6" browserslist "^4.21.3" + lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.2", "@babel/helper-create-class-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz#327154eedfb12e977baa4ecc72e5806720a85a06" - integrity sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz#d0e1f8d7e4ed5dac0389364d9c0c191d948ade6f" + integrity sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": @@ -197,12 +198,12 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== +"@babel/helper-member-expression-to-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" + integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.20.7" "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.18.6": version "7.18.6" @@ -211,19 +212,19 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" - integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz#7a6c9a1155bef55e914af574153069c9d9470c43" + integrity sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" "@babel/helper-simple-access" "^7.20.2" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -237,7 +238,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": +"@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== @@ -247,25 +248,26 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" - integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== dependencies: "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.19.1" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" -"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": +"@babel/helper-simple-access@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: "@babel/types" "^7.20.2" -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== @@ -304,14 +306,14 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.12.1", "@babel/helpers@^7.20.5": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" - integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== +"@babel/helpers@^7.12.1", "@babel/helpers@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" + integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" @@ -322,10 +324,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5", "@babel/parser@^7.7.0": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" - integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.7.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" + integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -335,21 +337,21 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" "@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" - integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -362,22 +364,22 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" + integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.5.tgz#28ba1a0e5044664a512967a19407d7fc26925394" - integrity sha512-Lac7PpRJXcC3s9cKsBfl+uc+DYXU5FD06BrTFunQO6QIQT+DwyzDPURAowI3bcvD1dZF/ank1Z5rstUJn3Hn4Q== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.7.tgz#05d37453c2ce818f3e47bbeda9468c8de947eecc" + integrity sha512-JB45hbUweYpwAGjkiM7uCyXMENH2lG+9r3G2E+ttc2PRXAoEkpfd/KW5jDg4j8RS6tLtTG1jZi9LbHZVSfs1/A== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-create-class-features-plugin" "^7.20.7" "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/plugin-syntax-decorators" "^7.19.0" @@ -406,11 +408,11 @@ "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-proposal-logical-assignment-operators@^7.12.1", "@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": @@ -430,15 +432,15 @@ "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" - integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-parameters" "^7.20.7" "@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" @@ -448,13 +450,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== +"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" + integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": @@ -631,20 +633,20 @@ "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== dependencies: "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" @@ -654,38 +656,39 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz#401215f9dc13dc5262940e2e527c9536b3d7f237" - integrity sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA== + version "7.20.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.8.tgz#ad142bce04ae32225e2379ca54f06d5cea92fdb8" + integrity sha512-ztBCIWJvcWJvtxhMqIrItLmGlbxaa/5hl7HlZvV4f9oS08wWn/mEtf5D35qxFp3rTK8KjV9TePEoeal8z02gzA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" - integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" + integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" "@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" - integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" + integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -751,21 +754,21 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" - integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.7.tgz#1e5cfeb4e5f9b392e86f85698896336b442f8760" + integrity sha512-+1IVLD+dHOzRZWNFFSoyPZz4ffsVmOP+OhhjeahLKpU97v/52LcCb9RabRl5eHM1/HAuH5Dl0q9Pyzrq1v2otQ== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-module-transforms" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" - integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.7.tgz#abb5f84695e74d46acf48244082f6cbf8bb23120" + integrity sha512-76jqqFiFdCD+RJwEdtBHUG2/rEKQAmpejPbAKyQECEE3/y4U5CMPc9IXvipS990vgQhzq+ZRw6WJ+q4xJ/P24w== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-module-transforms" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" "@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.19.6": version "7.19.6" @@ -808,10 +811,10 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz#f8f9186c681d10c3de7620c916156d893c8a019e" - integrity sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ== +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" + integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -844,15 +847,15 @@ "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx@^7.18.6": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" - integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz#025d85a1935fd7e19dfdcb1b1d4df34d4da484f7" + integrity sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.19.0" + "@babel/types" "^7.20.7" "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" @@ -897,12 +900,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" - integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-transform-sticky-regex@^7.12.1", "@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" @@ -926,11 +929,11 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.18.6": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" - integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz#673f49499cd810ae32a1ea5f3f8fab370987e055" + integrity sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-create-class-features-plugin" "^7.20.7" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-typescript" "^7.20.0" @@ -1135,49 +1138,49 @@ "@babel/plugin-transform-typescript" "^7.18.6" "@babel/runtime-corejs3@^7.10.2": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz#63dae945963539ab0ad578efbf3eff271e7067ae" - integrity sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.7.tgz#a1e5ea3d758ba6beb715210142912e3f29981d84" + integrity sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg== dependencies: core-js-pure "^3.25.1" regenerator-runtime "^0.13.11" "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.9", "@babel/runtime@^7.19.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" - integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" + integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.10.4", "@babel/template@^7.18.10", "@babel/template@^7.3.3": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== +"@babel/template@^7.10.4", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" - integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": + version "7.20.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.8.tgz#e3a23eb04af24f8bbe8a8ba3eef6155b77df0b08" + integrity sha512-/RNkaYDeCy4MjyV70+QkSHhxbvj2JO/5Ft2Pa880qJOG8tWrqcT/wXUuCCv43yogfqPzHL77Xu101KQPf4clnQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" + "@babel/generator" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.5" - "@babel/types" "^7.20.5" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" - integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== dependencies: "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" @@ -2097,9 +2100,9 @@ integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== "@sinonjs/commons@^1.7.0": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.5.tgz#e280c94c95f206dcfd5aca00a43f2156b758c764" - integrity sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA== + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== dependencies: type-detect "4.0.8" @@ -2271,17 +2274,17 @@ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@typeform/embed-react@^2.1.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@typeform/embed-react/-/embed-react-2.5.0.tgz#35203f6e3574041754a51c635c2515b591c57085" - integrity sha512-lLcLz4lI3spVgsvXRB2thumbEiSQQQyN9EkEioxDHSaKZEqvVr3c1JwVqpvV3gZh/ikWIze95l8dHiQWsEyGPw== + version "2.10.0" + resolved "https://registry.yarnpkg.com/@typeform/embed-react/-/embed-react-2.10.0.tgz#7213011d43078266a5f5ab9c61ba11eaf3123a90" + integrity sha512-vtmALabuj8zlfznOvjP/RRPEu4pKqRqDT+AhhBtoRxOtgwq1g+sMyE5jKPguU/onRybSDMp3QioOJqLeuU5ZIg== dependencies: - "@typeform/embed" "2.3.1" + "@typeform/embed" "2.5.1" fast-deep-equal "^3.1.3" -"@typeform/embed@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@typeform/embed/-/embed-2.3.1.tgz#848cc06d391d89640cd2a27d8ef577f18b89dedb" - integrity sha512-TVAPkaSrJzV/4NUwmfi78hG7s+cXy9SbGt3BaLucWoY91ZUR3uYvSqWWEq/40GURTY1O9DDvconIkGKLXSMdSQ== +"@typeform/embed@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@typeform/embed/-/embed-2.5.1.tgz#a4139c005b13c0d46737511d6e77498a7c721b18" + integrity sha512-fxyTFuv9H5Mqo/cTzwzHEp/WqchiD0HO+kE9LxHeOO+PrDtgXOoRcQAVKlI+/1UWxtO0GXhIe9cio3CyyVr/iA== "@types/aria-query@^4.2.0": version "4.2.2" @@ -2403,9 +2406,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@*": - version "29.2.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.3.tgz#f5fd88e43e5a9e4221ca361e23790d48fcf0a211" - integrity sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w== + version "29.2.4" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.4.tgz#9c155c4b81c9570dbd183eb8604aa0ae80ba5a5b" + integrity sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2439,14 +2442,14 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": - version "18.11.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" - integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== + version "18.11.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.17.tgz#5c009e1d9c38f4a2a9d45c0b0c493fe6cdb4bcb5" + integrity sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng== "@types/node@^14.14.2": - version "14.18.33" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.33.tgz#8c29a0036771569662e4635790ffa9e057db379b" - integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== + version "14.18.35" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.35.tgz#879c4659cb7b3fe515844f029c75079c941bb65c" + integrity sha512-2ATO8pfhG1kDvw4Lc4C0GXIMSQFFJBCo/R1fSgTwmUlq5oy95LXyjDQinsRVgQY6gp6ghh3H91wk9ES5/5C+Tw== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2466,9 +2469,9 @@ "@types/node" "*" "@types/prettier@^2.0.0": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/prop-types@*", "@types/prop-types@^15.7.3": version "15.7.5" @@ -2519,9 +2522,9 @@ "@types/react" "*" "@types/react@*", "@types/react@>=16.14.8", "@types/react@>=16.9.11": - version "18.0.25" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.25.tgz#8b1dcd7e56fe7315535a4af25435e0bb55c8ae44" - integrity sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g== + version "18.0.26" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" + integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2623,9 +2626,9 @@ "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.14.tgz#0943473052c24bd8cf2d1de25f1a710259327237" - integrity sha512-9Pj7abXoW1RSTcZaL2Hk6G2XyLMlp5ECdVC/Zf2p/KBjC3srijLGgRAXOBjtFrJoIrvxdTKyKDA14bEcbxBaWw== + version "17.0.17" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.17.tgz#5672e5621f8e0fca13f433a8017aae4b7a2a03e7" + integrity sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g== dependencies: "@types/yargs-parser" "*" @@ -3167,9 +3170,9 @@ address@1.1.2: integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== address@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.1.tgz#25bb61095b7522d65b357baa11bc05492d4c8acd" - integrity sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA== + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== adjust-sourcemap-loader@3.0.0: version "3.0.0" @@ -3651,9 +3654,9 @@ aws4@^1.8.0: integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axe-core@^4.4.3: - version "4.5.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.5.2.tgz#823fdf491ff717ac3c58a52631d4206930c1d9f7" - integrity sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA== + version "4.6.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.1.tgz#79cccdee3e3ab61a8f42c458d4123a6768e6fbce" + integrity sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w== axios@^0.18.0: version "0.18.1" @@ -4442,9 +4445,9 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== bignumber.js@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" - integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== binary-extensions@^1.0.0: version "1.13.1" @@ -4961,9 +4964,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001400: - version "1.0.30001434" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz#ec1ec1cfb0a93a34a0600d37903853030520a4e5" - integrity sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA== + version "1.0.30001441" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz#987437b266260b640a23cd18fbddb509d7f69f3e" + integrity sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg== capture-exit@^2.0.0: version "2.0.0" @@ -5901,14 +5904,14 @@ decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.2.1: - version "10.4.2" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.2.tgz#0341651d1d997d86065a2ce3a441fbd0d8e8b98e" - integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== decompress-response@^3.3.0: version "3.3.0" @@ -6384,11 +6387,6 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== - emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" @@ -6461,9 +6459,9 @@ error-stack-parser@^2.0.6: stackframe "^1.3.4" es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== + version "1.20.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.5.tgz#e6dc99177be37cacda5988e692c3fa8b218e95d2" + integrity sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -6471,6 +6469,7 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: function.prototype.name "^1.1.5" get-intrinsic "^1.1.3" get-symbol-description "^1.0.0" + gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" has-symbols "^1.0.3" @@ -6486,8 +6485,8 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" unbox-primitive "^1.0.2" es-array-method-boxes-properly@^1.0.0: @@ -7684,9 +7683,9 @@ fast-safe-stringify@^2.0.6: integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.14.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" + integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== dependencies: reusify "^1.0.4" @@ -8231,9 +8230,9 @@ globals@^12.1.0: type-fest "^0.8.1" globals@^13.6.0, globals@^13.9.0: - version "13.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" - integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== + version "13.19.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" + integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== dependencies: type-fest "^0.20.2" @@ -8754,9 +8753,9 @@ ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" - integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immediate@^3.2.3: version "3.3.0" @@ -8769,9 +8768,9 @@ immer@8.0.1: integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== immutable@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.0.tgz#c91f09108ed7504c2f0faec7222f40178ff97b11" + integrity sha512-h4ujZ0OZ3kpvdFcwJAHXEdvawH7J8TYTB62e8xI03OSZhuGpuPY9DPXnonMN8s+uQ56gMUqMK71mXU8ob20xfA== import-cwd@^2.0.0: version "2.1.0" @@ -8893,11 +8892,11 @@ internal-ip@^4.3.0: ipaddr.js "^1.9.0" internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" + integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== dependencies: - get-intrinsic "^1.1.0" + get-intrinsic "^1.1.3" has "^1.0.3" side-channel "^1.0.4" @@ -10140,9 +10139,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + version "2.2.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" + integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== jsonfile@^4.0.0: version "4.0.0" @@ -10255,17 +10254,17 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== -language-subtag-registry@~0.3.2: +language-subtag-registry@^0.3.20: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== language-tags@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + version "1.0.7" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.7.tgz#41cc248730f3f12a452c2e2efe32bc0bbce67967" + integrity sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw== dependencies: - language-subtag-registry "~0.3.2" + language-subtag-registry "^0.3.20" last-call-webpack-plugin@^3.0.0: version "3.0.0" @@ -10377,15 +10376,6 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - loader-utils@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" @@ -10900,6 +10890,13 @@ minipass@^3.0.0, minipass@^3.1.1: dependencies: yallist "^4.0.0" +minipass@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.0.tgz#7cebb0f9fa7d56f0c5b17853cbe28838a8dbbd3b" + integrity sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw== + dependencies: + yallist "^4.0.0" + minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -11167,9 +11164,9 @@ node-releases@^1.1.61: integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + version "2.0.8" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" + integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== node-sass@^4.14.1: version "4.14.1" @@ -12580,9 +12577,9 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po source-map "^0.6.1" postcss@^8.1.0: - version "8.4.19" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" - integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== + version "8.4.20" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56" + integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" @@ -12626,9 +12623,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.1.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" - integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== + version "2.8.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" + integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== pretty-bytes@^5.3.0: version "5.6.0" @@ -13055,9 +13052,9 @@ react-i18next@^11.15.3: html-parse-stringify "^3.0.1" react-icons@^4.3.1: - version "4.6.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.6.0.tgz#f83eda179af5d02c047449a20b702c858653d397" - integrity sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g== + version "4.7.1" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.7.1.tgz#0f4b25a5694e6972677cb189d2a72eabea7a8345" + integrity sha512-yHd3oKGMgm7zxo3EA7H2n7vxSoiGmHk5t6Ou4bXsfcgWyhfDKMpyKfhHR6Bjnn63c+YXBLBPUql9H4wPJM6sXw== react-is@^16.13.1, react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" @@ -13610,16 +13607,16 @@ resolve-pathname@^3.0.0: integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== resolve-url-loader@^3.1.2: - version "3.1.4" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz#3c16caebe0b9faea9c7cc252fa49d2353c412320" - integrity sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg== + version "3.1.5" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.5.tgz#1dce0847d4a2ef43c51f63c9fd30bf6dfbf26716" + integrity sha512-mgFMCmrV/tA4738EsFmPFE5/MaqSgUMe8LK971kVEKA/RrNVb7+VqFsg/qmKyythf34eyq476qIobP/gfFBGSQ== dependencies: adjust-sourcemap-loader "3.0.0" camelcase "5.3.1" compose-function "3.0.3" convert-source-map "1.7.0" es6-iterator "2.0.3" - loader-utils "1.2.3" + loader-utils "^1.2.3" postcss "7.0.36" rework "1.0.1" rework-visit "1.0.0" @@ -13899,9 +13896,9 @@ sass-loader@^10.0.4: semver "^7.3.2" sass@^1.27.0: - version "1.56.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.1.tgz#94d3910cd468fd075fa87f5bb17437a0b617d8a7" - integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ== + version "1.57.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5" + integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -14651,7 +14648,7 @@ string.prototype.trim@~1.2.6: define-properties "^1.1.4" es-abstract "^1.20.4" -string.prototype.trimend@^1.0.5: +string.prototype.trimend@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== @@ -14660,7 +14657,7 @@ string.prototype.trimend@^1.0.5: define-properties "^1.1.4" es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.5: +string.prototype.trimstart@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== @@ -14961,13 +14958,13 @@ tar@^2.0.0: inherits "2" tar@^6.0.2: - version "6.1.12" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.12.tgz#3b742fb05669b55671fb769ab67a7791ea1a62e6" - integrity sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw== + version "6.1.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" + integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^3.0.0" + minipass "^4.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -15034,9 +15031,9 @@ terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.3.4: - version "5.16.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.0.tgz#29362c6f5506e71545c73b069ccd199bb28f7f54" - integrity sha512-KjTV81QKStSfwbNiwlBXfcgMcOloyuRdb62/iLFPGBcVNF4EXjhdYBhYHmbJpiBrVxZhDvltE11j+LBQUxEEJg== + version "5.16.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" + integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" From 537c5a189ecf813ba5a02b86bc3e52716538770e Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 22 Dec 2022 19:32:38 -0600 Subject: [PATCH 201/278] added market price --- src/App.tsx | 2 +- src/components/Summary/Indexes.tsx | 32 ++- src/components/Summary/Protocol.tsx | 3 +- src/components/Summary/Summary.tsx | 45 +++- src/components/Summary/index.tsx | 46 +++- yarn.lock | 367 ++++++++++++++-------------- 6 files changed, 288 insertions(+), 207 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 74abd80..61cf4f5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1024,7 +1024,7 @@ const App = () => { - + diff --git a/src/components/Summary/Indexes.tsx b/src/components/Summary/Indexes.tsx index a552aab..fd8a52f 100644 --- a/src/components/Summary/Indexes.tsx +++ b/src/components/Summary/Indexes.tsx @@ -24,7 +24,12 @@ const Indexes = ({ currentChainId, ethCallProvider }: props) => { const [totalSupply, setTotalSupply] = useState("0.0"); const loadData = async () => { - if (oracles.tcapOracleRead && tokens && !isUndefined(tokens.tcapTokenRead)) { + if ( + oracles.tcapOracleRead && + tokens && + !isUndefined(tokens.tcapTokenRead) && + !isUndefined(ethCallProvider) + ) { const currentTotalSupplyCall = await tokens.tcapTokenRead?.totalSupply(); const currentIndexPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); @@ -33,15 +38,34 @@ const Indexes = ({ currentChainId, ethCallProvider }: props) => { currentTotalSupplyCall, currentIndexPriceCall, ]); + setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); const totalIndexMarketCap = currentIndexPrice.mul(10000000000); const indexPrice = ethers.utils.formatEther(totalIndexMarketCap.div(10000000000)); setMarketCap(ethers.utils.formatEther(totalIndexMarketCap)); setIndexOraclePrice(indexPrice); - /* await fetch("https://api.cryptex.finance/tcap-market-price") - .then((response) => response.json()) - .then((data) => setIndexMarketPrice(data)); */ + const urlParams = new URLSearchParams({ + ids: "total-crypto-market-cap-token", + vs_currencies: "usd", + include_last_updated_at: true, + precision: 10, + }); + + const reponse = await fetch( + "https://api.coingecko.com/api/v3/simple/price?".concat(urlParams.toString()), + { + method: "GET", + mode: "cors", + headers: { + "Content-Type": "application/json", + }, + } + ); + const resp = await reponse.json(); + if (resp) { + setIndexMarketPrice(resp["total-crypto-market-cap-token"].usd); + } } }; diff --git a/src/components/Summary/Protocol.tsx b/src/components/Summary/Protocol.tsx index 58cc793..51a79cf 100644 --- a/src/components/Summary/Protocol.tsx +++ b/src/components/Summary/Protocol.tsx @@ -233,7 +233,6 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => { }, onCompleted: (data: any) => { if (!isUndefined(data)) { - console.log("-- data --", data); loadStaked(data); } }, @@ -245,7 +244,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => { }; load(); // eslint-disable-next-line - }, [currentChainId]); + }, [currentChainId, ethCallProvider]); return (
diff --git a/src/components/Summary/Summary.tsx b/src/components/Summary/Summary.tsx index 3c75923..20b47e0 100644 --- a/src/components/Summary/Summary.tsx +++ b/src/components/Summary/Summary.tsx @@ -18,9 +18,10 @@ const clientOracle = (graphqlEndpoint: string) => type props = { signerAddress: string; + signerChainId: number; }; -const Summary = ({ signerAddress }: props) => { +const Summary = ({ signerAddress, signerChainId }: props) => { const options = [ { id: "0", name: "My Balance" }, { id: "1", name: "TCAP Summary" }, @@ -38,8 +39,30 @@ const Summary = ({ signerAddress }: props) => { { id: NETWORKS.okovan.chainId, name: "OKovan" }, ]; } - const [currentOption, setCurrentOption] = useState(options[0]); - const [currentChain, setCurrentChain] = useState(chains[0]); + const [currentOption, setCurrentOption] = useState( + signerAddress !== "" ? options[0] : options[1] + ); + + const getDefaultChain = () => { + if (process.env.REACT_APP_NETWORK_ID === "1") { + if (signerChainId === NETWORKS.mainnet.chainId) { + return chains[0]; + } + if (signerChainId === NETWORKS.arbitrum.chainId) { + return chains[1]; + } + return chains[2]; + } + if (signerChainId === NETWORKS.goerli.chainId) { + return chains[0]; + } + if (signerChainId === NETWORKS.arbitrum_goerli.chainId) { + return chains[1]; + } + return chains[2]; + }; + + const [currentChain, setCurrentChain] = useState(getDefaultChain()); const [currentEthProvider, setCurrentEthProvider] = useState(); const [apolloClient, setApolloClient] = useState( clientOracle( @@ -103,11 +126,17 @@ const Summary = ({ signerAddress }: props) => {
{currentOption.name}
- {options.map((item) => ( - - {item.name} + {signerAddress !== "" && ( + + {options[0].name} - ))} + )} + + {options[1].name} + + + {options[2].name} + handleChainChange(eventKey || "1")}> @@ -125,7 +154,7 @@ const Summary = ({ signerAddress }: props) => { - {currentOption.id === options[0].id && ( + {currentOption.id === options[0].id && signerAddress !== "" && ( { + const signer = useContext(signerContext); + const [loading, setLoading] = useState(true); + const [signerAddress, setSignerAddress] = useState(""); + const [signerChainId, setSignerChainId] = useState( + process.env.REACT_APP_NETWORK_ID === "1" ? NETWORKS.mainnet.chainId : NETWORKS.goerli.chainId + ); + + useEffect(() => { + const load = async () => { + if (signer.signer) { + setSignerAddress(await signer.signer.getAddress()); + setSignerChainId(await signer.signer.getChainId()); + } + setLoading(false); + }; + load(); + // eslint-disable-next-line + }, [signer.signer]); -const SummaryPage = ({ signerAddress }: props) => ( -
- - -
-); + return ( +
+ + {loading ? ( +
+ +
+ ) : ( + + )} +
+ ); +}; export default SummaryPage; diff --git a/yarn.lock b/yarn.lock index ecf2776..b5e262e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,9 +16,9 @@ "@jridgewell/trace-mapping" "^0.3.9" "@apollo/client@^3.7.1": - version "3.7.2" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.2.tgz#71b6846c1d99b81d041a1134f5679e30ec0363a0" - integrity sha512-ohAIpXl3mTa1Fd3GT/K37VwQJfTIuuJRp4aOlJ4q/hlx0Wxh+RqDrbn0awtVCOdhGDQN+CQQmVzIqFKn6GziXQ== + version "3.7.3" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.3.tgz#ab3fe31046e74bc1a3762363a185ba5bcfffc58b" + integrity sha512-nzZ6d6a4flLpm3pZOGpuAUxLlp9heob7QcCkyIqZlCLvciUibgufRfYTwfkWCc4NaGHGSZyodzvfr79H6oUwGQ== dependencies: "@graphql-typed-document-node/core" "^3.1.1" "@wry/context" "^0.7.0" @@ -55,7 +55,7 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== @@ -83,32 +83,32 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.5", "@babel/core@^7.8.4", "@babel/core@^7.9.0": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" - integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.7.tgz#37072f951bd4d28315445f66e0ec9f6ae0c8c35f" + integrity sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-module-transforms" "^7.20.2" - "@babel/helpers" "^7.20.5" - "@babel/parser" "^7.20.5" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.7" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" - integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== +"@babel/generator@^7.12.1", "@babel/generator@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" + integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== dependencies: - "@babel/types" "^7.20.5" + "@babel/types" "^7.20.7" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -127,27 +127,28 @@ "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" - integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== +"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== dependencies: - "@babel/compat-data" "^7.20.0" + "@babel/compat-data" "^7.20.5" "@babel/helper-validator-option" "^7.18.6" browserslist "^4.21.3" + lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.2", "@babel/helper-create-class-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz#327154eedfb12e977baa4ecc72e5806720a85a06" - integrity sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz#d0e1f8d7e4ed5dac0389364d9c0c191d948ade6f" + integrity sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": @@ -197,12 +198,12 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== +"@babel/helper-member-expression-to-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" + integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.20.7" "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.18.6": version "7.18.6" @@ -211,19 +212,19 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" - integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz#7a6c9a1155bef55e914af574153069c9d9470c43" + integrity sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" "@babel/helper-simple-access" "^7.20.2" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -237,7 +238,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": +"@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== @@ -247,25 +248,26 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" - integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== dependencies: "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.19.1" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" -"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": +"@babel/helper-simple-access@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: "@babel/types" "^7.20.2" -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== @@ -304,14 +306,14 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.12.1", "@babel/helpers@^7.20.5": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" - integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== +"@babel/helpers@^7.12.1", "@babel/helpers@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" + integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" @@ -322,10 +324,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5", "@babel/parser@^7.7.0": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" - integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.7.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" + integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -335,21 +337,21 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" "@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" - integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -362,22 +364,22 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" + integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.5.tgz#28ba1a0e5044664a512967a19407d7fc26925394" - integrity sha512-Lac7PpRJXcC3s9cKsBfl+uc+DYXU5FD06BrTFunQO6QIQT+DwyzDPURAowI3bcvD1dZF/ank1Z5rstUJn3Hn4Q== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.7.tgz#05d37453c2ce818f3e47bbeda9468c8de947eecc" + integrity sha512-JB45hbUweYpwAGjkiM7uCyXMENH2lG+9r3G2E+ttc2PRXAoEkpfd/KW5jDg4j8RS6tLtTG1jZi9LbHZVSfs1/A== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-create-class-features-plugin" "^7.20.7" "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/plugin-syntax-decorators" "^7.19.0" @@ -406,11 +408,11 @@ "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-proposal-logical-assignment-operators@^7.12.1", "@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": @@ -430,15 +432,15 @@ "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" - integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-parameters" "^7.20.7" "@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" @@ -448,13 +450,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== +"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" + integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": @@ -631,20 +633,20 @@ "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== dependencies: "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" @@ -654,38 +656,39 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz#401215f9dc13dc5262940e2e527c9536b3d7f237" - integrity sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA== + version "7.20.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.8.tgz#ad142bce04ae32225e2379ca54f06d5cea92fdb8" + integrity sha512-ztBCIWJvcWJvtxhMqIrItLmGlbxaa/5hl7HlZvV4f9oS08wWn/mEtf5D35qxFp3rTK8KjV9TePEoeal8z02gzA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" - integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" + integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" "@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" - integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" + integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -751,21 +754,21 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" - integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.7.tgz#1e5cfeb4e5f9b392e86f85698896336b442f8760" + integrity sha512-+1IVLD+dHOzRZWNFFSoyPZz4ffsVmOP+OhhjeahLKpU97v/52LcCb9RabRl5eHM1/HAuH5Dl0q9Pyzrq1v2otQ== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-module-transforms" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" - integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.7.tgz#abb5f84695e74d46acf48244082f6cbf8bb23120" + integrity sha512-76jqqFiFdCD+RJwEdtBHUG2/rEKQAmpejPbAKyQECEE3/y4U5CMPc9IXvipS990vgQhzq+ZRw6WJ+q4xJ/P24w== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-module-transforms" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" "@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.19.6": version "7.19.6" @@ -808,10 +811,10 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz#f8f9186c681d10c3de7620c916156d893c8a019e" - integrity sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ== +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" + integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -844,15 +847,15 @@ "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx@^7.18.6": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" - integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz#025d85a1935fd7e19dfdcb1b1d4df34d4da484f7" + integrity sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.19.0" + "@babel/types" "^7.20.7" "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" @@ -897,12 +900,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" - integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-transform-sticky-regex@^7.12.1", "@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" @@ -926,11 +929,11 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.18.6": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" - integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz#673f49499cd810ae32a1ea5f3f8fab370987e055" + integrity sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-create-class-features-plugin" "^7.20.7" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-typescript" "^7.20.0" @@ -1135,49 +1138,49 @@ "@babel/plugin-transform-typescript" "^7.18.6" "@babel/runtime-corejs3@^7.10.2": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz#63dae945963539ab0ad578efbf3eff271e7067ae" - integrity sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.7.tgz#a1e5ea3d758ba6beb715210142912e3f29981d84" + integrity sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg== dependencies: core-js-pure "^3.25.1" regenerator-runtime "^0.13.11" "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.19.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" - integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" + integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.10.4", "@babel/template@^7.18.10", "@babel/template@^7.3.3": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== +"@babel/template@^7.10.4", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" - integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": + version "7.20.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.8.tgz#e3a23eb04af24f8bbe8a8ba3eef6155b77df0b08" + integrity sha512-/RNkaYDeCy4MjyV70+QkSHhxbvj2JO/5Ft2Pa880qJOG8tWrqcT/wXUuCCv43yogfqPzHL77Xu101KQPf4clnQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" + "@babel/generator" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.5" - "@babel/types" "^7.20.5" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" - integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== dependencies: "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" @@ -4958,9 +4961,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001400: - version "1.0.30001439" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz#ab7371faeb4adff4b74dad1718a6fd122e45d9cb" - integrity sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A== + version "1.0.30001441" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz#987437b266260b640a23cd18fbddb509d7f69f3e" + integrity sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg== capture-exit@^2.0.0: version "2.0.0" @@ -8762,9 +8765,9 @@ immer@8.0.1: integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== immutable@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.0.tgz#c91f09108ed7504c2f0faec7222f40178ff97b11" + integrity sha512-h4ujZ0OZ3kpvdFcwJAHXEdvawH7J8TYTB62e8xI03OSZhuGpuPY9DPXnonMN8s+uQ56gMUqMK71mXU8ob20xfA== import-cwd@^2.0.0: version "2.1.0" From 033816e82207b0c5cbbf61540ec574dcffaf4a5d Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 23 Dec 2022 11:24:20 -0600 Subject: [PATCH 202/278] mobile fixes --- src/components/Summary/Features.tsx | 2 +- src/components/Summary/index.tsx | 10 +---- .../Summary/warnings/VaultsWarning.tsx | 4 +- src/styles/summary.scss | 45 +++++++++++++++++++ 4 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/components/Summary/Features.tsx b/src/components/Summary/Features.tsx index d122a00..74f4684 100644 --- a/src/components/Summary/Features.tsx +++ b/src/components/Summary/Features.tsx @@ -38,7 +38,7 @@ const Features = () => { }} >
- +

Providing liquidity

diff --git a/src/components/Summary/index.tsx b/src/components/Summary/index.tsx index 83a5360..0e6b682 100644 --- a/src/components/Summary/index.tsx +++ b/src/components/Summary/index.tsx @@ -1,5 +1,5 @@ import React, { useContext, useEffect, useState } from "react"; -import { Spinner } from "react-bootstrap/esm/"; +// import { Spinner } from "react-bootstrap/esm/"; import "../../styles/summary.scss"; import { signerContext } from "../../state"; import Features from "./Features"; @@ -29,13 +29,7 @@ const SummaryPage = () => { return (
- {loading ? ( -
- -
- ) : ( - - )} + {!loading && }
); }; diff --git a/src/components/Summary/warnings/VaultsWarning.tsx b/src/components/Summary/warnings/VaultsWarning.tsx index 7e2c59d..955d89d 100644 --- a/src/components/Summary/warnings/VaultsWarning.tsx +++ b/src/components/Summary/warnings/VaultsWarning.tsx @@ -22,11 +22,9 @@ export const VaultsWarning = ({ chainId, ethCallProvider, ownerAddress }: props) const [loadingVaults, setLoadingVaults] = useState(false); const [liquidableVaults, setLiquidableVaults] = useState(0); - console.log("ownerAddress: ", ownerAddress); - const VAULTS = gql` query ownerVaults($ownerAddress: String!) { - vaults(where: { owner: $ownerAddress }) { + vaults(where: { owner: $ownerAddress, debt_gt: 0 }) { id vaultId owner diff --git a/src/styles/summary.scss b/src/styles/summary.scss index 983e888..baff5bc 100644 --- a/src/styles/summary.scss +++ b/src/styles/summary.scss @@ -121,6 +121,10 @@ } .feature-content { display: flex; + align-items: center; + p { + text-align: left; + } svg { height: 25px; @@ -250,4 +254,45 @@ } } } + + @media (max-width: 600px) { + padding: 3rem 0.5rem; + + .card { + padding: 1.5rem 0.5rem; + margin-bottom: 3rem; + } + + .features { + .btn-feature { + padding: 0rem 1rem; + } + .feature-content { + p { + font-size: 0.8rem; + } + svg { + height: 45px; + margin-right: 0.7rem; + } + .farm-icon { + height: 17px; + } + } + } + + .protocol, + .indexes, + .balance { + .detail { + display: grid; + grid-template-columns: 100%; + } + + .market-cap { + grid-column-start: 1; + grid-column-end: 2; + } + } + } } From 5cf7e8ec14cbabd96163828e2924360bfada0967 Mon Sep 17 00:00:00 2001 From: Crisgarner <@crisgarner> Date: Mon, 26 Dec 2022 17:23:52 -0600 Subject: [PATCH 203/278] removed old packages --- package.json | 3 - src/App.tsx | 2 +- src/state/Web3ModalContext.tsx | 30 +- yarn.lock | 1670 ++------------------------------ 4 files changed, 61 insertions(+), 1644 deletions(-) diff --git a/package.json b/package.json index aa5570c..46083da 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,6 @@ "@apollo/client": "^3.2.5", "@davatar/react": "^1.8.1", "@ethersproject/abi": "5.0.0", - "@portis/web3": "^2.0.0-beta.59", "@react-hook/media-query": "^1.1.1", "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", @@ -17,11 +16,9 @@ "@types/react": "^16.9.53", "@types/react-dom": "^16.9.8", "@walletconnect/web3-provider": "^1.3.6", - "authereum": "^0.1.0", "bootstrap": "^4.5.3", "ethers": "^5.5.2", "ethers-multicall": "^0.2.1", - "fortmatic": "^2.2.1", "graphql": "^15.4.0", "react": "^17.0.1", "react-bootstrap": "^1.4.0", diff --git a/src/App.tsx b/src/App.tsx index 8332591..180d53b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -490,7 +490,7 @@ const App = () => { } }; - web3Modal.on("connect", async (networkProvider) => { + web3Modal.on("connect", async (networkProvider: ethers.providers.ExternalProvider | ethers.providers.JsonRpcFetchFunc) => { setLoading(true); const currentProvider = new ethers.providers.Web3Provider(networkProvider); const network = await currentProvider.getNetwork(); diff --git a/src/state/Web3ModalContext.tsx b/src/state/Web3ModalContext.tsx index 749d83a..8d6a9c5 100644 --- a/src/state/Web3ModalContext.tsx +++ b/src/state/Web3ModalContext.tsx @@ -1,11 +1,8 @@ import React from "react"; import Web3Modal from "web3modal"; -import Portis from "@portis/web3"; import WalletConnectProvider from "@walletconnect/web3-provider"; -import Authereum from "authereum"; import WalletLink from "walletlink"; -import Fortmatic from "fortmatic"; import { NETWORKS } from "../utils/constants"; let network = "mainnet"; @@ -47,28 +44,13 @@ const providerOptions = { infuraId: process.env.REACT_APP_INFURA_ID, // required }, }, - fortmatic: { - package: Fortmatic, - options: { - key: process.env.REACT_APP_FORTMATIC_KEY, - network: { - chainId: process.env.REACT_APP_NETWORK_ID, - rpcUrl: - process.env.REACT_APP_NETWORK_ID === "1" - ? NETWORKS.mainnet.infuraFortmaticRpcUrl - : NETWORKS.rinkeby.infuraFortmaticRpcUrl, - }, // if we don't pass it, it will default to localhost:8454 - }, - }, - portis: { - package: Portis, // required - options: { - id: process.env.REACT_APP_PORTIS_ID, + "custom-example": { + display: { + logo: "data:image/gif;base64,INSERT_BASE64_STRING", + name: "OKX", + description: "Connect to your example provider account" }, - }, - authereum: { - package: Authereum, // required - }, + } }; const web3Modal = new Web3Modal({ diff --git a/yarn.lock b/yarn.lock index 293cc84..6f72351 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1909,44 +1909,6 @@ resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz" integrity sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA== -"@portis/web3-provider-engine@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@portis/web3-provider-engine/-/web3-provider-engine-1.1.2.tgz" - integrity sha512-NiiF0UPfngf4ulo32ybEDAMaad4i7h44HJaN8ea8HHt/vaFiUcPtINjC2o21jhWaLANerW4ZbOrNs1iCLH4p6A== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^4.2.0" - eth-json-rpc-filters "^4.0.2" - eth-json-rpc-infura "^3.1.0" - eth-json-rpc-middleware "^5.0.2" - eth-sig-util "2.5.3" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" - -"@portis/web3@^2.0.0-beta.59": - version "2.0.0-beta.59" - resolved "https://registry.npmjs.org/@portis/web3/-/web3-2.0.0-beta.59.tgz" - integrity sha512-QdIdrI3uK+TyT+dxRK5bEYOi2PBlUDJ7vszR2uu0bT49wy7O52B9td6fL/5gsfk0VpCsmrYov3x3gEQYwGUyvQ== - dependencies: - "@portis/web3-provider-engine" "1.1.2" - ethereumjs-util "5.2.0" - penpal "3.0.7" - pocket-js-core "0.0.3" - "@react-hook/media-query@^1.1.1": version "1.1.1" resolved "https://registry.npmjs.org/@react-hook/media-query/-/media-query-1.1.1.tgz" @@ -3116,11 +3078,6 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" @@ -3211,11 +3168,6 @@ array-differ@^3.0.0: resolved "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" @@ -3277,11 +3229,6 @@ array.prototype.flatmap@^1.2.5: define-properties "^1.1.3" es-abstract "^1.19.0" -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - arrify@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz" @@ -3366,11 +3313,6 @@ async-mutex@^0.2.6: dependencies: tslib "^2.0.0" -async@3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/async/-/async-3.2.0.tgz" - integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== - async@^1.4.2: version "1.5.2" resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" @@ -3398,26 +3340,6 @@ atob@^2.1.2: resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -authereum@^0.1.0: - version "0.1.14" - resolved "https://registry.npmjs.org/authereum/-/authereum-0.1.14.tgz" - integrity sha512-o1lsXXGg+oYDAEutZ8Ak1Qn2Dnk+qSyQ2ZokyLHRSYGJj6HpEHaSlQA6W3VTHD5r68Q+W0JD/BN9hDSF2xyshQ== - dependencies: - async "3.2.0" - bn.js "5.1.2" - ethereum-private-key-to-address "0.0.3" - ethers "4.0.47" - eventemitter3 "4.0.0" - is-buffer "2.0.4" - penpal "4.1.1" - pify "4.0.1" - querystring "0.2.0" - store "2.0.12" - to-hex "0.0.11" - uuidv4 "6.0.6" - web3-provider-engine "15.0.4" - web3-utils "1.2.1" - autoprefixer@^9.6.1: version "9.8.8" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz" @@ -3446,53 +3368,11 @@ axe-core@^4.3.5: resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz" integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA== -axios@^0.18.0: - version "0.18.1" - resolved "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz" - integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== - dependencies: - follow-redirects "1.5.10" - is-buffer "^2.0.2" - axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.0.14, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - babel-eslint@^10.1.0: version "10.1.0" resolved "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz" @@ -3512,133 +3392,6 @@ babel-extract-comments@^1.0.0: dependencies: babylon "^6.18.0" -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-jest@^26.6.0, babel-jest@^26.6.3: version "26.6.3" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz" @@ -3664,20 +3417,6 @@ babel-loader@8.1.0: pify "^4.0.1" schema-utils "^2.6.5" -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" @@ -3754,16 +3493,6 @@ babel-plugin-polyfill-regenerator@^0.3.0: babel-plugin-syntax-jsx "^6.18.0" lodash "^4.17.11" -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" @@ -3774,219 +3503,6 @@ babel-plugin-syntax-object-rest-spread@^6.8.0: resolved "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz" integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - babel-plugin-transform-object-rest-spread@^6.26.0: version "6.26.0" resolved "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz" @@ -4000,21 +3516,6 @@ babel-plugin-transform-react-remove-prop-types@^0.4.24: resolved "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz" integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" @@ -4033,42 +3534,6 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - babel-preset-jest@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz" @@ -4099,20 +3564,7 @@ babel-preset-react-app@^10.0.0: babel-plugin-macros "^3.1.0" babel-plugin-transform-react-remove-prop-types "^0.4.24" -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -4120,50 +3572,6 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babelify@^7.3.0: - version "7.3.0" - resolved "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz" - integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= - dependencies: - babel-core "^6.0.14" - object-assign "^4.0.0" - babylon@^6.18.0: version "6.18.0" resolved "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz" @@ -4253,20 +3661,13 @@ bind-decorator@^1.0.11: resolved "https://registry.npmjs.org/bind-decorator/-/bind-decorator-1.0.11.tgz" integrity sha1-5BvAah9l3ZzsR2yRxdrzl4SIJS8= -bindings@^1.2.1, bindings@^1.5.0: +bindings@^1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" -bip66@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz" - integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= - dependencies: - safe-buffer "^5.0.1" - blakejs@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz" @@ -4277,22 +3678,12 @@ bluebird@^3.5.5: resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" - integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= - bn.js@4.11.8: version "4.11.8" resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -bn.js@5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz" - integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -4381,7 +3772,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6, browserify-aes@^1.2.0: +browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -4452,14 +3843,6 @@ browserslist@4.14.2: escalade "^3.0.2" node-releases "^1.1.61" -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.5, browserslist@^4.19.1, browserslist@^4.6.2, browserslist@^4.6.4: version "4.19.1" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz" @@ -4527,11 +3910,6 @@ buffer-indexof@^1.0.0: resolved "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz" integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== -buffer-to-arraybuffer@^0.0.5: - version "0.0.5" - resolved "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz" - integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" @@ -4546,7 +3924,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.2.1, buffer@^5.4.3: +buffer@^5.4.3: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -4554,14 +3932,6 @@ buffer@^5.2.1, buffer@^5.4.3: base64-js "^1.3.1" ieee754 "^1.1.13" -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - builtin-modules@^3.1.0: version "3.2.0" resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz" @@ -4642,7 +4012,7 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: +call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -4682,25 +4052,11 @@ camel-case@^4.1.1: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" @@ -4721,7 +4077,7 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001286: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001286: version "1.0.30001298" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz" integrity sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ== @@ -4752,17 +4108,6 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - chalk@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" @@ -5073,7 +4418,7 @@ concat-map@0.0.1: resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0, concat-stream@^1.5.1: +concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -5127,7 +4472,7 @@ convert-source-map@^0.3.3: resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz" integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= -convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== @@ -5186,7 +4531,7 @@ core-js-pure@^3.20.2: resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.2.tgz" integrity sha512-CmWHvSKn2vNL6p6StNp1EmMIfVY/pqn3JLAjfZQ8WZGPOlGoO92EkX9/Mk81i6GxvoPXjUqEQnpM3rJ5QxxIOg== -core-js@^2.4.0, core-js@^2.5.0: +core-js@^2.4.0: version "2.6.12" resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== @@ -5258,7 +4603,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-fetch@^2.1.0, cross-fetch@^2.1.1: +cross-fetch@^2.1.0: version "2.2.5" resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.5.tgz" integrity sha512-xqYAhQb4NhCJSRym03dwxpP1bYXpK3y7UN83Bo2WFi3x1Zmzn0SL/6xGoPr+gpt4WmNrgCCX3HPysvOwFOW36w== @@ -5563,13 +4908,6 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz" integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - cyclist@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz" @@ -5604,7 +4942,7 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -5618,13 +4956,6 @@ debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" -debug@=3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - debug@^3.1.1, debug@^3.2.5, debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -5632,15 +4963,7 @@ debug@^3.1.1, debug@^3.2.5, debug@^3.2.7: dependencies: ms "^2.1.1" -decamelize-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: +decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -5655,19 +4978,12 @@ decode-uri-component@^0.2.0: resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - dedent@^0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-equal@^1.0.1, deep-equal@~1.1.1: +deep-equal@^1.0.1: version "1.1.1" resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== @@ -5733,11 +5049,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - del@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/del/-/del-4.1.1.tgz" @@ -5789,13 +5100,6 @@ detect-browser@^5.1.0: resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz" integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" @@ -5997,22 +5301,6 @@ dotenv@8.2.0: resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== -dotignore@~0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz" - integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== - dependencies: - minimatch "^3.0.4" - -drbg.js@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz" - integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= - dependencies: - browserify-aes "^1.0.6" - create-hash "^1.1.2" - create-hmac "^1.1.4" - duplexer@^0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" @@ -6046,25 +5334,12 @@ ejs@^2.6.1: resolved "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.17: +electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.17: version "1.4.41" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.41.tgz" integrity sha512-VQEXEJc+8rJIva85H8EPtB5Ux9g8TzkNGBanqphM9ZWMZ34elueKJ+5g+BPhz3Lk8gkujfQRcIZ+fpA0btUIuw== -elliptic@6.5.2: - version "6.5.2" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -6112,13 +5387,6 @@ encodeurl@~1.0.2: resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" @@ -6249,7 +5517,7 @@ escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -6629,7 +5897,7 @@ etag@~1.8.1: resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eth-block-tracker@4.4.3, eth-block-tracker@^4.2.0, eth-block-tracker@^4.4.2: +eth-block-tracker@4.4.3, eth-block-tracker@^4.4.2: version "4.4.3" resolved "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz" integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== @@ -6641,14 +5909,7 @@ eth-block-tracker@4.4.3, eth-block-tracker@^4.2.0, eth-block-tracker@^4.4.2: pify "^3.0.0" safe-event-emitter "^1.0.1" -eth-json-rpc-errors@^1.0.1: - version "1.1.1" - resolved "https://registry.npmjs.org/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz" - integrity sha512-WT5shJ5KfNqHi9jOZD+ID8I1kuYWNrigtZat7GOQkvwo99f8SzAVaEcWhJUv656WiZOAg3P1RiJQANtUmDmbIg== - dependencies: - fast-safe-stringify "^2.0.6" - -eth-json-rpc-filters@4.2.2, eth-json-rpc-filters@^4.0.2, eth-json-rpc-filters@^4.1.1, eth-json-rpc-filters@^4.2.1: +eth-json-rpc-filters@4.2.2, eth-json-rpc-filters@^4.2.1: version "4.2.2" resolved "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz" integrity sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw== @@ -6660,26 +5921,6 @@ eth-json-rpc-filters@4.2.2, eth-json-rpc-filters@^4.0.2, eth-json-rpc-filters@^4 json-rpc-engine "^6.1.0" pify "^5.0.0" -eth-json-rpc-infura@^3.1.0: - version "3.2.1" - resolved "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz" - integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== - dependencies: - cross-fetch "^2.1.1" - eth-json-rpc-middleware "^1.5.0" - json-rpc-engine "^3.4.0" - json-rpc-error "^2.0.0" - -eth-json-rpc-infura@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-4.1.0.tgz" - integrity sha512-DFYitKovzVlCdUulEccdm4g6k/vnvyByuw7rd5OoWDBSIiaeinI8Z/SntLjSIs2c+YvE20DGwk/GLwZGCWDN1Q== - dependencies: - eth-json-rpc-middleware "^4.4.0" - eth-rpc-errors "^3.0.0" - json-rpc-engine "^5.1.3" - node-fetch "^2.6.0" - eth-json-rpc-infura@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz" @@ -6690,65 +5931,6 @@ eth-json-rpc-infura@^5.1.0: json-rpc-engine "^5.3.0" node-fetch "^2.6.0" -eth-json-rpc-middleware@^1.5.0: - version "1.6.0" - resolved "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz" - integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== - dependencies: - async "^2.5.0" - eth-query "^2.1.2" - eth-tx-summary "^3.1.2" - ethereumjs-block "^1.6.0" - ethereumjs-tx "^1.3.3" - ethereumjs-util "^5.1.2" - ethereumjs-vm "^2.1.0" - fetch-ponyfill "^4.0.0" - json-rpc-engine "^3.6.0" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - tape "^4.6.3" - -eth-json-rpc-middleware@^4.1.5, eth-json-rpc-middleware@^4.4.0: - version "4.4.1" - resolved "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.1.tgz" - integrity sha512-yoSuRgEYYGFdVeZg3poWOwAlRI+MoBIltmOB86MtpoZjvLbou9EB/qWMOWSmH2ryCWLW97VYY6NWsmWm3OAA7A== - dependencies: - btoa "^1.2.1" - clone "^2.1.1" - eth-json-rpc-errors "^1.0.1" - eth-query "^2.1.2" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.6.0" - ethereumjs-tx "^1.3.7" - ethereumjs-util "^5.1.2" - ethereumjs-vm "^2.6.0" - fetch-ponyfill "^4.0.0" - json-rpc-engine "^5.1.3" - json-stable-stringify "^1.0.1" - pify "^3.0.0" - safe-event-emitter "^1.0.1" - -eth-json-rpc-middleware@^5.0.2: - version "5.1.0" - resolved "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-5.1.0.tgz" - integrity sha512-0uq8nWgHWLKA0sMhVqViue3vSEBVuQXyk2yzjhe8GSo/dGpJUtmYN1DvDF1LQtEhHI4N/G6MKPbiR/aWSRkPmg== - dependencies: - btoa "^1.2.1" - clone "^2.1.1" - eth-query "^2.1.2" - eth-rpc-errors "^3.0.0" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.6.0" - ethereumjs-tx "^1.3.7" - ethereumjs-util "^5.1.2" - ethereumjs-vm "^2.6.0" - json-rpc-engine "^5.3.0" - json-stable-stringify "^1.0.1" - node-fetch "^2.6.1" - pify "^3.0.0" - safe-event-emitter "^1.0.1" - eth-json-rpc-middleware@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz" @@ -6766,16 +5948,7 @@ eth-json-rpc-middleware@^6.0.0: pify "^3.0.0" safe-event-emitter "^1.0.1" -eth-lib@0.2.7: - version "0.2.7" - resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz" - integrity sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco= - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: +eth-query@^2.1.0, eth-query@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz" integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= @@ -6804,18 +5977,6 @@ eth-rpc-errors@^4.0.2: dependencies: fast-safe-stringify "^2.0.6" -eth-sig-util@2.5.3: - version "2.5.3" - resolved "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.5.3.tgz" - integrity sha512-KpXbCKmmBUNUTGh9MRKmNkIPietfhzBqqYqysDavLseIiMUGl95k6UcPEkALAZlj41e9E6yioYXc1PC333RKqw== - dependencies: - buffer "^5.2.1" - elliptic "^6.4.0" - ethereumjs-abi "0.6.5" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.0" - tweetnacl-util "^0.15.0" - eth-sig-util@^1.4.2: version "1.4.2" resolved "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz" @@ -6824,30 +5985,6 @@ eth-sig-util@^1.4.2: ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" ethereumjs-util "^5.1.1" -eth-tx-summary@^3.1.2: - version "3.2.4" - resolved "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz" - integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== - dependencies: - async "^2.1.2" - clone "^2.0.0" - concat-stream "^1.5.1" - end-of-stream "^1.1.0" - eth-query "^2.0.2" - ethereumjs-block "^1.4.1" - ethereumjs-tx "^1.1.1" - ethereumjs-util "^5.0.1" - ethereumjs-vm "^2.6.0" - through2 "^2.0.3" - -ethereum-checksum-address@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/ethereum-checksum-address/-/ethereum-checksum-address-0.0.2.tgz" - integrity sha512-GAb7mPvGgcfi1j+Bsnwm9af9Z7dLUKp+5cFm88+kMrKACfh9gLatGLVVK5pSGEG2pOGfrmqCRcuh3RtMjIg8GQ== - dependencies: - keccak256 "^1.0.0" - meow "^5.0.0" - ethereum-common@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz" @@ -6879,41 +6016,6 @@ ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" -ethereum-private-key-to-address@0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/ethereum-private-key-to-address/-/ethereum-private-key-to-address-0.0.3.tgz" - integrity sha512-P+z9eFlgOezxogEpY1sQR155U4xFmQUWVxKzIJa5BL05Gs7zL0sYuyQuSAme8LBYGQ6p6AwconiMDauf4LbqyA== - dependencies: - ethereum-private-key-to-public-key "0.0.2" - ethereum-public-key-to-address "0.0.1" - meow "^5.0.0" - -ethereum-private-key-to-public-key@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/ethereum-private-key-to-public-key/-/ethereum-private-key-to-public-key-0.0.2.tgz" - integrity sha512-WKwFspLS5IdpV1rBUmWSG2xtIDV7YMpAG/uSjtV9kDzBU6hpSzoqg6R/e1iEfHkOr/eae+NtDTpwzXRtSMDvhw== - dependencies: - meow "^5.0.0" - secp256k1 "^3.7.1" - -ethereum-public-key-to-address@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/ethereum-public-key-to-address/-/ethereum-public-key-to-address-0.0.1.tgz" - integrity sha512-X78x/VBluHUdrYpZunoXJ48luXTaUiUK4ImPjTjI+XiS24+jUR5WFCpm9wCNbLYP6/ZCJ+lwuYormXSjt8rrbw== - dependencies: - ethereum-checksum-address "0.0.2" - keccak256 "^1.0.0" - meow "^5.0.0" - secp256k1 "^3.7.1" - -ethereumjs-abi@0.6.5: - version "0.6.5" - resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz" - integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE= - dependencies: - bn.js "^4.10.0" - ethereumjs-util "^4.3.0" - "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": version "0.6.8" resolved "git+ssh://git@github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" @@ -6930,7 +6032,7 @@ ethereumjs-account@^2.0.3: rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: +ethereumjs-block@^1.2.2: version "1.7.1" resolved "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz" integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== @@ -6957,7 +6059,7 @@ ethereumjs-common@^1.1.0, ethereumjs-common@^1.5.0: resolved "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz" integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== -ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3, ethereumjs-tx@^1.3.7: +ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2: version "1.3.7" resolved "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz" integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== @@ -6973,31 +6075,7 @@ ethereumjs-tx@^2.1.1: ethereumjs-common "^1.5.0" ethereumjs-util "^6.0.0" -ethereumjs-util@5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz" - integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA== - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - ethjs-util "^0.1.3" - keccak "^1.0.2" - rlp "^2.0.0" - safe-buffer "^5.1.1" - secp256k1 "^3.0.1" - -ethereumjs-util@^4.3.0: - version "4.5.1" - resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz" - integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w== - dependencies: - bn.js "^4.8.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - rlp "^2.0.0" - -ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5: +ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5: version "5.2.1" resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz" integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== @@ -7023,7 +6101,7 @@ ethereumjs-util@^6.0.0: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: +ethereumjs-vm@^2.3.4: version "2.6.0" resolved "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz" integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== @@ -7047,21 +6125,6 @@ ethers-multicall@^0.2.1: dependencies: ethers "^5.0.0" -ethers@4.0.47: - version "4.0.47" - resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.47.tgz" - integrity sha512-hssRYhngV4hiDNeZmVU/k5/E8xmLG8UpcNUzg6mb7lqhgpFPH/t7nuv20RjRrEf0gblzvi2XwR5Te+V3ZFc9pQ== - dependencies: - aes-js "3.0.0" - bn.js "^4.4.0" - elliptic "6.5.2" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - ethers@^5.0.0, ethers@^5.5.2: version "5.5.3" resolved "https://registry.npmjs.org/ethers/-/ethers-5.5.3.tgz" @@ -7098,14 +6161,6 @@ ethers@^5.0.0, ethers@^5.5.2: "@ethersproject/web" "5.5.1" "@ethersproject/wordlists" "5.5.0" -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" - integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" - ethjs-util@0.1.6, ethjs-util@^0.1.3: version "0.1.6" resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" @@ -7114,11 +6169,6 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -eventemitter3@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== - eventemitter3@4.0.7, eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" @@ -7365,13 +6415,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fetch-ponyfill@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz" - integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM= - dependencies: - node-fetch "~1.7.1" - figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz" @@ -7465,7 +6508,7 @@ find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -7519,25 +6562,11 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz" - integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== - dependencies: - debug "=3.1.0" - follow-redirects@^1.0.0: version "1.14.7" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz" integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== -for-each@~0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - for-in@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" @@ -7579,11 +6608,6 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -fortmatic@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/fortmatic/-/fortmatic-2.2.1.tgz" - integrity sha512-PEfPoErJSErU2A8iYD2Mab2c8eJK5dCdCr1jR/8yc49aEAlyQ4UXnZXyeO6MU5zBGkDAZmg9brnRSPzc+8MKPQ== - forwarded@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" @@ -7777,18 +6801,6 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@~7.1.7: - version "7.1.7" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-modules@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" @@ -7832,11 +6844,6 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - globby@11.0.1: version "11.0.1" resolved "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz" @@ -7925,13 +6932,6 @@ harmony-reflect@^1.4.6: resolved "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz" @@ -7990,7 +6990,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.0, has@^1.0.3, has@~1.0.3: +has@^1.0.0, has@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -8006,14 +7006,6 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz" - integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" - hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" @@ -8044,7 +7036,7 @@ history@^4.9.0: tiny-warning "^1.0.0" value-equal "^1.0.1" -hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -8060,14 +7052,6 @@ hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react- dependencies: react-is "^16.7.0" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - hoopy@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz" @@ -8256,13 +7240,6 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz" @@ -8277,7 +7254,7 @@ identity-obj-proxy@3.0.0: dependencies: harmony-reflect "^1.4.6" -ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -8363,11 +7340,6 @@ imurmurhash@^0.1.4: resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" @@ -8428,7 +7400,7 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" -invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -8521,22 +7493,12 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@^2.0.2: - version "2.0.5" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: +is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== @@ -8633,11 +7595,6 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - is-fn@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz" @@ -8740,7 +7697,7 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: +is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= @@ -8757,7 +7714,7 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-regex@^1.0.4, is-regex@^1.1.4, is-regex@~1.1.3: +is-regex@^1.0.4, is-regex@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -8785,7 +7742,7 @@ is-shared-array-buffer@^1.0.1: resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz" integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -9391,11 +8348,6 @@ js-sha256@0.9.0: resolved "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz" integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== -js-sha3@0.5.7: - version "0.5.7" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" - integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= - js-sha3@0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" @@ -9406,11 +8358,6 @@ js-sha3@0.8.0: resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" @@ -9457,11 +8404,6 @@ jsdom@^16.4.0: ws "^7.4.6" xml-name-validator "^3.0.0" -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" @@ -9490,19 +8432,7 @@ json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0: "@metamask/safe-event-emitter" "^2.0.0" eth-rpc-errors "^4.0.2" -json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: - version "3.8.0" - resolved "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz" - integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== - dependencies: - async "^2.0.1" - babel-preset-env "^1.7.0" - babelify "^7.3.0" - json-rpc-error "^2.0.0" - promise-to-callback "^1.0.0" - safe-event-emitter "^1.0.1" - -json-rpc-engine@^5.1.3, json-rpc-engine@^5.3.0: +json-rpc-engine@^5.3.0: version "5.4.0" resolved "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz" integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g== @@ -9510,13 +8440,6 @@ json-rpc-engine@^5.1.3, json-rpc-engine@^5.3.0: eth-rpc-errors "^3.0.0" safe-event-emitter "^1.0.1" -json-rpc-error@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz" - integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI= - dependencies: - inherits "^2.0.1" - json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz" @@ -9559,11 +8482,6 @@ json3@^3.3.2: resolved "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - json5@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" @@ -9617,26 +8535,7 @@ jsprim@^1.2.2: array-includes "^3.1.3" object.assign "^4.1.2" -keccak256@^1.0.0: - version "1.0.6" - resolved "https://registry.npmjs.org/keccak256/-/keccak256-1.0.6.tgz" - integrity sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw== - dependencies: - bn.js "^5.2.0" - buffer "^6.0.3" - keccak "^3.0.2" - -keccak@^1.0.2: - version "1.4.0" - resolved "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz" - integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw== - dependencies: - bindings "^1.2.1" - inherits "^2.0.3" - nan "^2.2.1" - safe-buffer "^5.1.0" - -keccak@^3.0.0, keccak@^3.0.1, keccak@^3.0.2: +keccak@^3.0.0, keccak@^3.0.1: version "3.0.2" resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz" integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== @@ -9785,16 +8684,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz" @@ -9904,7 +8793,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0: +"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9921,14 +8810,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" @@ -9999,16 +8880,6 @@ map-cache@^0.2.2: resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" @@ -10068,21 +8939,6 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" -meow@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - yargs-parser "^10.0.0" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" @@ -10189,11 +9045,6 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - min-document@^2.19.0: version "2.19.0" resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" @@ -10229,7 +9080,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= @@ -10241,15 +9092,7 @@ minimatch@3.0.4, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -10382,7 +9225,7 @@ multimatch@^4.0.0: arrify "^2.0.1" minimatch "^3.0.4" -nan@^2.12.1, nan@^2.14.0, nan@^2.2.1: +nan@^2.12.1: version "2.15.0" resolved "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== @@ -10466,14 +9309,6 @@ node-fetch@^2.6.0, node-fetch@^2.6.1: dependencies: whatwg-url "^5.0.0" -node-fetch@~1.7.1: - version "1.7.3" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - node-forge@^0.10.0: version "0.10.0" resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz" @@ -10540,14 +9375,7 @@ node-releases@^2.0.1: resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz" integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== -normalize-hex@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/normalize-hex/-/normalize-hex-0.0.2.tgz" - integrity sha512-E2dx7XJQnjsm6SkS4G6GGvIXRHaLeWAZE2D2N3aia+OpIif2UT8y4S0KCjrX3WmFDSeFnlNOp0FSHFjLeJ4SJw== - dependencies: - bn.js "^4.11.8" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: +normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -10622,14 +9450,6 @@ num2fraction@^1.2.2: resolved "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz" integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= -number-to-bn@1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" - integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz" @@ -10640,7 +9460,7 @@ oauth-sign@~0.9.0: resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -10659,11 +9479,6 @@ object-inspect@^1.11.0, object-inspect@^1.9.0: resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -object-inspect@~1.11.0: - version "1.11.1" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz" - integrity sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA== - object-is@^1.0.1: version "1.1.5" resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" @@ -10848,16 +9663,6 @@ os-browserify@^0.3.0: resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz" @@ -11045,7 +9850,7 @@ path-exists@^4.0.0: resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -11082,13 +9887,6 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" @@ -11105,16 +9903,6 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -penpal@3.0.7: - version "3.0.7" - resolved "https://registry.npmjs.org/penpal/-/penpal-3.0.7.tgz" - integrity sha512-WSXiq5HnEvzvY05SHhaXcsviUmCvh4Ze8AiIZzvmdzaaYAAx4rx8c6Xq6+MaVDG/Nfve3VmGD8HyRP3CkPvPbQ== - -penpal@4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/penpal/-/penpal-4.1.1.tgz" - integrity sha512-6d1f8khVLyBz3DnhLztbfjJ7+ANxdXRM2l6awpnCdEtbrmse4AGTsELOvGuNY0SU7xZw7heGbP6IikVvaVTOWw== - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" @@ -11135,11 +9923,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@4.0.1, pify@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - pify@^2.0.0: version "2.3.0" resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" @@ -11150,6 +9933,11 @@ pify@^3.0.0: resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pify@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz" @@ -11205,13 +9993,6 @@ pnp-webpack-plugin@1.6.4: dependencies: ts-pnp "^1.1.6" -pocket-js-core@0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/pocket-js-core/-/pocket-js-core-0.0.3.tgz" - integrity sha512-OUTEvEVutdjLT6YyldvAlSebpBueUUWg2XKxGNt5u3QqrmLpBOOBmdDnGMNJ+lEwXtko+JqgwFq+HTi4g1QDVg== - dependencies: - axios "^0.18.0" - portfinder@^1.0.26: version "1.0.28" resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz" @@ -11978,11 +10759,6 @@ pretty-quick@3.1.0: mri "^1.1.5" multimatch "^4.0.0" -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" @@ -12166,15 +10942,6 @@ query-string@^4.1.0: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" @@ -12200,11 +10967,6 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= - raf@^3.4.1: version "3.4.1" resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" @@ -12227,11 +10989,6 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -randomhex@0.1.5: - version "0.1.5" - resolved "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz" - integrity sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU= - range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" @@ -12524,14 +11281,6 @@ react@^17.0.1: loose-envify "^1.1.0" object-assign "^4.1.1" -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" @@ -12541,15 +11290,6 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" @@ -12625,14 +11365,6 @@ recursive-readdir@2.2.2: dependencies: minimatch "3.0.4" -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - redent@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" @@ -12648,7 +11380,7 @@ regenerate-unicode-properties@^9.0.0: dependencies: regenerate "^1.4.2" -regenerate@^1.2.1, regenerate@^1.4.2: +regenerate@^1.4.2: version "1.4.2" resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== @@ -12663,15 +11395,6 @@ regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - regenerator-transform@^0.14.2: version "0.14.5" resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz" @@ -12705,15 +11428,6 @@ regexpp@^3.1.0: resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - regexpu-core@^4.7.1: version "4.8.0" resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz" @@ -12726,23 +11440,11 @@ regexpu-core@^4.7.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - regjsgen@^0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz" integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - dependencies: - jsesc "~0.5.0" - regjsparser@^0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz" @@ -12781,13 +11483,6 @@ repeat-string@^1.6.1: resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - request@^2.85.0: version "2.88.2" resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" @@ -12914,21 +11609,6 @@ resolve@^2.0.0-next.3: is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@~1.20.0: - version "1.20.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -resumer@~0.0.0: - version "0.0.0" - resolved "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz" - integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= - dependencies: - through "~2.3.4" - ret@~0.1.10: version "0.1.15" resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" @@ -13093,7 +11773,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -13204,30 +11884,11 @@ schema-utils@^3.0.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" -scrypt-js@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz" - integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== - scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -secp256k1@^3.0.1, secp256k1@^3.7.1: - version "3.8.0" - resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz" - integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== - 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.2" - nan "^2.14.0" - safe-buffer "^5.1.2" - secp256k1@^4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" @@ -13254,7 +11915,7 @@ semaphore@>=1.0.1, semaphore@^1.0.3: resolved "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz" integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -13362,11 +12023,6 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz" - integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= - setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" @@ -13450,20 +12106,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz" integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^2.7.0: - version "2.8.1" - resolved "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz" - integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" @@ -13476,11 +12118,6 @@ sisteransi@^1.0.5: resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - slash@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" @@ -13596,13 +12233,6 @@ source-map-resolve@^0.6.0: atob "^2.1.2" decode-uri-component "^0.2.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" @@ -13621,7 +12251,7 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -13761,11 +12391,6 @@ static-extend@^0.1.1: resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -store@2.0.12: - version "2.0.12" - resolved "https://registry.npmjs.org/store/-/store-2.0.12.tgz" - integrity sha1-jFNOKguDH3K3X8XxEZhXxE711ZM= - stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz" @@ -13861,15 +12486,6 @@ string.prototype.matchall@^4.0.6: regexp.prototype.flags "^1.3.1" side-channel "^1.0.4" -string.prototype.trim@~1.2.4: - version "1.2.5" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz" - integrity sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz" @@ -13921,7 +12537,7 @@ strip-ansi@6.0.0: dependencies: ansi-regex "^5.0.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: +strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= @@ -13977,11 +12593,6 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" @@ -14027,11 +12638,6 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -14133,27 +12739,6 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tape@^4.6.3: - version "4.14.0" - resolved "https://registry.npmjs.org/tape/-/tape-4.14.0.tgz" - integrity sha512-z0+WrUUJuG6wIdWrl4W3rTte2CR26G6qcPOj3w1hfRdcmhF3kHBhOBW9VHsPVAkz08ZmGzp7phVpDupbLzrYKQ== - dependencies: - call-bind "~1.0.2" - deep-equal "~1.1.1" - defined "~1.0.0" - dotignore "~0.1.2" - for-each "~0.3.3" - glob "~7.1.7" - has "~1.0.3" - inherits "~2.0.4" - is-regex "~1.1.3" - minimist "~1.2.5" - object-inspect "~1.11.0" - resolve "~1.20.0" - resumer "~0.0.0" - string.prototype.trim "~1.2.4" - through "~2.3.8" - tar@^6.0.2: version "6.1.11" resolved "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz" @@ -14255,7 +12840,7 @@ throat@^5.0.0: resolved "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -through2@^2.0.0, through2@^2.0.3: +through2@^2.0.0: version "2.0.5" resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -14263,21 +12848,11 @@ through2@^2.0.0, through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -through@~2.3.4, through@~2.3.8: - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - thunky@^1.0.2: version "1.1.0" resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - timers-browserify@^2.0.4: version "2.0.12" resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" @@ -14310,23 +12885,11 @@ to-arraybuffer@^1.0.0: resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -to-hex@0.0.11: - version "0.0.11" - resolved "https://registry.npmjs.org/to-hex/-/to-hex-0.0.11.tgz" - integrity sha512-3FSU8sfjrVc9fWowwP9xrdhxbp5Wco8uVZLhMhfsNuCFo9Fu8ecD2MgJV/2iAw+755W3AcGSQYVZGOpBmJtNcA== - dependencies: - normalize-hex "0.0.2" - to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" @@ -14398,16 +12961,6 @@ tr46@~0.0.3: resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - tryer@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz" @@ -14475,21 +13028,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tweetnacl-util@^0.15.0: - version "0.15.1" - resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" - integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== - tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -tweetnacl@^1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" @@ -14589,11 +13132,6 @@ uncontrollable@^7.2.1: invariant "^2.2.4" react-lifecycles-compat "^3.0.4" -underscore@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== - unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" @@ -14720,11 +13258,6 @@ url-parse@^1.4.3: querystringify "^2.1.1" requires-port "^1.0.0" -url-set-query@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz" - integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= - url@^0.11.0: version "0.11.0" resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" @@ -14738,11 +13271,6 @@ use@^3.1.0: resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -utf8@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" @@ -14790,16 +13318,6 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" - integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= - -uuid@7.0.2: - version "7.0.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz" - integrity sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw== - uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" @@ -14810,13 +13328,6 @@ uuid@^8.3.0: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuidv4@6.0.6: - version "6.0.6" - resolved "https://registry.npmjs.org/uuidv4/-/uuidv4-6.0.6.tgz" - integrity sha512-10YcruyGJtsG5SJnPG+8atr8toJa7xAOrcO7B7plYYiwpH1mQ8UZHjNSa2MrwGi6KWuyVrXGHr+Rce22F9UAiw== - dependencies: - uuid "7.0.2" - v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" @@ -14945,34 +13456,6 @@ web-vitals@^0.2.4: resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-0.2.4.tgz" integrity sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg== -web3-provider-engine@15.0.4: - version "15.0.4" - resolved "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-15.0.4.tgz" - integrity sha512-Ob9oK0TUZfVC7NXkB7CQSWAiCdCD/Xnlh2zTnV8NdJR8LCrMAy2i6JedU70JHaxw59y7mM4GnsYOTTGkquFnNQ== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^4.4.2" - eth-json-rpc-errors "^1.0.1" - eth-json-rpc-filters "^4.1.1" - eth-json-rpc-infura "^4.0.1" - eth-json-rpc-middleware "^4.1.5" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" - web3-provider-engine@16.0.1: version "16.0.1" resolved "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-16.0.1.tgz" @@ -15001,19 +13484,6 @@ web3-provider-engine@16.0.1: xhr "^2.2.0" xtend "^4.0.1" -web3-utils@1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.1.tgz" - integrity sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA== - dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randomhex "0.1.5" - underscore "1.9.1" - utf8 "3.0.0" - web3modal@^1.9.5: version "1.9.5" resolved "https://registry.npmjs.org/web3modal/-/web3modal-1.9.5.tgz" @@ -15477,26 +13947,6 @@ ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz" integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== -xhr-request-promise@^0.1.2: - version "0.1.3" - resolved "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz" - integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== - dependencies: - xhr-request "^1.1.0" - -xhr-request@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz" - integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== - dependencies: - buffer-to-arraybuffer "^0.0.5" - object-assign "^4.1.1" - query-string "^5.0.1" - simple-get "^2.7.0" - timed-out "^4.0.1" - url-set-query "^1.0.0" - xhr "^2.0.4" - xhr2-cookies@1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz" @@ -15504,7 +13954,7 @@ xhr2-cookies@1.1.0: dependencies: cookiejar "^2.1.1" -xhr@^2.0.4, xhr@^2.2.0: +xhr@^2.2.0: version "2.6.0" resolved "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz" integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== @@ -15524,11 +13974,6 @@ xmlchars@^2.2.0: resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xmlhttprequest@1.8.0: - version "1.8.0" - resolved "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" - integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= - xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" @@ -15561,13 +14006,6 @@ yaml@^1.10.0: resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^10.0.0: - version "10.1.0" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" From 32883a2fa70808ef7ff2a46457ed80f67fc59412 Mon Sep 17 00:00:00 2001 From: Crisgarner <@crisgarner> Date: Tue, 27 Dec 2022 11:29:43 -0600 Subject: [PATCH 204/278] updated modal --- package.json | 2 +- src/assets/images/okx.jpg | Bin 0 -> 4514 bytes src/state/Web3ModalContext.tsx | 20 +++++++++++++++----- yarn.lock | 8 ++++---- 4 files changed, 20 insertions(+), 10 deletions(-) create mode 100644 src/assets/images/okx.jpg diff --git a/package.json b/package.json index cc27f91..a0a5231 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "typescript": "4.0.5", "walletlink": "^2.4.2", "web-vitals": "^0.2.4", - "web3modal": "^1.9.5" + "web3modal": "1.9.8" }, "devDependencies": { "@babel/core": "7.12.3", diff --git a/src/assets/images/okx.jpg b/src/assets/images/okx.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f57c063aa43a54eb43971b781c7b94777fdc9d29 GIT binary patch literal 4514 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 XYpHtvFt$nd$Aq)Jt6hOj(0Bg^mkc2B literal 0 HcmV?d00001 diff --git a/src/state/Web3ModalContext.tsx b/src/state/Web3ModalContext.tsx index 8d6a9c5..2b49278 100644 --- a/src/state/Web3ModalContext.tsx +++ b/src/state/Web3ModalContext.tsx @@ -4,8 +4,10 @@ import Web3Modal from "web3modal"; import WalletConnectProvider from "@walletconnect/web3-provider"; import WalletLink from "walletlink"; import { NETWORKS } from "../utils/constants"; +import okxImage from "../assets/images/okx.jpg"; let network = "mainnet"; +let okxConnector = WalletConnectProvider; switch (process.env.REACT_APP_NETWORK_ID) { case "1": @@ -44,13 +46,21 @@ const providerOptions = { infuraId: process.env.REACT_APP_INFURA_ID, // required }, }, - "custom-example": { + burnerconnect: { display: { - logo: "data:image/gif;base64,INSERT_BASE64_STRING", - name: "OKX", - description: "Connect to your example provider account" + logo: okxImage, + name: "OKX", + description: "Scan with OKX mobile app to connect" + }, + package: WalletConnectProvider, // required + options: { + infuraId: process.env.REACT_APP_INFURA_ID, // required }, - } + // connector: async (ProviderPackage: new (arg0: any) => any, options: any) => { + // const provider = WalletConnectProvider; + // return provider; + // } + }, }; const web3Modal = new Web3Modal({ diff --git a/yarn.lock b/yarn.lock index f238387..c78c047 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13966,10 +13966,10 @@ web3-utils@^1.3.4: randombytes "^2.1.0" utf8 "3.0.0" -web3modal@^1.9.5: - version "1.9.10" - resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.10.tgz#ab7836ff27c6a16b9ca881ba0e8008bd33cb0dff" - integrity sha512-gRByp+toRiADwkJLLGRXsnIVbLS1aJB71sJyryS6C7cF6jJ3cRN1LbPYEMObMyJkyjOZonx0CNZVAYGiD099aA== +web3modal@1.9.8: + version "1.9.8" + resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.8.tgz#e2a32f34b051cd0848594111f6bb32abc8a91e44" + integrity sha512-ruYsh4TV1SUAljBW/Pd4itW2idKlo9xr/g2dKhBDdaafWNCVdpaK92cQ7EM53rg2KQHWJhqj1IThbv7cPV7ayA== dependencies: detect-browser "^5.1.0" prop-types "^15.7.2" From a877f787af1ede3418e380c97089bc83c426c7d5 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 27 Dec 2022 16:12:53 -0600 Subject: [PATCH 205/278] upadting keepers --- src/components/Governance/Delegators.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Governance/Delegators.tsx b/src/components/Governance/Delegators.tsx index 4aa4623..c88913e 100644 --- a/src/components/Governance/Delegators.tsx +++ b/src/components/Governance/Delegators.tsx @@ -186,6 +186,7 @@ const Delegators = ({ currentSignerAddress }: props) => { )} +
{keepersInfo.map((keeperInfo, index) => { const keeper = getDelegatorData(keeperInfo.address); From cffb59abab07731e68f4fbd1dcbd3491cc33996d Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 27 Dec 2022 16:34:05 -0600 Subject: [PATCH 206/278] include okx wallet --- src/App.tsx | 78 ++++++++++++++++++---------------- src/state/Web3ModalContext.tsx | 10 ++--- 2 files changed, 46 insertions(+), 42 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 956a790..b62c59c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -790,43 +790,49 @@ const App = () => { } }; - web3Modal.on("connect", async (networkProvider: ethers.providers.ExternalProvider | ethers.providers.JsonRpcFetchFunc) => { - setLoadingContracts(true); - const currentProvider = new ethers.providers.Web3Provider(networkProvider); - const network = await currentProvider.getNetwork(); - const isNftFruit = - window.location.toString().includes("sewagefruit") && isGoerli(network.chainId); - - if (!isValidNetwork(network.chainId) && !isNftFruit) { - setInvalidNetwork(true); - } - const walletName = currentProvider.provider.isMetaMask ? "metamask" : "other"; - const currentSigner = currentProvider.getSigner(); - signer.setCurrentSigner(currentSigner); - const ethcallProvider = new Provider(currentProvider); - - if (isPolygon(network.chainId)) { - await setPolygonContracts(network.chainId, currentSigner, ethcallProvider); - } else if (isGoerli(network.chainId)) { - await setGoerliContracts(currentSigner, ethcallProvider); - } else { - await setContracts(currentSigner, ethcallProvider, network.chainId || 4); - } -// @ts-ignore - const isBrowserWallet = networkProvider.isMetaMask || getProviderInfo(networkProvider.id === "walletlink"); - const cAddress = await currentSigner.getAddress(); - setCurrentSignerAddress(cAddress); - setCurrentNetwork(network.chainId, walletName, isBrowserWallet); - - // @ts-ignore - networkProvider.on("chainChanged", (chainId: number) => { - if (chainId !== network.chainId) { - setCurrentNetwork(chainId, "", isBrowserWallet); - window.location.reload(); + web3Modal.on( + "connect", + async ( + networkProvider: ethers.providers.ExternalProvider | ethers.providers.JsonRpcFetchFunc + ) => { + setLoadingContracts(true); + const currentProvider = new ethers.providers.Web3Provider(networkProvider); + const network = await currentProvider.getNetwork(); + const isNftFruit = + window.location.toString().includes("sewagefruit") && isGoerli(network.chainId); + + if (!isValidNetwork(network.chainId) && !isNftFruit) { + setInvalidNetwork(true); } - }); - setLoadingContracts(false); - }); + const walletName = currentProvider.provider.isMetaMask ? "metamask" : "other"; + const currentSigner = currentProvider.getSigner(); + signer.setCurrentSigner(currentSigner); + const ethcallProvider = new Provider(currentProvider); + + if (isPolygon(network.chainId)) { + await setPolygonContracts(network.chainId, currentSigner, ethcallProvider); + } else if (isGoerli(network.chainId)) { + await setGoerliContracts(currentSigner, ethcallProvider); + } else { + await setContracts(currentSigner, ethcallProvider, network.chainId || 4); + } + // @ts-ignore + const isBrowserWallet = + networkProvider.isMetaMask || getProviderInfo(networkProvider.id === "walletlink"); + const cAddress = await currentSigner.getAddress(); + setCurrentSignerAddress(cAddress); + setCurrentNetwork(network.chainId, walletName, isBrowserWallet); + + // @ts-ignore + networkProvider.on("chainChanged", (chainId: number) => { + if (chainId !== network.chainId) { + setCurrentNetwork(chainId, "", isBrowserWallet); + window.location.reload(); + } + }); + setLoadingContracts(false); + } + ); useEffect(() => { async function loadProvider() { diff --git a/src/state/Web3ModalContext.tsx b/src/state/Web3ModalContext.tsx index 2b49278..4cbbe2a 100644 --- a/src/state/Web3ModalContext.tsx +++ b/src/state/Web3ModalContext.tsx @@ -3,11 +3,9 @@ import React from "react"; import Web3Modal from "web3modal"; import WalletConnectProvider from "@walletconnect/web3-provider"; import WalletLink from "walletlink"; -import { NETWORKS } from "../utils/constants"; import okxImage from "../assets/images/okx.jpg"; let network = "mainnet"; -let okxConnector = WalletConnectProvider; switch (process.env.REACT_APP_NETWORK_ID) { case "1": @@ -48,10 +46,10 @@ const providerOptions = { }, burnerconnect: { display: { - logo: okxImage, - name: "OKX", - description: "Scan with OKX mobile app to connect" - }, + logo: okxImage, + name: "OKX", + description: "Scan with OKX mobile app to connect", + }, package: WalletConnectProvider, // required options: { infuraId: process.env.REACT_APP_INFURA_ID, // required From e6a8c9178c8c32ebc8b1915ab9702c8ed854b2e0 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 4 Jan 2023 13:00:58 -0600 Subject: [PATCH 207/278] crypt keepers --- src/assets/images/x-symbol.svg | 12 ++ src/components/Governance/Delegators.tsx | 167 +++++++++++++++++------ src/components/Governance/KeeperForm.tsx | 2 +- src/components/Governance/data.tsx | 2 +- src/styles/app.scss | 4 + src/styles/delegators.scss | 40 +++++- src/styles/modal.scss | 41 ++++-- src/utils/constants.tsx | 4 +- yarn.lock | 158 ++++++++++----------- 9 files changed, 293 insertions(+), 137 deletions(-) create mode 100644 src/assets/images/x-symbol.svg diff --git a/src/assets/images/x-symbol.svg b/src/assets/images/x-symbol.svg new file mode 100644 index 0000000..7e08939 --- /dev/null +++ b/src/assets/images/x-symbol.svg @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/src/components/Governance/Delegators.tsx b/src/components/Governance/Delegators.tsx index c88913e..bbbf620 100644 --- a/src/components/Governance/Delegators.tsx +++ b/src/components/Governance/Delegators.tsx @@ -1,5 +1,5 @@ import React, { useContext, useState, useEffect } from "react"; -import { Button } from "react-bootstrap"; +import { Button, Dropdown } from "react-bootstrap"; import Row from "react-bootstrap/esm/Row"; import { useQuery, gql } from "@apollo/client"; import { useTranslation } from "react-i18next"; @@ -10,22 +10,41 @@ import Withdraw from "./Withdraw"; import StakerStats from "./StakerStats"; import { governanceContext, signerContext } from "../../state"; import { API_ENDPOINT, FEATURES } from "../../utils/constants"; -import { delegatorsInfo } from "./data"; +// import { delegatorsInfo } from "./data"; type props = { currentSignerAddress: string; }; -type delegatorType = { +type keeperType = { id: string; delegatee: string; delegatedVotes: string; delegatedVotesRaw: string; tokenOwners: { stake: string; stakeRaw: string }[]; - totalHoldersRepresented: Number; + totalHoldersRepresented: number; +}; +type keepeInfoType = { + address: string; + name: string; + eth_name: string; + image: string; + expertise: string[]; + why: string; + discord: string; + twitter: string; + delegatedVotes: number; + totalHoldersRepresented: number; }; const Delegators = ({ currentSignerAddress }: props) => { const { t } = useTranslation(); + const sortOptions = [ + { key: "0", name: "Votes Descending" }, + { key: "1", name: "Votes Ascending" }, + { key: "2", name: "Delegates Descending" }, + { key: "3", name: "Delegates Ascending" }, + ]; + const [currentSorting, setCurrentSorting] = useState(sortOptions[0]); const [keepers, setKeepers] = useState([]); const [keepersInfo, setKeepersInfo] = useState([]); const [keeperIndex, setKeeperIndex] = useState(-1); @@ -60,38 +79,83 @@ const Delegators = ({ currentSignerAddress }: props) => { variables: { currentSignerAddress }, }); - useEffect(() => { - const loadKeepers = async () => { - if (governance.delegatorFactoryRead) { - if (data) { - const currentDelegators: any[] = []; - await data.delegators.forEach((d: any) => { - currentDelegators.push(d); - }); - setKeepers(currentDelegators); - } + const getDelegatorData = (address: string, currentKeepers: any): keeperType | null => { + const index = currentKeepers.findIndex( + // @ts-ignore + (item) => item.delegatee.toLowerCase() === address.toLowerCase() + ); + if (index !== -1) { + return currentKeepers[index]; + } + return null; + }; + + const sortVotesDesc = (a: keepeInfoType, b: keepeInfoType) => b.delegatedVotes - a.delegatedVotes; + + const sortVotesAsc = (a: keepeInfoType, b: keepeInfoType) => a.delegatedVotes - b.delegatedVotes; + + const sortRepresentedDesc = (a: keepeInfoType, b: keepeInfoType) => + b.totalHoldersRepresented - a.totalHoldersRepresented; + + const sortRepresentedAsc = (a: keepeInfoType, b: keepeInfoType) => + a.totalHoldersRepresented - b.totalHoldersRepresented; + + const buildKeeperInfo = (dbInfo: any, currentDelegators: any) => { + const kInfo = new Array(); + for (let i = 0; i < dbInfo.length; i += 1) { + const kData = getDelegatorData(dbInfo[i].address, currentDelegators); + if (kData !== null) { + const info = { + address: dbInfo[i].address, + name: dbInfo[i].name, + eth_name: dbInfo[i].eth_name, + image: dbInfo[i].image, + expertise: dbInfo[i].expertise, + why: dbInfo[i].why, + discord: dbInfo[i].discord, + twitter: dbInfo[i].twitter, + delegatedVotes: parseInt(kData.delegatedVotes), + totalHoldersRepresented: kData.totalHoldersRepresented, + }; + kInfo.push(info); } - }; - const loadKeepersFromDB = async () => { + } + setKeepersInfo(kInfo.sort(sortVotesDesc)); + }; + + useEffect(() => { + const loadKeepersFromDB = async (currentDelegators: any) => { await fetch(`${API_ENDPOINT}/cryptkeeper/all`, { method: "GET", }) .then((response) => response.json()) .then((responseJson) => { - setKeepersInfo(responseJson); + buildKeeperInfo(responseJson, currentDelegators); }) .catch((error) => { console.error(error); setKeepersInfo([]); }); }; + const loadKeepers = async () => { + if (governance.delegatorFactoryRead) { + if (data) { + const currentDelegators: any[] = []; + await data.delegators.forEach((d: any) => { + currentDelegators.push(d); + }); + setKeepers(currentDelegators); + loadKeepersFromDB(currentDelegators); + } + } + }; loadKeepers(); - if (FEATURES.KEEPERS_API) { + /* if (FEATURES.KEEPERS_API) { loadKeepersFromDB(); } else { setKeepersInfo(delegatorsInfo); - } + } */ // eslint-disable-next-line }, [updateData, data, currentSignerAddress]); @@ -130,16 +194,6 @@ const Delegators = ({ currentSignerAddress }: props) => { setShowKeeperForm(false); }; - const getDelegatorData = (address: string): delegatorType | null => { - const index = keepers.findIndex( - (item) => item.delegatee.toLowerCase() === address.toLowerCase() - ); - if (index !== -1) { - return keepers[index]; - } - return null; - }; - /* const getKeepersData = (address: string): infoType | null => { const index = keepersInfo.findIndex( (item) => item.address.toLowerCase() === address.toLowerCase() @@ -164,17 +218,27 @@ const Delegators = ({ currentSignerAddress }: props) => { addWithdrawTime(stakeDate.getTime()); }; + const handleSortingChange = (option: string) => { + const sortO = parseInt(option); + const kInfo = keepersInfo; + if (sortO === 0) { + kInfo.sort(sortVotesDesc); + } else if (sortO === 1) { + kInfo.sort(sortVotesAsc); + } else if (sortO === 2) { + kInfo.sort(sortRepresentedDesc); + } else { + kInfo.sort(sortRepresentedAsc); + } + + setKeepersInfo(kInfo); + setCurrentSorting(sortOptions[parseInt(option)]); + }; + return (
{signer.signer && ( <> - {FEATURES.KEEPERS_API && ( -
- -
- )} { )} -
+
+
+
+
Sort by:
+ handleSortingChange(eventKey || "0")}> + +
+ {currentSorting.name} +
+
+ + {sortOptions.map((item) => ( + + {item.name} + + ))} + +
+
+
+ {signer.signer && FEATURES.KEEPERS_API && ( +
+ +
+ )} +
{keepersInfo.map((keeperInfo, index) => { - const keeper = getDelegatorData(keeperInfo.address); + const keeper = getDelegatorData(keeperInfo.address, keepers); if (keeper) { return ( {imageError} diff --git a/src/components/Governance/data.tsx b/src/components/Governance/data.tsx index d8fcd6d..6f410d6 100644 --- a/src/components/Governance/data.tsx +++ b/src/components/Governance/data.tsx @@ -69,7 +69,7 @@ export const delegatorsInfo = [ image: "indigo.png", expertise: ["Development", "Operations"], why: "I'm a security expert who specializes in smart contract and operational security auditing.\n\nI will vote for incentivized liquidity and staking, expansion to new projects/networks, and supporting operations that will drive adoption of TCAP.", - discord: " Indigo#3132", + discord: "Indigo#3132", twitter: "", }, { diff --git a/src/styles/app.scss b/src/styles/app.scss index 1d4455f..0c3467c 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -59,6 +59,10 @@ body { margin-top: 2rem; } +.badge.bg-light { + background-color: $off-white !important; +} + .btn { color: $white; font-family: "Nineteen Ninety Seven"; diff --git a/src/styles/delegators.scss b/src/styles/delegators.scss index 72edc7b..a8e7195 100644 --- a/src/styles/delegators.scss +++ b/src/styles/delegators.scss @@ -18,9 +18,7 @@ } .create { - position: relative; width: 15rem; - margin-top: -4rem; } .grid { @@ -87,6 +85,7 @@ } .btn:focus { border: none; + box-shadow: none; } .btn:hover { background-color: transparent; @@ -172,7 +171,7 @@ } } - .badge-highlight { + .badge.bg-light { //border: 1px solid $highlight; border-radius: 25px; height: 30px; @@ -372,6 +371,41 @@ } } } + + .keepers-options { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + background-color: $darker; + margin-top: 1rem; + padding: 1.5rem; + .sort-box { + display: flex; + align-items: center; + } + + .dropdown { + margin-left: 0.5rem; + .dropdown-toggle { + min-height: 2.5rem; + height: 2.5rem; + + span { + font-size: 0.8rem; + } + } + .sort-by-toggle { + margin-right: 0.5rem; + } + } + + .create { + .btn { + min-height: 2.7rem; + } + } + } } .cryptkeeper-form { diff --git a/src/styles/modal.scss b/src/styles/modal.scss index d0304ce..78c42a9 100644 --- a/src/styles/modal.scss +++ b/src/styles/modal.scss @@ -1,6 +1,7 @@ @import "./colors"; @import "./fonts"; + .modal-content { padding: 2rem; background-color: $primary; @@ -24,6 +25,20 @@ border: 0px; } + .modal-header { + .btn-close { + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em; + color: #000; + background: transparent url("/assets/images/x-symbol.svg"); + border: 0; + border-radius: 0.375rem; + opacity: .5; + } + } + .modal-title { font-family: "Nineteen Ninety Seven"; color: $white; @@ -80,6 +95,7 @@ width: 65%; margin-left: 20px; cursor: pointer; + z-index: 0; } .image-group { @@ -135,25 +151,23 @@ width: 80%; } input[type="file"] { - background-color: $dark; + background-color: transparent; + border: none; + color: transparent; height: 100%; width: 90%; margin-left: 20px; cursor: pointer; + z-index: 1; } - .custom-file-label { - border-color: $green; - height: 3.375rem; - line-height: 1.5; - display: none; + input[type="file"]:focus { + box-shadow: none; } - .custom-file-label::after { - background-color: $darker; - border-color: $pink; - color: $white; - font-family: "Nineteen Ninety Seven"; - font-size: 0.9rem; - font-weight: 400; + + input::file-selector-button { + background-color: transparent; + color: transparent; + border: none; } textarea.neon-green { @@ -197,6 +211,7 @@ } } } + table.liq-info { margin-top: 3rem !important; .btn-dark { diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index b4b0a65..16a85cc 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -93,7 +93,7 @@ export const NETWORKS = { }, }; -export const API_ENDPOINT = "https://api.cryptex.finance"; +export const API_ENDPOINT = "https://test-api.cryptex.finance"; export const GRAPHQL_ENDPOINT = { mainnet: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-graph", @@ -112,7 +112,7 @@ export const OS_API_URL = { }; export const FEATURES = { - KEEPERS_API: false, + KEEPERS_API: true, NEW_VAULTS: true, OPTIMISM: true, POLYGON: false, diff --git a/yarn.lock b/yarn.lock index b5e262e..2e5be88 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,9 +56,9 @@ "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.12.1", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" - integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== + version "7.20.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" + integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== "@babel/core@7.12.3": version "7.12.3" @@ -212,10 +212,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz#7a6c9a1155bef55e914af574153069c9d9470c43" - integrity sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.20.7": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" @@ -223,7 +223,7 @@ "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" + "@babel/traverse" "^7.20.10" "@babel/types" "^7.20.7" "@babel/helper-optimise-call-expression@^7.18.6": @@ -656,9 +656,9 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.8.tgz#ad142bce04ae32225e2379ca54f06d5cea92fdb8" - integrity sha512-ztBCIWJvcWJvtxhMqIrItLmGlbxaa/5hl7HlZvV4f9oS08wWn/mEtf5D35qxFp3rTK8KjV9TePEoeal8z02gzA== + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz#9f5a3424bd112a3f32fe0cf9364fbb155cff262a" + integrity sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -754,30 +754,30 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.19.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.7.tgz#1e5cfeb4e5f9b392e86f85698896336b442f8760" - integrity sha512-+1IVLD+dHOzRZWNFFSoyPZz4ffsVmOP+OhhjeahLKpU97v/52LcCb9RabRl5eHM1/HAuH5Dl0q9Pyzrq1v2otQ== + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== dependencies: - "@babel/helper-module-transforms" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.7.tgz#abb5f84695e74d46acf48244082f6cbf8bb23120" - integrity sha512-76jqqFiFdCD+RJwEdtBHUG2/rEKQAmpejPbAKyQECEE3/y4U5CMPc9IXvipS990vgQhzq+ZRw6WJ+q4xJ/P24w== + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" + integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== dependencies: - "@babel/helper-module-transforms" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-simple-access" "^7.20.2" "@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz#59e2a84064b5736a4471b1aa7b13d4431d327e0d" - integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== dependencies: "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.18.6": @@ -1161,10 +1161,10 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": - version "7.20.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.8.tgz#e3a23eb04af24f8bbe8a8ba3eef6155b77df0b08" - integrity sha512-/RNkaYDeCy4MjyV70+QkSHhxbvj2JO/5Ft2Pa880qJOG8tWrqcT/wXUuCCv43yogfqPzHL77Xu101KQPf4clnQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": + version "7.20.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.10.tgz#2bf98239597fcec12f842756f186a9dde6d09230" + integrity sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg== dependencies: "@babel/code-frame" "^7.18.6" "@babel/generator" "^7.20.7" @@ -2412,9 +2412,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@*": - version "29.2.4" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.4.tgz#9c155c4b81c9570dbd183eb8604aa0ae80ba5a5b" - integrity sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A== + version "29.2.5" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.5.tgz#c27f41a9d6253f288d1910d3c5f09484a56b73c0" + integrity sha512-H2cSxkKgVmqNHXP7TC2L/WUorrZu8ZigyRywfVzv6EyBlxj39n4C00hjXYQWsbwqgElaj/CiAeSRmk5GoaKTgw== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2448,14 +2448,14 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": - version "18.11.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.17.tgz#5c009e1d9c38f4a2a9d45c0b0c493fe6cdb4bcb5" - integrity sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng== + version "18.11.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" + integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== "@types/node@^14.14.2": - version "14.18.35" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.35.tgz#879c4659cb7b3fe515844f029c75079c941bb65c" - integrity sha512-2ATO8pfhG1kDvw4Lc4C0GXIMSQFFJBCo/R1fSgTwmUlq5oy95LXyjDQinsRVgQY6gp6ghh3H91wk9ES5/5C+Tw== + version "14.18.36" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.36.tgz#c414052cb9d43fab67d679d5f3c641be911f5835" + integrity sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2497,9 +2497,9 @@ "@types/react" "*" "@types/react-dom@^18.0.8": - version "18.0.9" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.9.tgz#ffee5e4bfc2a2f8774b15496474f8e7fe8d0b504" - integrity sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg== + version "18.0.10" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.10.tgz#3b66dec56aa0f16a6cc26da9e9ca96c35c0b4352" + integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg== dependencies: "@types/react" "*" @@ -2513,9 +2513,9 @@ "@types/react-router" "*" "@types/react-router@*": - version "5.1.19" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.19.tgz#9b404246fba7f91474d7008a3d48c17b6e075ad6" - integrity sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA== + version "5.1.20" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== dependencies: "@types/history" "^4.7.11" "@types/react" "*" @@ -2623,9 +2623,9 @@ "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.17" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.17.tgz#5672e5621f8e0fca13f433a8017aae4b7a2a03e7" - integrity sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g== + version "17.0.18" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.18.tgz#466225ab4fbabb9aa711f5b406796daf1374a5b7" + integrity sha512-eIJR1UER6ur3EpKM3d+2Pgd+ET+k6Kn9B4ZItX0oPjjVI5PrfaRjKyLT5UYendDpLuoiJMNJvovLQbEXqhsPaw== dependencies: "@types/yargs-parser" "*" @@ -3225,9 +3225,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.1: - version "8.11.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" - integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -5090,9 +5090,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" - integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== + version "3.7.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.1.tgz#708a6cdae38915d597afdf3b145f2f8e1ff55f3f" + integrity sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -5419,16 +5419,16 @@ copy-to-clipboard@^3.3.1: toggle-selection "^1.0.6" core-js-compat@^3.25.1, core-js-compat@^3.6.2: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" - integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== + version "3.27.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.1.tgz#b5695eb25c602d72b1d30cbfba3cb7e5e4cf0a67" + integrity sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA== dependencies: browserslist "^4.21.4" core-js-pure@^3.25.1: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.1.tgz#653f4d7130c427820dcecd3168b594e8bb095a33" - integrity sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ== + version "3.27.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.27.1.tgz#ede4a6b8440585c7190062757069c01d37a19dca" + integrity sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw== core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" @@ -5436,9 +5436,9 @@ core-js@^2.4.0, core-js@^2.5.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.6.5: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e" - integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA== + version "3.27.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.1.tgz#23cc909b315a6bb4e418bf40a52758af2103ba46" + integrity sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww== core-util-is@1.0.2: version "1.0.2" @@ -6172,9 +6172,9 @@ doctrine@^3.0.0: esutils "^2.0.2" dom-accessibility-api@^0.5.6: - version "0.5.14" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56" - integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== + version "0.5.15" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.15.tgz#357e74338704f36fada8b2e01a4bfc11ef436ac9" + integrity sha512-8o+oVqLQZoruQPYy3uAAQtc6YbtSiRq5aPJBhJ82YTJRHvI6ofhYAkC81WmjFTnfUbqg6T3aCglIpU9p/5e7Cw== dom-converter@^0.2.0: version "0.2.0" @@ -7680,9 +7680,9 @@ fast-safe-stringify@^2.0.6: integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fastq@^1.6.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" - integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" @@ -8765,9 +8765,9 @@ immer@8.0.1: integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== immutable@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.0.tgz#c91f09108ed7504c2f0faec7222f40178ff97b11" - integrity sha512-h4ujZ0OZ3kpvdFcwJAHXEdvawH7J8TYTB62e8xI03OSZhuGpuPY9DPXnonMN8s+uQ56gMUqMK71mXU8ob20xfA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.1.tgz#8a4025691018c560a40c67e43d698f816edc44d4" + integrity sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ== import-cwd@^2.0.0: version "2.1.0" @@ -10129,16 +10129,16 @@ json5@^0.5.1: integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" json5@^2.1.2, json5@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" - integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^4.0.0: version "4.0.0" @@ -10199,9 +10199,9 @@ keccak@^1.0.2: safe-buffer "^5.1.0" keccak@^3.0.0, keccak@^3.0.1, keccak@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" - integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" From 573f2560c9fec13b0d997d143df8424a78e6a51f Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 5 Jan 2023 11:54:14 -0600 Subject: [PATCH 208/278] fixed updating keeper error --- src/components/Governance/Delegators.tsx | 3 +++ src/components/Governance/KeeperForm.tsx | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/Governance/Delegators.tsx b/src/components/Governance/Delegators.tsx index bbbf620..acc320e 100644 --- a/src/components/Governance/Delegators.tsx +++ b/src/components/Governance/Delegators.tsx @@ -23,7 +23,9 @@ type keeperType = { tokenOwners: { stake: string; stakeRaw: string }[]; totalHoldersRepresented: number; }; + type keepeInfoType = { + id: number; address: string; name: string; eth_name: string; @@ -106,6 +108,7 @@ const Delegators = ({ currentSignerAddress }: props) => { const kData = getDelegatorData(dbInfo[i].address, currentDelegators); if (kData !== null) { const info = { + id: dbInfo[i].id, address: dbInfo[i].address, name: dbInfo[i].name, eth_name: dbInfo[i].eth_name, diff --git a/src/components/Governance/KeeperForm.tsx b/src/components/Governance/KeeperForm.tsx index aaac27a..5d498a0 100644 --- a/src/components/Governance/KeeperForm.tsx +++ b/src/components/Governance/KeeperForm.tsx @@ -218,7 +218,7 @@ const KeeperForm = ({ setImageError(t("errors.invalid-file-type")); return false; } - if (value.size > 100000) { + if (value.size > 180000) { setImageError(t("errors.invalid-image-size", { size: Math.round(value.size / 1000) })); setImageUrl(""); return false; @@ -296,6 +296,7 @@ const KeeperForm = ({ }) .then((response) => response.json()) .then((responseJson) => { + console.log(responseJson.errors); if (responseJson.status === "error") { console.log(responseJson.errors); } From 26b0f42870053702a4043a780c67d4aed6017801 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 9 Jan 2023 17:44:55 -0600 Subject: [PATCH 209/278] added jpegz dummy contracts --- src/App.tsx | 31 +- src/components/Vault/Mint.tsx | 1584 ------ src/components/Vault/Monitoring/Liquidate.tsx | 393 -- .../Vault/Monitoring/Pagination.tsx | 91 - src/components/Vault/Monitoring/Vaults.tsx | 335 -- src/components/Vault/Monitoring/common.tsx | 77 - src/components/Vault/Monitoring/index.tsx | 1170 ---- src/components/Vault/Monitoring/types.tsx | 69 - src/components/Vault/Vault.tsx | 66 - src/components/Vault/index.tsx | 3 - src/components/Vaults/types.tsx | 1 + src/components/Vaults/vault/index.tsx | 54 +- src/contracts/cryptex.json | 4954 +++++++++++------ src/hooks/useOracles.tsx | 12 + src/hooks/usePrices.tsx | 32 +- src/hooks/usePrices2.tsx | 30 +- src/hooks/useRatios.tsx | 16 +- src/hooks/useTokens.tsx | 12 + src/hooks/useVault.tsx | 26 +- src/state/OraclesContext.tsx | 6 + src/state/TokensContext.tsx | 6 + src/utils/constants.tsx | 6 +- src/utils/utils.tsx | 6 +- 23 files changed, 3472 insertions(+), 5508 deletions(-) delete mode 100644 src/components/Vault/Mint.tsx delete mode 100644 src/components/Vault/Monitoring/Liquidate.tsx delete mode 100644 src/components/Vault/Monitoring/Pagination.tsx delete mode 100644 src/components/Vault/Monitoring/Vaults.tsx delete mode 100644 src/components/Vault/Monitoring/common.tsx delete mode 100644 src/components/Vault/Monitoring/index.tsx delete mode 100644 src/components/Vault/Monitoring/types.tsx delete mode 100644 src/components/Vault/Vault.tsx delete mode 100644 src/components/Vault/index.tsx diff --git a/src/App.tsx b/src/App.tsx index 61cf4f5..a52b294 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -452,7 +452,7 @@ const App = () => { switch (chainId) { case NETWORKS.arbitrum.chainId: - contracts = cryptexJson[42161].mainnet.contracts; + contracts = cryptexJson[42161].arbitrum.contracts; wethAddress = NETWORKS.arbitrum.weth; daiAddress = NETWORKS.arbitrum.dai; break; @@ -498,19 +498,19 @@ const App = () => { tokens.setCurrentWETHToken(currentWETHToken); const currentDAIToken = new ethers.Contract(daiAddress, WETH.abi, currentSigner); tokens.setCurrentDAIToken(currentDAIToken); - const currentTCAPToken = new ethers.Contract( - contracts.TCAP.address, - contracts.TCAP.abi, + const currentJPEGZToken = new ethers.Contract( + contracts.JPEGZ.address, + contracts.JPEGZ.abi, currentSigner ); - tokens.setCurrentTCAPToken(currentTCAPToken); + tokens.setCurrentJPEGZToken(currentJPEGZToken); const currentWETHTokenRead = new Contract(wethAddress, ERC20.abi); tokens.setCurrentWETHTokenRead(currentWETHTokenRead); const currentDAITokenRead = new Contract(daiAddress, WETH.abi); tokens.setCurrentDAITokenRead(currentDAITokenRead); - const currentTCAPTokenRead = new Contract(contracts.TCAP.address, contracts.TCAP.abi); - tokens.setCurrentTCAPTokenRead(currentTCAPTokenRead); + const currentJPEGZTokenRead = new Contract(contracts.JPEGZ.address, contracts.JPEGZ.abi); + tokens.setCurrentJPEGZTokenRead(currentJPEGZTokenRead); // Set Oracles const currentWETHOracle = new ethers.Contract( @@ -525,12 +525,13 @@ const App = () => { currentSigner ); oracles.setCurrentDAIOracle(currentDAIOracle); - const currentTCAPOracle = new ethers.Contract( - contracts.TCAPOracle.address, - contracts.TCAPOracle.abi, + + const currentJPEGZOracle = new ethers.Contract( + contracts.JPEGZOracle.address, + contracts.JPEGZOracle.abi, currentSigner ); - oracles.setCurrentTCAPOracle(currentTCAPOracle); + oracles.setCurrentJPEGZOracle(currentJPEGZOracle); const currentWETHOracleRead = new Contract( contracts.WETHOracle.address, @@ -539,11 +540,11 @@ const App = () => { oracles.setCurrentWETHOracleRead(currentWETHOracleRead); const currentDAIOracleRead = new Contract(contracts.DAIOracle.address, contracts.DAIOracle.abi); oracles.setCurrentDAIOracleRead(currentDAIOracleRead); - const currentTCAPOracleRead = new Contract( - contracts.TCAPOracle.address, - contracts.TCAPOracle.abi + const currentJPEGZOracleRead = new Contract( + contracts.JPEGZOracle.address, + contracts.JPEGZOracle.abi ); - oracles.setCurrentTCAPOracleRead(currentTCAPOracleRead); + oracles.setCurrentJPEGZOracleRead(currentJPEGZOracleRead); }; const setOptimismContracts = async (currentSigner: ethers.Signer) => { diff --git a/src/components/Vault/Mint.tsx b/src/components/Vault/Mint.tsx deleted file mode 100644 index 86dc120..0000000 --- a/src/components/Vault/Mint.tsx +++ /dev/null @@ -1,1584 +0,0 @@ -import React, { useState, useEffect, useContext } from "react"; -import Button from "react-bootstrap/esm/Button"; -import ButtonGroup from "react-bootstrap/esm/ButtonGroup"; -import Card from "react-bootstrap/esm/Card"; -import Dropdown from "react-bootstrap/Dropdown"; -import Form from "react-bootstrap/esm/Form"; -import InputGroup from "react-bootstrap/esm/InputGroup"; -import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; -import ToggleButton from "react-bootstrap/esm/ToggleButton"; -import Tooltip from "react-bootstrap/esm/Tooltip"; -import { Contract } from "ethers-multicall"; -import { ethers, BigNumber } from "ethers"; -import NumberFormat from "react-number-format"; -import { useRouteMatch, useHistory } from "react-router-dom"; -import { useQuery, gql, NetworkStatus } from "@apollo/client"; -import { - hardVaultsContext, - networkContext, - oraclesContext, - signerContext, - tokensContext, - vaultsContext, -} from "../../state"; -import "../../styles/mint.scss"; -import { ReactComponent as ETHIconSmall } from "../../assets/images/vault/eth.svg"; -import { ReactComponent as DAIIconSmall } from "../../assets/images/vault/dai.svg"; -import { ReactComponent as AAVEIconSmall } from "../../assets/images/vault/aave.svg"; -import { ReactComponent as LINKIconSmall } from "../../assets/images/vault/chainlink.svg"; -import { ReactComponent as UNIIconSmall } from "../../assets/images/vault/uni.svg"; -import { ReactComponent as SNXIconSmall } from "../../assets/images/vault/snx2.svg"; -import { ReactComponent as POLYGONIconSmall } from "../../assets/images/vault/polygon.svg"; -import { ReactComponent as WBTCIconSmall } from "../../assets/images/vault/bitcoin.svg"; -import { ReactComponent as USDCIconSmall } from "../../assets/images/vault/usdc.svg"; -import { ReactComponent as RatioIcon } from "../../assets/images/vault/ratio.svg"; -import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; -import { - notifyUser, - toUSD, - errorNotification, - getDefaultProvider, - isInLayer1, - isPolygon, - isOptimism, - getRatio, - getSafeRemoveCollateral, - getSafeMint, - isUndefined, -} from "../../utils/utils"; -import Loading from "../Loading"; -import { FEATURES, NETWORKS } from "../../utils/constants"; - -type props = { - address: string; - t: any; -}; - -// TODO: Vault doesn't show if approve is 0 even if there is data in the vault - -const Mint = ({ address, t }: props) => { - const currentNetwork = useContext(networkContext); - const oracles = useContext(oraclesContext); - const tokens = useContext(tokensContext); - const vaults = useContext(vaultsContext); - const hardVaults = useContext(hardVaultsContext); - const signer = useContext(signerContext); - const [vaultMode, setVaultMode] = useState( - isInLayer1(currentNetwork.chainId) ? "hard" : "normal" - ); - const [loadingMode, setLoadingMode] = useState(false); - const radios = [ - { name: "Regular Mode", value: "normal" }, - { name: "Hard Mode", value: "hard" }, - ]; - let currency = !isPolygon(currentNetwork.chainId) ? "ETH" : "MATIC"; - const match = useRouteMatch("/vault/:currency"); - const history = useHistory(); - const isHardMode = () => vaultMode === "hard"; - - // @ts-ignore - switch (match?.params?.currency?.toLowerCase()) { - case "eth": - currency = "ETH"; - if (FEATURES.POLYGON && isPolygon(currentNetwork.chainId)) { - history?.push(`/vault/MATIC`); - currency = "MATIC"; - } - break; - case "weth": - currency = "WETH"; - if (FEATURES.POLYGON && isPolygon(currentNetwork.chainId)) { - history?.push(`/vault/MATIC`); - currency = "MATIC"; - } - break; - case "wbtc": - currency = "WBTC"; - if (isOptimism(currentNetwork.chainId) || !isHardMode()) { - history?.push(`/vault/ETH`); - currency = "ETH"; - } - break; - case "dai": - currency = "DAI"; - break; - case "aave": - if (isInLayer1(currentNetwork.chainId) && !isHardMode()) { - currency = "AAVE"; - } else { - currency = "ETH"; - history?.push(`/vault/ETH`); - } - break; - case "usdc": - if (isInLayer1(currentNetwork.chainId) && isHardMode()) { - currency = "USDC"; - } else { - currency = "ETH"; - history?.push(`/vault/ETH`); - } - break; - case "link": - if (!isPolygon(currentNetwork.chainId) && !isHardMode()) { - currency = "LINK"; - } else { - currency = "ETH"; - history?.push(`/vault/ETH`); - } - break; - case "uni": - if (isOptimism(currentNetwork.chainId) && FEATURES.NEW_VAULTS) { - currency = "UNI"; - } else { - currency = "ETH"; - history?.push(`/vault/ETH`); - } - break; - case "snx": - if (isOptimism(currentNetwork.chainId) && FEATURES.NEW_VAULTS) { - currency = "SNX"; - } else { - currency = "ETH"; - history?.push(`/vault/ETH`); - } - break; - case "matic": - currency = "MATIC"; - if ((!FEATURES.POLYGON && !isPolygon(currentNetwork.chainId)) || isHardMode()) { - history?.push(`/vault/ETH`); - currency = "ETH"; - } - setVaultMode("normal"); - break; - default: - currency = FEATURES.POLYGON && isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"; - break; - } - - // Actions - const [title, setTitle] = useState(t("vault.create")); - const [text, setText] = useState(t("vault.create-text")); - const [isApproved, setIsApproved] = useState(false); - const [isLoading, setIsLoading] = useState(true); - const [btnDisabled, setBtnDisabled] = useState(false); - - // Vault Data - const [vaultOptions, setVaultOptions] = useState>([]); - const [selectedVaultId, setSelectedVaultId] = useState("0"); - const [vaultDebt, setVaultDebt] = useState("0"); - const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); - const [vaultCollateral, setVaultCollateral] = useState("0"); - const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); - const [vaultRatio, setVaultRatio] = useState("0"); - const [tempRatio, setTempRatio] = useState(""); - const [minRatio, setMinRatio] = useState("0"); - const [selectedVault, setSelectedVault] = useState(currency); - const [selectedVaultContract, setSelectedVaultContract] = useState(); - const [selectedVaultRead, setSelectedVaultRead] = useState(); - const [selectedOracleRead, setSelectedOracleRead] = useState(); - const [selectedCollateralContract, setSelectedCollateralContract] = useState(); - const [selectedVaultDecimals, setSelectedVaultDecimals] = useState(18); - - // General Data - const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); - const [tokenBalance, setTokenBalance] = useState("0"); - const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); - - // Inputs - const [addCollateralTxt, setAddCollateralTxt] = useState("0"); - const [addCollateralUSD, setAddCollateralUSD] = useState("0"); - const [removeCollateralTxt, setRemoveCollateralTxt] = useState("0"); - const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); - const [mintTxt, setMintTxt] = useState("0"); - const [mintUSD, setMintUSD] = useState("0"); - const [burnTxt, setBurnTxt] = useState("0"); - const [burnUSD, setBurnUSD] = useState("0"); - const [burnFee, setBurnFee] = useState("0"); - const [vaultStatus, setVaultStatus] = useState(""); - - // Infinite Approval - const approveValue = BigNumber.from("1157920892373161954235709850086879078532699"); - - const USER_VAULT = gql` - query getVault($owner: String!) { - vaults(where: { owner: $owner }) { - id - vaultId - owner - collateral - debt - address - owner - hardVault - } - _meta { - block { - number - hash - } - hasIndexingErrors - } - } - `; - - const tcapPrice = async () => { - const currentTCAPPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - - // @ts-ignore - const [currentTCAPPrice] = await signer.ethcallProvider?.all([currentTCAPPriceCall]); - return currentTCAPPrice; - }; - - const collateralPrice = async () => { - const collateralPriceCall = await selectedOracleRead?.getLatestAnswer(); - - // @ts-ignore - const [currentCollateralPrice] = await signer.ethcallProvider?.all([collateralPriceCall]); - return currentCollateralPrice; - }; - - const validVaults = (): boolean => { - let valid = - !isUndefined(oracles.daiOracle) && - !isUndefined(oracles.tcapOracle) && - !isUndefined(oracles.daiOracleRead) && - !isUndefined(vaults.daiVault) && - !isUndefined(tokens.daiTokenRead); - - if (isInLayer1(currentNetwork.chainId)) { - valid = - valid && - !isUndefined(oracles.wethOracle) && - !isUndefined(oracles.aaveOracle) && - !isUndefined(oracles.linkOracle) && - !isUndefined(oracles.wethOracleRead) && - !isUndefined(oracles.aaveOracleRead) && - !isUndefined(oracles.linkOracleRead) && - !isUndefined(vaults.wethVault) && - !isUndefined(vaults.aaveVault) && - !isUndefined(vaults.linkVault) && - !isUndefined(tokens.aaveToken) && - !isUndefined(tokens.linkToken) && - !isUndefined(tokens.wethTokenRead) && - !isUndefined(tokens.aaveTokenRead) && - !isUndefined(tokens.linkTokenRead); - } - if (isOptimism(currentNetwork.chainId)) { - valid = - valid && - !isUndefined(oracles.linkOracle) && - !isUndefined(oracles.snxOracle) && - !isUndefined(oracles.uniOracle) && - !isUndefined(oracles.linkOracleRead) && - !isUndefined(oracles.snxOracleRead) && - !isUndefined(oracles.uniOracleRead) && - !isUndefined(vaults.linkVault) && - !isUndefined(vaults.snxVault) && - !isUndefined(vaults.uniVault) && - !isUndefined(tokens.linkToken) && - !isUndefined(tokens.snxToken) && - !isUndefined(tokens.uniToken) && - !isUndefined(tokens.linkTokenRead) && - !isUndefined(tokens.snxTokenRead) && - !isUndefined(tokens.uniTokenRead); - } - if (isPolygon(currentNetwork.chainId)) { - valid = - valid && - !isUndefined(oracles.maticOracle) && - !isUndefined(oracles.maticOracleRead) && - !isUndefined(oracles.wbtcOracle) && - !isUndefined(oracles.wbtcOracleRead) && - !isUndefined(vaults.maticVault) && - !isUndefined(vaults.maticVaultRead) && - !isUndefined(vaults.wbtcVault) && - !isUndefined(vaults.wbtcVaultRead) && - !isUndefined(tokens.maticToken) && - !isUndefined(tokens.maticTokenRead) && - !isUndefined(tokens.wbtcToken) && - !isUndefined(tokens.maticTokenRead); - } - - return valid; - }; - - const isGasAsset = () => - (!isPolygon(currentNetwork.chainId) && selectedVault === "ETH") || - (isPolygon(currentNetwork.chainId) && selectedVault === "MATIC"); - - async function loadVault(vaultType: string) { - if (signer.signer && validVaults()) { - let currentVault: any; - let currentVaultRead: any; - let currentToken; - let currentOracleRead; - let currentTokenRead; - let balance; - const provider = getDefaultProvider( - currentNetwork.chainId || NETWORKS.mainnet.chainId, - currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.rinkeby.name - ); - switch (vaultType) { - case "ETH": - currentVault = !isHardMode() ? vaults.wethVault : hardVaults.wethVault; - currentVaultRead = !isHardMode() ? vaults.wethVaultRead : hardVaults.wethVaultRead; - currentToken = tokens.wethToken; - currentOracleRead = oracles.wethOracleRead; - currentTokenRead = tokens.wethTokenRead; - balance = await provider.getBalance(address); - break; - case "WETH": - currentVault = !isHardMode() ? vaults.wethVault : hardVaults.wethVault; - currentVaultRead = !isHardMode() ? vaults.wethVaultRead : hardVaults.wethVaultRead; - currentToken = tokens.wethToken; - currentOracleRead = oracles.wethOracleRead; - currentTokenRead = tokens.wethTokenRead; - break; - case "DAI": - currentVault = !isHardMode() ? vaults.daiVault : hardVaults.daiVault; - currentVaultRead = !isHardMode() ? vaults.daiVaultRead : hardVaults.daiVaultRead; - currentToken = tokens.daiToken; - currentOracleRead = oracles.daiOracleRead; - currentTokenRead = tokens.daiTokenRead; - break; - case "AAVE": - currentVault = vaults.aaveVault; - currentVaultRead = vaults.aaveVaultRead; - currentToken = tokens.aaveToken; - currentOracleRead = oracles.aaveOracleRead; - currentTokenRead = tokens.aaveTokenRead; - break; - case "LINK": - currentVault = vaults.linkVault; - currentVaultRead = vaults.linkVaultRead; - currentToken = tokens.linkToken; - currentOracleRead = oracles.linkOracleRead; - currentTokenRead = tokens.linkTokenRead; - break; - case "SNX": - currentVault = vaults.snxVault; - currentVaultRead = vaults.snxVaultRead; - currentToken = tokens.snxToken; - currentOracleRead = oracles.snxOracleRead; - currentTokenRead = tokens.snxTokenRead; - break; - case "UNI": - currentVault = vaults.uniVault; - currentVaultRead = vaults.uniVaultRead; - currentToken = tokens.uniToken; - currentOracleRead = oracles.uniOracleRead; - currentTokenRead = tokens.uniTokenRead; - break; - case "MATIC": - currentVault = vaults.maticVault; - currentVaultRead = vaults.maticVaultRead; - currentToken = tokens.maticToken; - currentOracleRead = oracles.maticOracleRead; - currentTokenRead = tokens.maticTokenRead; - // balance = await provider.getBalance(address); - break; - case "WBTC": - currentVault = !isHardMode() ? vaults.wbtcVault : hardVaults.wbtcVault; - currentVaultRead = !isHardMode() ? vaults.wbtcVaultRead : hardVaults.wbtcVaultRead; - currentToken = tokens.wbtcToken; - currentOracleRead = oracles.wbtcOracleRead; - currentTokenRead = tokens.wbtcTokenRead; - // balance = await provider.getBalance(address); - break; - case "USDC": - currentVault = hardVaults.usdcVault; - currentVaultRead = hardVaults.usdcVaultRead; - currentToken = tokens.usdcToken; - currentOracleRead = oracles.usdcOracleRead; - currentTokenRead = tokens.usdcTokenRead; - // balance = await provider.getBalance(address); - break; - default: - currentVault = vaults.wethVault; - currentVaultRead = vaults.wethVaultRead; - currentToken = tokens.wethToken; - currentOracleRead = oracles.wethOracleRead; - currentTokenRead = tokens.wethTokenRead; - break; - } - setSelectedVaultContract(currentVault); - setSelectedCollateralContract(currentToken); - setSelectedVaultRead(currentVaultRead); - setSelectedOracleRead(currentOracleRead); - - let currentVaultData: any; - const vaultID = await currentVault.userToVault(address); - if (!vaultID.eq(0)) { - const vault = await currentVault.vaults(vaultID); - currentVaultData = { - vaultId: vaultID, - collateral: vault.Collateral, - debt: vault.Debt, - }; - } - - if (vaultType !== "ETH") { - // @ts-ignore - balance = await currentToken.balanceOf(address); - } - - let decimals = 18; - let currentPrice; - - if (currentVaultData) { - const { vaultId, collateral, debt } = currentVaultData; - // @ts-ignore - const allowanceCall = await currentTokenRead.allowance(address, currentVault.address); - const currentRatioCall = await currentVaultRead.getVaultRatio(vaultId); - - // @ts-ignore - const currentTCAPPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - // @ts-ignore - const decimalsCall = await currentTokenRead.decimals(); - // @ts-ignore - const currentPriceCall = await currentOracleRead.getLatestAnswer(); - const currentMinRatioCall = await currentVaultRead.ratio(); - - // @ts-ignore - const [ - allowance, - currentRatio, - currentTCAPPrice, - decimalsVal, - currentPriceVal, - currentMinRatio, - ] = await signer.ethcallProvider?.all([ - allowanceCall, - currentRatioCall, - currentTCAPPriceCall, - decimalsCall, - currentPriceCall, - currentMinRatioCall, - ]); - - decimals = decimalsVal; - currentPrice = ethers.utils.formatEther(currentPriceVal.mul(10000000000)); - setSelectedVaultId(vaultId); - - if (!allowance.isZero() || vaultType === "ETH") { - const safeValue = isHardMode() ? 20 : 50; - const warnValue = isHardMode() ? 10 : 30; - - setMinRatio(currentMinRatio.toString()); - setIsApproved(true); - setVaultRatio(currentRatio.toString()); - if (currentRatio.toString() === "0") { - setVaultStatus("N/A"); - } else if ( - currentRatio.toString() >= - parseFloat(currentMinRatio.toString()) + safeValue - ) { - setVaultStatus("safe"); - } else if ( - currentRatio.toString() >= - parseFloat(currentMinRatio.toString()) + warnValue - ) { - setVaultStatus("warning"); - } else { - setVaultStatus("danger"); - } - - const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); - - // const parsedCollateral = ethers.utils.formatEther(collateral); - setVaultCollateral(parsedCollateral); - const usdCollateral = toUSD(currentPrice, parsedCollateral); - setVaultCollateralUSD(usdCollateral.toString()); - - const currentTCAPPriceFormat = ethers.utils.formatEther(currentTCAPPrice); - const parsedDebt = ethers.utils.formatEther(debt); - setVaultDebt(parsedDebt); - const usdTCAP = toUSD(currentTCAPPriceFormat, parsedDebt); - setVaultDebtUSD(usdTCAP.toString()); - } else { - setText(t("vault.approve-text")); - setTitle(t("vault.approve")); - setIsApproved(false); - } - } else { - // @ts-ignore - const decimalsCall = await currentTokenRead.decimals(); - // @ts-ignore - const currentPriceCall = await currentOracleRead.getLatestAnswer(); - // @ts-ignore - const [decimalsVal, currentPriceVal] = await signer.ethcallProvider?.all([ - decimalsCall, - currentPriceCall, - ]); - decimals = decimalsVal; - currentPrice = ethers.utils.formatEther(currentPriceVal.mul(10000000000)); - - setSelectedVaultId("0"); - setText(t("vault.create-text")); - setTitle(t("vault.create")); - setIsApproved(false); - } - - setSelectedVaultDecimals(decimals); - const currentBalance = ethers.utils.formatUnits(balance, decimals); - if (parseFloat(currentBalance) < 0.09) { - setTokenBalanceDecimals(4); - } else { - setTokenBalanceDecimals(2); - } - setTokenBalance(currentBalance); - - const usdBalance = toUSD(currentPrice, currentBalance); - setTokenBalanceUSD(usdBalance.toString()); - setLoadingMode(false); - } - } - - const { data, error, refetch, networkStatus } = useQuery(USER_VAULT, { - variables: { owner: address }, - pollInterval: 200000, - fetchPolicy: "no-cache", - notifyOnNetworkStatusChange: true, - onError: () => { - console.log(error); - }, - onCompleted: () => { - let vaultType = selectedVault; - if (isPolygon(currentNetwork.chainId) && vaultType === "ETH") { - vaultType = "MATIC"; - setSelectedVault("MATIC"); - console.log(data); - } - loadVault(vaultType); - }, - }); - - const refresh = async () => { - try { - if (!isOptimism(currentNetwork.chainId)) { - await refetch(); - } else { - loadVault(selectedVault); - } - } catch (error) { - console.log(error); - // catch error in case the vault screen is changed - } - }; - - const resetFields = () => { - setBurnFee("0"); - setAddCollateralUSD("0"); - setAddCollateralTxt("0"); - setRemoveCollateralTxt("0"); - setRemoveCollateralUSD("0"); - setMintTxt("0"); - setMintUSD("0"); - setBurnUSD("0"); - setBurnTxt("0"); - }; - - const handleRadioBtnChange = async (value: string) => { - setLoadingMode(true); - setVaultMode(value); - setIsApproved(false); - setTokenBalance("0"); - setTokenBalanceUSD("0"); - setSelectedVault("ETH"); - - history?.push(`/vault/ETH`); - resetFields(); - await refetch(); - }; - - const changeVault = async (newRatio: number, reset = false) => { - const safeValue = isHardMode() ? 20 : 50; - const warnValue = isHardMode() ? 10 : 30; - let r = newRatio; - - if (reset) { - r = parseFloat(tempRatio); - setVaultRatio(tempRatio); - setTempRatio(""); - resetFields(); - } else { - if (tempRatio === "") { - setTempRatio(vaultRatio); - } - r = newRatio; - setVaultRatio(r.toString()); - } - - if (r === 0) { - setVaultStatus(t("vault.status.na")); - } else if (r >= parseFloat(minRatio) + safeValue) { - setVaultStatus(t("vault.status.safe")); - } else if (r >= parseFloat(minRatio) + warnValue) { - setVaultStatus(t("vault.status.warning")); - } else if (r >= parseFloat(minRatio)) { - setVaultStatus(t("vault.status.danger")); - } else { - setVaultRatio("0"); - setVaultStatus(t("vault.status.error")); - } - }; - - // forms - const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { - if (isHardMode()) { - const d = parseFloat(vaultDebt); - let newDebt = 0; - if (isMint) { - newDebt = amount + d; - } else { - newDebt = d - amount; - } - return newDebt >= 20 || newDebt === 0; - } - return true; - }; - - const onChangeAddCollateral = async (event: React.ChangeEvent) => { - setAddCollateralTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - let usd = toUSD(currentPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); - changeVault(r); - setAddCollateralUSD(usd.toString()); - } else { - changeVault(0, false); - setAddCollateralUSD("0"); - } - }; - - const onFocusAddCollateral = () => { - if (addCollateralTxt && parseFloat(addCollateralTxt) === 0) { - setAddCollateralTxt(""); - } - }; - - const onBlurAddCollateral = () => { - if (!addCollateralTxt) { - setAddCollateralTxt("0"); - } - }; - - const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { - setRemoveCollateralTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - let usd = toUSD(currentPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); - changeVault(r); - setRemoveCollateralUSD(usd.toString()); - } else { - changeVault(0, false); - setRemoveCollateralUSD("0"); - } - }; - - const onFocusRemoveCollateral = () => { - if (removeCollateralTxt && parseFloat(removeCollateralTxt) === 0) { - setRemoveCollateralTxt(""); - } - }; - - const onBlurRemoveCollateral = () => { - if (!removeCollateralTxt) { - setRemoveCollateralTxt("0"); - } - }; - - const onChangeMint = async (event: React.ChangeEvent) => { - setMintTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - let usd = toUSD(currentTcapPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); - const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentTcapPrice); - changeVault(r); - setMintUSD(usd.toString()); - } else { - changeVault(0, false); - setMintUSD("0"); - } - }; - - const onFocusMint = () => { - if (mintTxt && parseFloat(mintTxt) === 0) { - setMintTxt(""); - } - }; - - const onBlurMint = () => { - if (!mintTxt) { - setMintTxt("0"); - } - }; - - const onChangeBurn = async (event: React.ChangeEvent) => { - try { - setBurnTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - let usd = toUSD(currentTcapPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); - const r = await getRatio( - vaultCollateral, - currentPrice, - newDebt.toString(), - currentTcapPrice - ); - changeVault(r); - setBurnUSD(usd.toString()); - const currentBurnFee = await selectedVaultContract?.getFee( - ethers.utils.parseEther(event.target.value) - ); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - } else { - changeVault(0, false); - setBurnUSD("0"); - setBurnFee("0"); - } - } catch (error) { - console.error(error); - changeVault(0, true); - setBurnUSD("0"); - setBurnFee("0"); - } - }; - - const onFocusBurn = () => { - if (burnTxt && parseFloat(burnTxt) === 0) { - setBurnTxt(""); - } - }; - - const onBlurBurn = () => { - if (!burnTxt) { - setBurnTxt("0"); - } - }; - - const addCollateral = async () => { - if (addCollateralTxt && parseFloat(addCollateralTxt) > 0) { - setBtnDisabled(true); - // fix decimals - const amount = ethers.utils.parseUnits(addCollateralTxt, selectedVaultDecimals); - try { - if (isGasAsset()) { - let tx; - if (selectedVault === "ETH") { - tx = await selectedVaultContract?.addCollateralETH({ - value: amount, - }); - } else { - tx = await selectedVaultContract?.addCollateralMATIC({ - value: amount, - }); - } - notifyUser(tx, refresh); - } else { - const tx = await selectedVaultContract?.addCollateral(amount); - notifyUser(tx, refresh); - } - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("errors.no-funds")); - } - } - setBtnDisabled(false); - setAddCollateralTxt("0"); - setAddCollateralUSD("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const maxAddCollateral = async (e: React.MouseEvent) => { - e.preventDefault(); - let balance = "0"; - if (selectedVault === "ETH") { - const provider = getDefaultProvider(currentNetwork.chainId, currentNetwork.name); - balance = ethers.utils.formatEther(await provider.getBalance(address)); - } else if (selectedCollateralContract) { - const value = BigNumber.from(await selectedCollateralContract.balanceOf(address)); - balance = ethers.utils.formatUnits(value, selectedVaultDecimals); - } - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - setAddCollateralTxt(balance); - let usd = toUSD(currentPrice, balance); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(balance) + parseFloat(vaultCollateral); - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); - changeVault(r); - setAddCollateralUSD(usd.toString()); - }; - - const removeCollateral = async () => { - if (removeCollateralTxt && parseFloat(removeCollateralTxt) > 0) { - const amount = ethers.utils.parseUnits(removeCollateralTxt, selectedVaultDecimals); - setBtnDisabled(true); - try { - if (isGasAsset()) { - let tx; - if (selectedVault === "ETH") { - tx = await selectedVaultContract?.removeCollateralETH(amount); - } else { - tx = await selectedVaultContract?.removeCollateralMATIC(amount); - } - notifyUser(tx, refresh); - } else { - const tx = await selectedVaultContract?.removeCollateral(amount); - notifyUser(tx, refresh); - } - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.tran-rejected")); - } - } - setBtnDisabled(false); - setRemoveCollateralTxt("0"); - setRemoveCollateralUSD("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const safeRemoveCollateral = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - let collateralToRemove = await getSafeRemoveCollateral( - minRatio, - vaultCollateral, - currentPrice, - currentTcapPrice, - vaultDebt, - isHardMode() - ); - if (selectedVaultDecimals === 8) { - collateralToRemove = parseFloat(collateralToRemove.toFixed(8)) - 0.00000001; - collateralToRemove = parseFloat(collateralToRemove.toFixed(8)); - } - setRemoveCollateralTxt(collateralToRemove.toString()); - let usd = toUSD(currentPrice, collateralToRemove.toString()); - if (!usd) { - usd = 0; - } - const newCollateral = parseFloat(vaultCollateral) - collateralToRemove; - const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentTcapPrice); - changeVault(r); - setRemoveCollateralUSD(usd.toString()); - }; - - const mintTCAP = async () => { - if (mintTxt && parseFloat(mintTxt) > 0) { - if (isMinRequiredTcap(parseFloat(mintTxt), true)) { - setBtnDisabled(true); - try { - const amount = ethers.utils.parseEther(mintTxt); - const tx = await selectedVaultContract?.mint(amount); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.no-collateral")); - } - } - setBtnDisabled(false); - setMintTxt("0"); - setMintUSD("0"); - } else { - errorNotification(t("vault.errors.min-tcap")); - } - } else { - errorNotification(t("errors.empty")); - } - }; - - const safeMintTCAP = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - const safeMint = await getSafeMint( - minRatio, - vaultCollateral, - currentPrice, - currentTcapPrice, - vaultDebt, - isHardMode() - ); - setMintTxt(safeMint.toString()); - let usd = toUSD(currentTcapPrice, safeMint.toString()); - if (!usd) { - usd = 0; - } - const newDebt = safeMint + parseFloat(vaultDebt); - const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentTcapPrice); - changeVault(r); - setMintUSD(usd.toString()); - }; - - const burnTCAP = async () => { - if (burnTxt && parseFloat(burnTxt) > 0) { - const amount = ethers.utils.parseEther(burnTxt); - setBtnDisabled(true); - try { - const currentBurnFee = await selectedVaultContract?.getFee(amount); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - const tx = await selectedVaultContract?.burn(amount, { value: increasedFee }); - notifyUser(tx, refresh); - } catch (error) { - console.error(error); - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("vault.errors.burn-too-high")); - } - } - setBtnDisabled(false); - setBurnTxt("0"); - setBurnUSD("0"); - setBurnFee("0"); - } else { - errorNotification(t("errors.empty")); - } - }; - - const maxBurnTCAP = async (e: React.MouseEvent) => { - e.preventDefault(); - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentTcapPrice = ethers.utils.formatEther(await tcapPrice()); - const currentBalanceCall = await tokens.tcapTokenRead?.balanceOf(address); - const currentVaultDebtCall = await selectedVaultRead?.vaults(selectedVaultId); - - // @ts-ignore - const [currentBalance, currentVault] = await signer.ethcallProvider?.all([ - currentBalanceCall, - currentVaultDebtCall, - ]); - - let balanceFormat = "0"; - let balance; - if (currentBalance.lt(currentVault.Debt)) { - balanceFormat = ethers.utils.formatEther(currentBalance); - balance = currentBalance; - } else { - balanceFormat = vaultDebt; - balance = currentVault.Debt; - } - setBurnTxt(balanceFormat); - let usd = toUSD(currentTcapPrice, balanceFormat); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(balanceFormat) - parseFloat(balanceFormat); - const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentTcapPrice); - changeVault(r); - setBurnUSD(usd.toString()); - - if (balanceFormat !== "0") { - const currentBurnFee = await selectedVaultContract?.getFee(balance); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - } else { - setBurnFee("0"); - } - }; - - const action = async () => { - if (selectedVaultId === "0") { - setBtnDisabled(true); - try { - const tx = await selectedVaultContract?.createVault(); - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification(t("errors.tran-rejected")); - } - } - setBtnDisabled(false); - } else { - setBtnDisabled(true); - try { - const amount = approveValue; - const tx = await selectedCollateralContract?.approve( - selectedVaultContract?.address, - amount - ); - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification(t("errors.tran-rejected")); - } - } - setBtnDisabled(false); - } - }; - - const handleTokenChange = async (value: string) => { - setIsApproved(false); - setTokenBalance("0"); - setTokenBalanceUSD("0"); - setSelectedVault(value); - // Clean form - setAddCollateralTxt(""); - setAddCollateralUSD("0"); - setRemoveCollateralTxt(""); - setRemoveCollateralUSD("0"); - setMintTxt(""); - setMintUSD("0"); - setBurnTxt(""); - setBurnUSD("0"); - setBurnFee("0"); - // Load values - history?.push(`/vault/${value}`); - await refetch(); - }; - - useEffect(() => { - async function load() { - let vOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; - if (isHardMode()) { - vOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; - } - if (isOptimism(currentNetwork.chainId) && !isHardMode()) { - vOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; - } - if (isPolygon(currentNetwork.chainId) && !isHardMode()) { - vOptions = ["MATIC", "DAI", "WBTC"]; - } - setVaultOptions(vOptions); - // TODO : if stuck at pending do something - if (networkStatus === NetworkStatus.ready || networkStatus === NetworkStatus.error) { - setIsLoading(false); - } - } - load(); - // eslint-disable-next-line - }, [address, data]); - - if (isLoading) { - return ( -
- -
- ); - } - - const CollateralDropdown = () => ( -
-
Collateral:
- handleTokenChange(eventKey || "ETH")}> - -
- {selectedVault.toUpperCase()} -
-
- - {vaultOptions.map((item) => ( - - {item} - - ))} - -
-
- ); - - const CollateralBalance = () => ( -
-
- {(() => { - switch (selectedVault) { - case "DAI": - return ; - case "AAVE": - return ; - case "LINK": - return ; - case "UNI": - return ; - case "SNX": - return ; - case "MATIC": - return ; - case "WBTC": - return ; - case "USDC": - return ; - default: - return ; - } - })()} -

- -

-
-

- 1000 ? 0 : 2} - /> -

-
- ); - - const CollateralBalance2 = () => ( -
-
- {(() => { - switch (selectedVault) { - case "DAI": - return ; - case "AAVE": - return ; - case "LINK": - return ; - case "UNI": - return ; - case "SNX": - return ; - case "MATIC": - return ; - case "WBTC": - return ; - case "USDC": - return ; - default: - return ; - } - })()} -

- -

- / -
- 1000 ? 0 : 2} - /> -
- ); - - /* if (loadingMode) { - return ; - } */ - - return ( - <> - {isInLayer1(currentNetwork.chainId) && ( -
- - {radios.map((radio, idx) => ( - handleRadioBtnChange(e.currentTarget.value)} - > - {radio.name} - - ))} - - {isHardMode() && ( - - {t("vault.hard-mode-info")}
- {t("vault.hard-mode-info2")} - - } - > - -
- )} -
- )} - {loadingMode ? ( -
- -
- ) : ( - <> - {isApproved ? ( - <> -
-
- - - - - -
-

{t("vault.balance-title", { vault: selectedVault })}

- -
-
-
- - -
-

{t("vault.ratio-title")}

{" "} - - {t("vault.ratio-warning", { minRatio })} - - } - > - - -
-
-

- -

-
-

{vaultStatus.toUpperCase()}

-
-
-
-
-
- -
-

{t("vault.collateral.title")}

-
-
- {(() => { - switch (selectedVault) { - case "DAI": - return ; - case "AAVE": - return ; - case "LINK": - return ; - case "SNX": - return ; - case "UNI": - return ; - case "MATIC": - return ; - case "WBTC": - return ; - case "USDC": - return ; - default: - return ; - } - })()} -

- -

-
-

- 1000 ? 0 : 2} - /> -

-
-
-
- - - <>{t("vault.collateral.add", { collateral: selectedVault })} - - - - <>{t("max")} - - - - - - - - - - - - - <>{t("vault.collateral.remove", { collateral: selectedVault })} - - - - <>{t("max-safe")} - - - - - - - - - - -
-
-
-
- -
-

- <>{t("vault.debt.title")} -

-
-
- -

- -

-
-

- 1000 ? 0 : 2} - /> -

-
-
-
- - {t("vault.debt.mint")} - - - <>{t("max-safe")} - - - - - - - - - - - - {t("vault.debt.burn")} - - - <>{t("max")} - - - - - - - - - - - <>{t("vault.debt.fee")}: - {" "} - {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} - - -
-
-
-
- - ) : ( -
- - - - - - -
{title}
-

{text}

- -
-
-
- )} - - )} - - ); -}; - -export default Mint; diff --git a/src/components/Vault/Monitoring/Liquidate.tsx b/src/components/Vault/Monitoring/Liquidate.tsx deleted file mode 100644 index 1e5500f..0000000 --- a/src/components/Vault/Monitoring/Liquidate.tsx +++ /dev/null @@ -1,393 +0,0 @@ -import React, { useContext, useEffect, useState } from "react"; -import { Button, Form } from "react-bootstrap"; -import Table from "react-bootstrap/Table"; -import { ethers, BigNumber } from "ethers"; -import InputGroup from "react-bootstrap/esm/InputGroup"; -import Modal from "react-bootstrap/esm/Modal"; -import NumberFormat from "react-number-format"; -import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; -import Tooltip from "react-bootstrap/esm/Tooltip"; -import { useTranslation } from "react-i18next"; -import "../../../styles/modal.scss"; -import { - hardVaultsContext, - networkContext, - oraclesContext, - signerContext, - tokensContext, - vaultsContext, -} from "../../../state"; -import { VaultsType } from "./types"; -import { - errorNotification, - isPolygon, - notifyUser, - numberFormatStr, - toUSD, -} from "../../../utils/utils"; - -type props = { - show: boolean; - currentAddress: string; - liqVault: VaultsType | null; - onHide: () => void; - refresh: () => void; -}; - -const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) => { - const { t } = useTranslation(); - const currentNetwork = useContext(networkContext); - const signer = useContext(signerContext); - const oracles = useContext(oraclesContext); - const vaults = useContext(vaultsContext); - const hardVaults = useContext(hardVaultsContext); - const tokens = useContext(tokensContext); - const [currentVault, setCurrentVault] = useState(); - const [tcapBalance, setTcapBalance] = useState("0"); - const [tcapPrice, setTcapPrice] = useState("0"); - const [requiredTcap, setRequiredTcap] = useState("0"); - const [maxTcap, setMaxTcap] = useState("0"); - const [maxTcapUSD, setMaxTcapUSD] = useState("0"); - const [reward, setReward] = useState("0"); - const [rewardUSD, setRewardUSD] = useState("0"); - const [burnFee, setBurnFee] = useState("0"); - const [burnFeeUsd, setBurnFeeUsd] = useState("0"); - const [canLiquidate, setCanLiquidate] = useState(true); - - useEffect(() => { - async function load() { - if (currentAddress !== "" && liqVault !== null && vaults) { - let cVault = vaults.wethVault; - let cVaultRead = vaults.wethVaultRead; - let oracleRead = oracles.wethOracleRead; - if (liqVault.isHardVault) { - cVault = hardVaults.wethVault; - cVaultRead = hardVaults.wethVaultRead; - } - switch (liqVault.collateralSymbol) { - case "DAI": - if (liqVault.isHardVault) { - cVault = hardVaults.daiVault; - cVaultRead = hardVaults.daiVaultRead; - } else { - cVault = vaults.daiVault; - cVaultRead = vaults.daiVaultRead; - } - oracleRead = oracles.daiOracleRead; - break; - case "AAVE": - cVault = vaults.aaveVault; - cVaultRead = vaults.aaveVaultRead; - oracleRead = oracles.aaveOracleRead; - break; - case "LINK": - cVault = vaults.linkVault; - cVaultRead = vaults.linkVaultRead; - oracleRead = oracles.linkOracleRead; - break; - case "SNX": - cVault = vaults.snxVault; - cVaultRead = vaults.snxVaultRead; - oracleRead = oracles.snxOracleRead; - break; - case "UNI": - cVault = vaults.uniVault; - cVaultRead = vaults.uniVaultRead; - oracleRead = oracles.uniOracleRead; - break; - case "MATIC": - cVault = vaults.maticVault; - cVaultRead = vaults.maticVaultRead; - oracleRead = oracles.maticOracleRead; - break; - case "WBTC": - cVault = vaults.wbtcVault; - cVaultRead = vaults.wbtcVaultRead; - oracleRead = oracles.wbtcOracleRead; - break; - case "USDC": - cVault = hardVaults.usdcVault; - cVaultRead = hardVaults.usdcVaultRead; - oracleRead = oracles.usdcOracleRead; - break; - default: - if (liqVault.isHardVault) { - cVault = hardVaults.wethVault; - cVaultRead = hardVaults.wethVaultRead; - } else { - cVault = vaults.wethVault; - cVaultRead = vaults.wethVaultRead; - } - oracleRead = oracles.wethOracleRead; - break; - } - if (liqVault.id !== "" && cVault && cVaultRead) { - try { - setCurrentVault(cVault); - const tcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(currentAddress); - const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP( - BigNumber.from(liqVault.id) - ); - const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(liqVault.id)); - const oraclePriceCall = await oracleRead?.getLatestAnswer(); - const ethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - // @ts-ignore - const [balance, tcapOraclePrice, reqTcap, liqReward, collateralPrice, ethPrice] = - await signer.ethcallProvider?.all([ - tcapBalanceCall, - tcapPriceCall, - reqTcapCall, - liqRewardCall, - oraclePriceCall, - ethOraclePriceCall, - ]); - const tcapBalanceText = ethers.utils.formatEther(balance); - const tcapPriceText = ethers.utils.formatEther(tcapOraclePrice); - const reqTcapText = ethers.utils.formatEther(reqTcap); - const liqRewardText = ethers.utils.formatUnits(liqReward, liqVault.decimals); - const priceText = ethers.utils.formatEther(collateralPrice.mul(10000000000)); - const ethPriceText = ethers.utils.formatEther(ethPrice.mul(10000000000)); - const currentLiqFee = await cVault?.getFee(reqTcap); - const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - - setTcapBalance(tcapBalanceText); - setTcapPrice(tcapPriceText); - setRequiredTcap(reqTcapText); - setMaxTcap(reqTcapText); - setMaxTcapUSD(toUSD(reqTcapText, tcapPriceText).toFixed(2)); - setReward(liqRewardText); - setRewardUSD(toUSD(liqRewardText, priceText).toFixed(2)); - setBurnFee(ethFee); - setBurnFeeUsd(toUSD(ethFee, ethPriceText).toFixed(2)); - } catch (error) { - // Error happens when trying to calculate reward on a not liquidable vault - if (error.code !== "UNPREDICTABLE_GAS_LIMIT") { - console.log(error.code); - } - } - } - } - } - load(); - // eslint-disable-next-line - }, [currentAddress, liqVault]); - - const onChangeMaxTcap = (event: React.ChangeEvent) => { - setMaxTcap(event.target.value); - setMaxTcapUSD(toUSD(event.target.value, tcapPrice).toFixed(2)); - }; - - const minTcap = async (e: React.MouseEvent) => { - e.preventDefault(); - setMaxTcap(requiredTcap); - setMaxTcapUSD(toUSD(requiredTcap, tcapPrice).toFixed(2)); - }; - - const liquidate = async (event: React.MouseEvent) => { - event.preventDefault(); - if (currentAddress && liqVault !== null && canLiquidate && currentVault) { - setCanLiquidate(false); - const maxAmountTcap = parseFloat(maxTcap); - if (maxTcap && maxAmountTcap > 0) { - if (maxAmountTcap >= parseFloat(requiredTcap)) { - if (maxAmountTcap <= parseFloat(tcapBalance)) { - try { - const currentLiqFee = await currentVault?.getFee( - ethers.utils.parseEther(requiredTcap) - ); - const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee); - const tx = await currentVault.liquidateVault( - BigNumber.from(liqVault.id), - ethers.utils.parseEther(maxTcap), - { value: increasedFee } - ); - notifyUser(tx, refresh); - await refresh(); - setMaxTcap(""); - onHide(); - } catch (error) { - errorNotification("Burn fee less than required."); - } - } else { - errorNotification(t("errors.no-tcap")); - } - } else { - errorNotification(t("errors.less-tcap")); - } - } else { - errorNotification(t("errors.empty")); - } - setCanLiquidate(true); - } - }; - - const netReward = parseFloat(rewardUSD) - parseFloat(maxTcapUSD) - parseFloat(burnFeeUsd); - - const getTokeSymbol = () => { - if (liqVault !== null) { - if (liqVault.collateralSymbol === "WETH") { - return "ETH"; - } - return liqVault.collateralSymbol; - } - return ""; - }; - - const rewardHelp = () => ( - - <>{t("monitoring.reward-info")} - - ); - - const tcapAmountHelp = () => ( - - <>{t("monitoring.tcap-amount-info")} - - ); - - const netRewardHelp = () => ( - - <> - {t("monitoring.net-reward-info1")}:
- {t("monitoring.net-reward-info2")} - -
- ); - - const helpToolTip = (column: number) => { - let help = rewardHelp(); - if (column === 1) { - help = tcapAmountHelp(); - } else if (column === 3) { - help = netRewardHelp(); - } - return ( - - - - ); - }; - - return ( - { - setMaxTcap("0"); - setMaxTcapUSD("0"); - onHide(); - }} - > - - - <>{t("monitoring.liquidate-vault")} - - - -
-
- - <> - - <>{t("amount-tcap")} - - - - MIN REQUIRED - - - - - - - - -
- -
- <>{t("monitoring.reward")}: - {" "} - {getTokeSymbol()} -
-
- -
- Burn Fee:{" "} - {" "} - {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} -
-
-
- -
-
- - - - - - - - - - - - - -
- <>{t("monitoring.reward")} - {helpToolTip(0)} - - <>{t("required-tcap")} - {helpToolTip(1)} - Burn Fee - <>{t("monitoring.net-reward")} - {helpToolTip(3)} -
${numberFormatStr(rewardUSD, 2, 2)}${numberFormatStr(maxTcapUSD, 2, 2)}${numberFormatStr(burnFeeUsd, 2, 2)}${numberFormatStr(netReward.toFixed(2), 2, 2)}
- - - - - - ); -}; - -export default Liquidate; diff --git a/src/components/Vault/Monitoring/Pagination.tsx b/src/components/Vault/Monitoring/Pagination.tsx deleted file mode 100644 index 29a8e72..0000000 --- a/src/components/Vault/Monitoring/Pagination.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import React from "react"; -import Pagination from "react-bootstrap/Pagination"; -import { PaginationType } from "./types"; - -type props = { - pagination: PaginationType; - onPageSelected: (pageNumber: number) => void; -}; - -export const VaultPagination = ({ pagination, onPageSelected }: props) => { - const pag = Array.from(Array(pagination.pages).keys()); - const activePag = pagination.current; - - const VaultPages = () => { - const midPages = Array.from(Array(5).keys()); - const midPage = Math.floor(pagination.pages / 2); - midPages[0] = midPage - 2; - midPages[1] = midPage - 1; - midPages[2] = midPage; - midPages[3] = midPage + 1; - midPages[4] = midPage + 2; - - return ( - <> - {1} - {pagination.current >= 3 && pagination.current < midPages[0] && } - {pagination.current > 1 && pagination.current < midPages[0] && ( - {pagination.current} - )} - - {midPages.map((item) => ( - onPageSelected(item)} - > - {item} - - ))} - - {pagination.current < pagination.pages && pagination.current > midPages[4] && ( - {pagination.current} - )} - {pagination.current < pagination.pages - 1 && pagination.current > midPages[4] && ( - - )} - onPageSelected(pagination.pages)} - > - {pagination.pages} - - - ); - }; - - return ( - - {pagination.pages >= 10 && ( - onPageSelected(1)} disabled={pagination.previous === 0} /> - )} - onPageSelected(pagination.previous)} - disabled={pagination.previous === 0} - /> - {pagination.pages >= 10 ? ( - - ) : ( - pag.map((item) => ( - onPageSelected(item + 1)} - > - {item + 1} - - )) - )} - onPageSelected(pagination.next)} - disabled={pagination.current === pagination.pages} - /> - {pagination.pages >= 10 && ( - onPageSelected(pagination.pages)} - disabled={pagination.next === 0} - /> - )} - - ); -}; diff --git a/src/components/Vault/Monitoring/Vaults.tsx b/src/components/Vault/Monitoring/Vaults.tsx deleted file mode 100644 index a89f7fa..0000000 --- a/src/components/Vault/Monitoring/Vaults.tsx +++ /dev/null @@ -1,335 +0,0 @@ -import React, { useState } from "react"; -import Button from "react-bootstrap/esm/Button"; -import Table from "react-bootstrap/Table"; -import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; -import Tooltip from "react-bootstrap/esm/Tooltip"; -import { useTranslation } from "react-i18next"; -import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; -import { ReactComponent as SortIcon } from "../../../assets/images/sort.svg"; -import { ReactComponent as SortUpIcon } from "../../../assets/images/sort-up.svg"; -import { ReactComponent as SortDownIcon } from "../../../assets/images/sort-down.svg"; -import Liquidate from "./Liquidate"; -import { PaginationType, VaultsType } from "./types"; -import { numberFormatStr } from "../../../utils/utils"; -import { - capitalize, - TokenIcon, - sortCollateralDesc, - sortCollateralAsc, - sortCollateralUsdDesc, - sortCollateralUsdAsc, - sortDebtDesc, - sortDebtAsc, - sortRatioDesc, - sortRatioAsc, - sortRewardDesc, - sortRewardAsc, -} from "./common"; - -type dataType = { - currentAddress: string; - vaults: Array; - setVaults: (v: Array) => void; - currentStatus: string; - pagination: PaginationType; - refresh: (index: number, symbol: string) => void; -}; - -export const Vaults = ({ - currentAddress, - vaults, - setVaults, - currentStatus, - pagination, - refresh, -}: dataType) => { - const { t } = useTranslation(); - const [showLiquidate, setShowLiquidate] = useState(false); - const [vaultIndex, setVaultIndex] = useState(-1); - const [liqVault, setLiqVault] = useState(null); - const [collateralSort, setCollateralSort] = useState(0); - const [collateralUsdSort, setCollateralUsdSort] = useState(0); - const [debtSort, setDebtSort] = useState(0); - const [ratioSort, setRatioSort] = useState(0); - const [rewardSort, setRewardSort] = useState(0); - // const [renderReward, setRenderReward] = useState(false); - - const liquidateVault = (index: number, lVault: VaultsType) => { - setVaultIndex(index); - setLiqVault(lVault); - setShowLiquidate(true); - }; - - const resetSortTypes = (current: number) => { - if (current !== 1) { - setCollateralSort(0); - } - if (current !== 2) { - setCollateralUsdSort(0); - } - if (current !== 3) { - setDebtSort(0); - } - if (current !== 4) { - setRatioSort(0); - } - if (current !== 5) { - setRewardSort(0); - } - }; - - const onSortCollateralClick = () => { - const sortType = collateralSort === 1 ? 2 : 1; - if (sortType === 1) { - setVaults(vaults.sort(sortCollateralDesc)); - } else { - setVaults(vaults.sort(sortCollateralAsc)); - } - setCollateralSort(sortType); - resetSortTypes(1); - }; - - const onSortCollateralUsdClick = () => { - const sortType = collateralUsdSort === 1 ? 2 : 1; - if (sortType === 1) { - setVaults(vaults.sort(sortCollateralUsdDesc)); - } else { - setVaults(vaults.sort(sortCollateralUsdAsc)); - } - setCollateralUsdSort(sortType); - resetSortTypes(2); - }; - - const onSortDebtClick = () => { - const sortType = debtSort === 1 ? 2 : 1; - if (sortType === 1) { - setVaults(vaults.sort(sortDebtDesc)); - } else { - setVaults(vaults.sort(sortDebtAsc)); - } - setDebtSort(sortType); - resetSortTypes(3); - }; - - const onSortRatioClick = () => { - const sortType = ratioSort === 1 ? 2 : 1; - if (sortType === 1) { - setVaults(vaults.sort(sortRatioDesc)); - } else { - setVaults(vaults.sort(sortRatioAsc)); - } - setRatioSort(sortType); - resetSortTypes(4); - }; - - const onSortRewardClick = () => { - const sortType = rewardSort === 1 ? 2 : 1; - if (sortType === 1) { - setVaults(vaults.sort(sortRewardDesc)); - } else { - setVaults(vaults.sort(sortRewardAsc)); - } - setRewardSort(sortType); - resetSortTypes(5); - }; - - const sortingIncon = (sortOrder: number) => { - if (sortOrder === 0) { - return ; - } - if (sortOrder === 1) { - return ; - } - return ; - }; - - const statusTag = (index: number, v: VaultsType) => { - if (currentAddress === "") { - return {capitalize(v.status)}; - } - if (v.status === "liquidation") { - return ( - - ); - } - if (v.url !== "") { - return ( - - {capitalize(v.status)} - - ); - } - return {capitalize(v.status)}; - }; - - return ( - <> - - - - - - - - - - - {currentStatus === "liquidation" && ( - - )} - - - - {vaults.map((v, index) => { - const itemPage = Math.ceil((index + 1) / pagination.itemsPerPage); - return ( - - - - - - - - - {currentStatus === "liquidation" && ( - - )} - - ); - })} - -
Vault Id - <>{t("status")} - - <> - Empty: {t("monitoring.empty-info")}
- Ready: {t("monitoring.ready-info")}
- Active: {t("monitoring.active-info")}
- Liquidation:{" "} - {t("monitoring.liquidation-info")}
- - - } - > - -
-
- <>{t("collateral")} - - - <>{t("collateral")} (USD) - - -
- - - <>{t("debt")} - - -
-
- <>{t("debt")} (USD) - - <>{t("monitoring.ratio")} - - - <>{t("monitoring.net-reward")} - -
{numberFormatStr(v.id, 0, 0)} -
- {statusTag(index, v)} - {v.isHardVault && Hard mode} -
-
- - {numberFormatStr(v.collateralValue, 4, 12)} - - } - > -
- {numberFormatStr(v.collateralValue, 4, 4)} - -
-
-
-
- ${numberFormatStr(v.collateralUsd, 2, 2)} -
-
-
- - {numberFormatStr(v.debt, 4, 12)} - - } - > - {numberFormatStr(v.debt, 4, 4)} - -
-
-
- ${numberFormatStr(v.debtUsd, 2, 2)} -
-
-
- - Min Ratio: {v.minRatio}% - - } - > - - {v.ratio.toFixed(0)} - {v.ratio === 0 ? "" : "%"} - - -
-
-
- ${v.netReward.toFixed(2)} -
-
- { - setLiqVault(null); - setVaultIndex(-1); - setShowLiquidate(false); - }} - refresh={() => refresh(vaultIndex, liqVault !== null ? liqVault.collateralSymbol : "ETH")} - /> - - ); -}; diff --git a/src/components/Vault/Monitoring/common.tsx b/src/components/Vault/Monitoring/common.tsx deleted file mode 100644 index abf3c8f..0000000 --- a/src/components/Vault/Monitoring/common.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import React from "react"; -import { VaultsType } from "./types"; -import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; -import { ReactComponent as DAIIcon } from "../../../assets/images/graph/DAI.svg"; -import { ReactComponent as AAVEIcon } from "../../../assets/images/graph/aave.svg"; -import { ReactComponent as LINKIcon } from "../../../assets/images/graph/chainlink.svg"; -import { ReactComponent as UNIIcon } from "../../../assets/images/graph/uni.svg"; -import { ReactComponent as SNXIcon } from "../../../assets/images/graph/snx.svg"; -import { ReactComponent as MATICIcon } from "../../../assets/images/graph/polygon.svg"; -import { ReactComponent as WBTCIcon } from "../../../assets/images/graph/wbtc.svg"; -import { ReactComponent as USDCIcon } from "../../../assets/images/graph/usdc.svg"; - -type iconProps = { - name: string; -}; - -export const VAULT_STATUS = { - empty: "empty", - ready: "ready", - active: "active", - liquidation: "liquidation", -}; - -export const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); - -export const TokenIcon = ({ name }: iconProps) => { - switch (name) { - case "eth": - return ; - case "weth": - return ; - case "dai": - return ; - case "aave": - return ; - case "link": - return ; - case "uni": - return ; - case "snx": - return ; - case "matic": - return ; - case "wbtc": - return ; - case "usdc": - return ; - default: - return <>; - } -}; - -export const sortCollateralAsc = (a: VaultsType, b: VaultsType) => - parseFloat(a.collateralValue) - parseFloat(b.collateralValue); - -export const sortCollateralDesc = (a: VaultsType, b: VaultsType) => - parseFloat(b.collateralValue) - parseFloat(a.collateralValue); - -export const sortCollateralUsdAsc = (a: VaultsType, b: VaultsType) => - parseFloat(a.collateralUsd) - parseFloat(b.collateralUsd); - -export const sortCollateralUsdDesc = (a: VaultsType, b: VaultsType) => - parseFloat(b.collateralUsd) - parseFloat(a.collateralUsd); - -export const sortDebtAsc = (a: VaultsType, b: VaultsType) => - parseFloat(a.collateralValue) - parseFloat(b.collateralValue); - -export const sortDebtDesc = (a: VaultsType, b: VaultsType) => - parseFloat(b.debt) - parseFloat(a.debt); - -export const sortRatioAsc = (a: VaultsType, b: VaultsType) => a.ratio - b.ratio; - -export const sortRatioDesc = (a: VaultsType, b: VaultsType) => b.ratio - a.ratio; - -export const sortRewardAsc = (a: VaultsType, b: VaultsType) => a.netReward - b.netReward; - -export const sortRewardDesc = (a: VaultsType, b: VaultsType) => b.netReward - a.netReward; diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx deleted file mode 100644 index 0b92b07..0000000 --- a/src/components/Vault/Monitoring/index.tsx +++ /dev/null @@ -1,1170 +0,0 @@ -import React, { useContext, useEffect, useRef, useState } from "react"; -import { ethers, BigNumber } from "ethers"; -import Button from "react-bootstrap/esm/Button"; -import ButtonGroup from "react-bootstrap/esm/ButtonGroup"; -import Card from "react-bootstrap/esm/Card"; -import Col from "react-bootstrap/Col"; -import Dropdown from "react-bootstrap/Dropdown"; -import { FaArrowsAltH } from "react-icons/fa"; -import Form from "react-bootstrap/Form"; -import Row from "react-bootstrap/esm/Row"; -import Spinner from "react-bootstrap/Spinner"; -import { useTranslation } from "react-i18next"; -import ToggleButton from "react-bootstrap/esm/ToggleButton"; -import "../../../styles/vault-monitoring.scss"; -import { useQuery, gql } from "@apollo/client"; -import { useLocation } from "react-router-dom"; -import { - hardVaultsContext, - networkContext, - oraclesContext, - signerContext, - vaultsContext, -} from "../../../state"; -import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; -import { - getRatio2, - isInLayer1, - isOptimism, - isPolygon, - isUndefined, - numberFormatStr, - toUSD, - validOracles, - validVaults, - validHardVaults, -} from "../../../utils/utils"; -import { Vaults } from "./Vaults"; -import { VaultPagination } from "./Pagination"; -import { - DropdownItemType, - OraclePricesType, - PaginationType, - VaultsRatioType, - VaultsType, - VaultsTotalsType, -} from "./types"; -import { capitalize, TokenIcon, VAULT_STATUS } from "./common"; - -const pagDefault = { - previous: 0, - current: 0, - next: 0, - pages: 0, - lastDataPage: 0, - itemsPerPage: 10, - itemsCount: 0, - lastId: "0", -}; - -const totalsDefault = { - vaults: 0, - collateral: "0", - collateralUSD: "0", - debt: "0", - debtUSD: "0", -}; - -type liqVaultsTempType = { - vaultId: string; - vaultType: string; - decimals: number; - hardVault: boolean; -}; - -const showAllVaults = true; - -export const Monitoring = () => { - const { t } = useTranslation(); - const currentNetwork = useContext(networkContext); - const oracles = useContext(oraclesContext); - const vaults = useContext(vaultsContext); - const hardVaults = useContext(hardVaultsContext); - const signer = useContext(signerContext); - const { state } = useLocation(); - const [skipQuery, setSkipQuery] = useState(false); - const [currentAddress, setCurrentAddress] = useState(""); - const [oraclePrices, setOraclePrices] = useState(); - const [vaultsRatio, setVaultsRatio] = useState(); - const [vaultsTotals, setVaultsTotals] = useState(totalsDefault); - const [vaultList, setVaultList] = useState>([]); - const [vaultGraphList, setVaultGraphList] = useState>([]); - const [pagination, setPagination] = useState(pagDefault); - const [loadMore, setLoadMore] = useState(false); - const [pricesUpdated, setPricesUpdated] = useState(false); - const [filteringRatios, setFilteringRatios] = useState(false); - // @ts-ignore - const [ownerAddress, setOwnerAddress] = useState(state && state.address ? state.address : ""); - // @ts-ignore - const [radioValue, setRadioValue] = useState(state && state.address ? "2" : "1"); - const [tokenSymbol, setTokenSymbol] = useState("all"); - const [currentStatus, setCurrentStatus] = useState("all"); - const [vaultMode, setVaultMode] = useState("all"); - const [currentMinRatio, setCurrentMinRatio] = useState("0%"); - const [currentMaxRatio, setCurrentMaxRatio] = useState("2500%"); - const [renderTable, setRenderTable] = useState(false); - const ratioRangeDropdown = useRef(null); - const minRatioInput = useRef(null); - const maxRatioInput = useRef(null); - const radios = [ - { name: t("all-vaults"), value: "1" }, - { name: t("my-vaults"), value: "2" }, - ]; - const viewsList = [ - { key: "5", name: "5" }, - { key: "10", name: "10" }, - { key: "15", name: "15" }, - { key: "20", name: "20" }, - { key: "25", name: "25" }, - { key: "30", name: "30" }, - ]; - const statusList = [ - { key: "all", name: "All" }, - { key: VAULT_STATUS.empty, name: "Empty" }, - { key: VAULT_STATUS.ready, name: "Ready" }, - { key: VAULT_STATUS.active, name: "Active" }, - { key: VAULT_STATUS.liquidation, name: "Liquidation" }, - ]; - const modeList = [ - { key: "all", name: "All" }, - { key: "regular", name: "Regular" }, - { key: "hard", name: "Hard" }, - ]; - - const buildFilters = () => { - const weiLimit = "100000000"; - let filter = ""; - let ownerFilter = ""; - let vaultFilter = ""; - let statusFilter = ""; - let modeFilter = ""; - if (radioValue === "2" && ownerAddress !== "") { - ownerFilter = `, owner: "${ownerAddress}"`; - } - if (tokenSymbol !== "all") { - vaultFilter = `tokenSymbol: "${tokenSymbol.toUpperCase()}"`; - } - if (currentStatus !== "all") { - if (currentStatus === "empty") { - statusFilter = `collateral_lt: "${weiLimit}"`; - } - if (currentStatus === "ready") { - statusFilter = `collateral_gte: "${weiLimit}", debt_lt: "${weiLimit}"`; - } - } - if (vaultMode !== "all") { - const isHard = vaultMode === "hard" ? "true" : "false"; - modeFilter = "hardVault: ".concat(isHard); - } - - filter = ownerFilter; - if (vaultFilter !== "") { - filter = filter.concat(`, ${vaultFilter}`); - } - if (statusFilter !== "") { - filter = filter.concat(`, ${statusFilter}`); - } - if (modeFilter !== "") { - filter = filter.concat(`, ${modeFilter}`); - } - if (filter !== "") { - if (loadMore) { - filter = `, where: { blockTS_gt: "${pagination.lastId}" ${filter} }`; - } else { - filter = `, where: { blockTS_gt: "0" ${filter} }`; - } - } - return filter; - }; - - const str = - "query allVaults {" + - `vaults(first: 1000, orderBy: blockTS ${buildFilters()}) {` + - "id " + - "vaultId " + - "owner " + - "collateral " + - "debt " + - "currentRatio " + - "tokenSymbol " + - "hardVault " + - "blockTS " + - "underlyingProtocol { " + - "underlyingToken { " + - "decimals " + - "} " + - "}" + - "} " + - "}"; - - const vaultsQuery = gql` - ${str} - `; - - const loadPrices = async () => { - if (signer && oracles && validOracles(currentNetwork.chainId || 1, oracles)) { - if (signer.signer) { - const address = await signer.signer.getAddress(); - setCurrentAddress(address); - } - const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); - - const ethcalls = [tcapPriceCall, daiOraclePriceCall]; - if (isInLayer1(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(aaveOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(usdcOraclePriceCall); - ethcalls.push(wbtcOraclePriceCall); - } - if (isOptimism(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); - const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(snxOraclePriceCall); - ethcalls.push(uniOraclePriceCall); - } - if (isPolygon(currentNetwork.chainId)) { - const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - ethcalls.push(maticOraclePriceCall); - ethcalls.push(wbtcOraclePriceCall); - } - let tcapOraclePrice = BigNumber.from(0); - let wethOraclePrice = BigNumber.from(0); - let daiOraclePrice = BigNumber.from(0); - let aaveOraclePrice = BigNumber.from(0); - let linkOraclePrice = BigNumber.from(0); - let snxOraclePrice = BigNumber.from(0); - let uniOraclePrice = BigNumber.from(0); - let maticOraclePrice = BigNumber.from(0); - let wbtcOraclePrice = BigNumber.from(0); - let usdcOraclePrice = BigNumber.from(0); - - if (isInLayer1(currentNetwork.chainId)) { - // @ts-ignore - [ - tcapOraclePrice, - daiOraclePrice, - wethOraclePrice, - aaveOraclePrice, - linkOraclePrice, - usdcOraclePrice, - wbtcOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); - } else if (isOptimism(currentNetwork.chainId)) { - // @ts-ignore - [ - tcapOraclePrice, - daiOraclePrice, - wethOraclePrice, - linkOraclePrice, - snxOraclePrice, - uniOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); - } else if (isPolygon(currentNetwork.chainId)) { - // @ts-ignore - [tcapOraclePrice, daiOraclePrice, maticOraclePrice, wbtcOraclePrice] = - await signer.ethcallProvider?.all(ethcalls); - } - - setOraclePrices({ - tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), - wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), - daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), - aaveOraclePrice: ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)), - linkOraclePrice: ethers.utils.formatEther(linkOraclePrice.mul(10000000000)), - uniOraclePrice: ethers.utils.formatEther(uniOraclePrice.mul(10000000000)), - snxOraclePrice: ethers.utils.formatEther(snxOraclePrice.mul(10000000000)), - maticOraclePrice: ethers.utils.formatEther(maticOraclePrice.mul(10000000000)), - wbtcOraclePrice: ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)), - usdcOraclePrice: ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)), - }); - setPricesUpdated(true); - } - }; - - const loadRatios = async () => { - if ( - signer && - vaults && - hardVaults && - validVaults(currentNetwork.chainId || 1, vaults) && - validHardVaults(currentNetwork.chainId || 1, hardVaults) - ) { - const daiRatioCall = await vaults.daiVaultRead?.ratio(); - const ethcalls = [daiRatioCall]; - - if (isInLayer1(currentNetwork.chainId)) { - const wethRatioCall = await vaults.wethVaultRead?.ratio(); - const aaveRatioCall = await vaults.aaveVaultRead?.ratio(); - const linkRatioCall = await vaults.linkVaultRead?.ratio(); - const hardWethRatioCall = await hardVaults.wethVaultRead?.ratio(); - const hardDaiRatioCall = await hardVaults.daiVaultRead?.ratio(); - const hardUsdcRatioCall = await hardVaults.usdcVaultRead?.ratio(); - ethcalls.push(wethRatioCall); - ethcalls.push(aaveRatioCall); - ethcalls.push(linkRatioCall); - ethcalls.push(hardWethRatioCall); - ethcalls.push(hardDaiRatioCall); - ethcalls.push(hardUsdcRatioCall); - } - if (isOptimism(currentNetwork.chainId)) { - const wethRatioCall = await vaults.wethVaultRead?.ratio(); - const linkRatioCall = await vaults.linkVaultRead?.ratio(); - const snxRatioCall = await vaults.snxVaultRead?.ratio(); - const uniRatioCall = await vaults.uniVaultRead?.ratio(); - ethcalls.push(wethRatioCall); - ethcalls.push(linkRatioCall); - ethcalls.push(snxRatioCall); - ethcalls.push(uniRatioCall); - } - if (isPolygon(currentNetwork.chainId)) { - const maticRatioCall = await vaults.maticVaultRead?.ratio(); - const wbtcRatioCall = await vaults.wbtcVaultRead?.ratio(); - ethcalls.push(maticRatioCall); - ethcalls.push(wbtcRatioCall); - } - let ethRatio = 0; - let daiRatio = 0; - let aaveRatio = 0; - let linkRatio = 0; - let snxRatio = 0; - let uniRatio = 0; - let maticRatio = 0; - let wbtcRatio = 0; - let hardEthRatio = 0; - let hardDaiRatio = 0; - let hardUsdcRatio = 0; - if (isInLayer1(currentNetwork.chainId)) { - // @ts-ignore - [daiRatio, ethRatio, aaveRatio, linkRatio, hardEthRatio, hardDaiRatio, hardUsdcRatio] = - await signer.ethcallProvider?.all(ethcalls); - } else if (isOptimism(currentNetwork.chainId)) { - // @ts-ignore - [daiRatio, ethRatio, linkRatio, snxRatio, uniRatio] = await signer.ethcallProvider?.all( - ethcalls - ); - } else if (isPolygon(currentNetwork.chainId)) { - // @ts-ignore - [daiRatio, maticRatio, wbtcRatio] = await signer.ethcallProvider?.all(ethcalls); - } - setVaultsRatio({ - ethRatio, - wethRatio: ethRatio, - daiRatio, - aaveRatio, - linkRatio, - uniRatio, - snxRatio, - maticRatio, - wbtcRatio, - hardEthRatio, - hardWethRatio: hardEthRatio, - hardDaiRatio, - hardUsdcRatio, - }); - } - }; - - const getCollateralPrice = (symbol: string) => { - let price = "0"; - switch (symbol) { - case "ETH": - price = oraclePrices?.wethOraclePrice || "0"; - break; - case "WETH": - price = oraclePrices?.wethOraclePrice || "0"; - break; - case "DAI": - price = oraclePrices?.daiOraclePrice || "0"; - break; - case "AAVE": - price = oraclePrices?.aaveOraclePrice || "0"; - break; - case "LINK": - price = oraclePrices?.linkOraclePrice || "0"; - break; - case "UNI": - price = oraclePrices?.uniOraclePrice || "0"; - break; - case "SNX": - price = oraclePrices?.snxOraclePrice || "0"; - break; - case "MATIC": - price = oraclePrices?.maticOraclePrice || "0"; - break; - case "WBTC": - price = oraclePrices?.wbtcOraclePrice || "0"; - break; - case "USDC": - price = oraclePrices?.usdcOraclePrice || "0"; - break; - default: - break; - } - return price; - }; - - const getMinRatio = (symbol: string, isHardVault: boolean) => { - let minRatio = 200; - switch (symbol) { - case "ETH": - if (isHardVault) { - minRatio = vaultsRatio?.hardEthRatio || 100; - } else { - minRatio = vaultsRatio?.ethRatio || 200; - } - break; - case "WETH": - if (isHardVault) { - minRatio = vaultsRatio?.hardWethRatio || 110; - } else { - minRatio = vaultsRatio?.ethRatio || 200; - } - break; - case "DAI": - if (isHardVault) { - minRatio = vaultsRatio?.hardDaiRatio || 110; - } else { - minRatio = vaultsRatio?.daiRatio || 200; - } - break; - case "AAVE": - minRatio = vaultsRatio?.aaveRatio || 200; - break; - case "LINK": - minRatio = vaultsRatio?.linkRatio || 200; - break; - case "UNI": - minRatio = vaultsRatio?.uniRatio || 200; - break; - case "SNX": - minRatio = vaultsRatio?.snxRatio || 200; - break; - case "MATIC": - minRatio = vaultsRatio?.maticRatio || 200; - break; - case "WBTC": - minRatio = vaultsRatio?.wbtcRatio || 200; - break; - case "USDC": - minRatio = vaultsRatio?.hardUsdcRatio || 110; - break; - default: - break; - } - return minRatio; - }; - - const confPagination = (vData: Array, itemsPerPage: number) => { - if (vData.length > 0) { - const lastVaultId = vData[vData.length - 1].blockTS; - const itemsCount = vData.length; - const pages = Math.ceil(itemsCount / itemsPerPage); - const lastDataPage = Math.ceil(itemsCount / itemsPerPage); - const pag = { - previous: 0, - current: 1, - next: 2, - pages, - lastDataPage, - itemsPerPage, - itemsCount, - lastId: lastVaultId, - }; - setPagination(pag); - } else { - setPagination(pagDefault); - } - }; - - const calculateNetRewardUsd = async ( - vaultId: string, - vaultType: string, - isHardVault: boolean, - decimals: number - ) => { - try { - let cVault = vaults.wethVault; - let cVaultRead = vaults.wethVaultRead; - let vaultPrice = oraclePrices?.wethOraclePrice; - if (isHardVault) { - cVault = hardVaults.wethVault; - cVaultRead = hardVaults.wethVaultRead; - } - - switch (vaultType) { - case "DAI": - if (isHardVault) { - cVault = hardVaults.daiVault; - cVaultRead = hardVaults.daiVaultRead; - } else { - cVault = vaults.daiVault; - cVaultRead = vaults.daiVaultRead; - } - vaultPrice = oraclePrices?.daiOraclePrice; - break; - case "AAVE": - cVault = vaults.aaveVault; - cVaultRead = vaults.aaveVaultRead; - vaultPrice = oraclePrices?.aaveOraclePrice; - break; - case "LINK": - cVault = vaults.linkVault; - cVaultRead = vaults.linkVaultRead; - vaultPrice = oraclePrices?.linkOraclePrice; - break; - case "SNX": - cVault = vaults.snxVault; - cVaultRead = vaults.snxVaultRead; - vaultPrice = oraclePrices?.snxOraclePrice; - break; - case "UNI": - cVault = vaults.uniVault; - cVaultRead = vaults.uniVaultRead; - vaultPrice = oraclePrices?.uniOraclePrice; - break; - case "MATIC": - cVault = vaults.maticVault; - cVaultRead = vaults.maticVaultRead; - vaultPrice = oraclePrices?.maticOraclePrice; - break; - case "WBTC": - cVault = vaults.wbtcVault; - cVaultRead = vaults.wbtcVaultRead; - vaultPrice = oraclePrices?.wbtcOraclePrice; - break; - case "USDC": - cVault = hardVaults.usdcVault; - cVaultRead = hardVaults.usdcVaultRead; - vaultPrice = oraclePrices?.usdcOraclePrice; - break; - default: - if (isHardVault) { - cVault = hardVaults.wethVault; - cVaultRead = hardVaults.wethVaultRead; - } else { - cVault = vaults.wethVault; - cVaultRead = vaults.wethVaultRead; - } - vaultPrice = oraclePrices?.wethOraclePrice; - break; - } - - const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); - const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); - // @ts-ignore - const [reqTcap, liqReward] = await signer.ethcallProvider?.all([reqTcapCall, liqRewardCall]); - - const reqTcapText = ethers.utils.formatEther(reqTcap); - const liqRewardText = ethers.utils.formatUnits(liqReward, decimals); - const currentLiqFee = await cVault?.getFee(reqTcap); - const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - - return ( - toUSD(liqRewardText, vaultPrice || "0") - - toUSD(reqTcapText, oraclePrices?.tcapOraclePrice || "0") - - toUSD(ethFee, oraclePrices?.wethOraclePrice || "0") - ); - } catch (error) { - if (error.code !== "UNPREDICTABLE_GAS_LIMIT") { - console.log(error.code); - } - return 0; - } - }; - - const calculateVaultData = ( - collateralWei: ethers.BigNumberish, - debtWei: ethers.BigNumberish, - symbol: string, - isHardVault: boolean, - decimals: number - ) => { - const collateralText = ethers.utils.formatUnits(collateralWei, decimals); - const debtText = ethers.utils.formatEther(debtWei); - const collateralPrice = getCollateralPrice(symbol); - const collateralUSD = toUSD(collateralText, collateralPrice); - const debtUSD = toUSD(debtText, oraclePrices?.tcapOraclePrice || "0"); - const minRatio = getMinRatio(symbol, isHardVault); - - const ratio = getRatio2( - collateralText, - collateralPrice, - debtText, - oraclePrices?.tcapOraclePrice || "1" - ); - - let status = VAULT_STATUS.liquidation; - if (parseFloat(collateralText) < 0.0000000001) { - status = VAULT_STATUS.empty; - } else if (parseFloat(collateralText) >= 0.0000000001 && parseFloat(debtText) < 0.0000000001) { - status = VAULT_STATUS.ready; - } else if (ratio >= minRatio) { - status = VAULT_STATUS.active; - } - return { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status }; - }; - - const isValidRatio = (value: string) => { - let valid = false; - if (!Number.isNaN(value)) { - valid = Number.parseFloat(value) >= 0; - } - return valid; - }; - - const getMinRangeRatio = (): number => { - if (minRatioInput && minRatioInput.current) { - // @ts-ignore - const minRatio = minRatioInput.current.value; - if (isValidRatio(minRatio)) { - return parseFloat(minRatio); - } - } - return 0; - }; - - const getMaxRangeRatio = (): number => { - if (maxRatioInput && maxRatioInput.current) { - // @ts-ignore - const maxRatio = maxRatioInput.current.value; - if (isValidRatio(maxRatio)) { - return parseFloat(maxRatio); - } - } - return 3000; - }; - - const loadVaults = async (vaultsData: any) => { - const vData = new Array(); - const vLiquidables = new Array(); - const totals = { ...totalsDefault }; - const minFilterRatio = getMinRangeRatio(); - const maxFilterRatio = getMaxRangeRatio(); - - setSkipQuery(true); - setLoadMore(false); - setFilteringRatios(true); - // setLiqLoaded(currentStatus !== VAULT_STATUS.liquidation); - // @ts-ignore - vaultsData.vaults.forEach((v) => { - const cVaultDecimals = v.underlyingProtocol.underlyingToken.decimals; - const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = - calculateVaultData(v.collateral, v.debt, v.tokenSymbol, v.hardVault, cVaultDecimals); - - let addVault = true; - if (currentStatus === VAULT_STATUS.active || currentStatus === VAULT_STATUS.liquidation) { - addVault = currentStatus === status; - } - // filter ratio - if (currentStatus !== VAULT_STATUS.empty && currentStatus !== VAULT_STATUS.ready) { - addVault = addVault && ratio >= minFilterRatio && ratio <= maxFilterRatio; - } - - if (!showAllVaults) { - addVault = v.tokenSymbol === "WETH" || v.tokenSymbol === "DAI"; - } - if (addVault && v.tokenSymbol !== "WBTC") { - let vaultUrl = ""; - const symbol = v.tokenSymbol === "WETH" ? "ETH" : v.tokenSymbol; - if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { - vaultUrl = window.location.origin.concat("/vault/").concat(symbol); - } - if (currentStatus === VAULT_STATUS.liquidation) { - vLiquidables.push({ - vaultId: v.vaultId, - vaultType: v.tokenSymbol, - decimals: cVaultDecimals, - hardVault: v.hardVault, - }); - } - - vData.push({ - id: v.vaultId, - collateralSymbol: v.tokenSymbol, - collateralValue: collateralText, - collateralUsd: collateralUSD.toFixed(2), - debt: debtText, - debtUsd: debtUSD.toFixed(2), - ratio, - minRatio: minRatio.toString(), - decimals: cVaultDecimals, - isHardVault: v.hardVault, - netReward: 0, - status, - blockTS: v.blockTS, - url: vaultUrl, - }); - - totals.vaults += 1; - totals.collateral = (parseFloat(totals.collateral) + parseFloat(collateralText)).toFixed(4); - totals.collateralUSD = (parseFloat(totals.collateralUSD) + collateralUSD).toFixed(2); - totals.debt = (parseFloat(totals.debt) + parseFloat(debtText)).toFixed(4); - totals.debtUSD = (parseFloat(totals.debtUSD) + debtUSD).toFixed(2); - } - }); - if (currentStatus !== VAULT_STATUS.liquidation) { - setVaultList(vData); - setVaultsTotals(totals); - } else { - const loadNetReward = async () => { - vLiquidables.forEach((l, index) => { - calculateNetRewardUsd(l.vaultId, l.vaultType, l.hardVault, l.decimals).then((result) => { - const newA = [...vData]; - newA[index].netReward = result; - setVaultList(newA); - }); - }); - }; - loadNetReward().then(() => { - setVaultList(vData); - setVaultsTotals(totals); - }); - } - // Set pagination data - confPagination(vData, pagination.itemsPerPage); - setFilteringRatios(false); - }; - - const { loading } = useQuery(vaultsQuery, { - fetchPolicy: "no-cache", - notifyOnNetworkStatusChange: true, - skip: skipQuery, - onError: (error) => { - console.log(error); - }, - onCompleted: (data: any) => { - console.log("--- graph --"); - console.log(data); - if (pricesUpdated && !isUndefined(data)) { - setVaultGraphList(data); - loadVaults(data); - } - }, - }); - - useEffect( - () => { - if (!pricesUpdated) { - loadPrices(); - loadRatios(); - } - // else if (!isUndefined(data)) { - // loadVaults(data); - // } - }, - // eslint-disable-next-line - [signer, currentNetwork.chainId, pricesUpdated] - ); - - const tokensSymbols = (): Array => { - const symbols = [{ key: "all", name: "All" }]; - if (isInLayer1(currentNetwork.chainId)) { - symbols.push({ key: "weth", name: "ETH" }); - symbols.push({ key: "dai", name: "DAI" }); - if (showAllVaults) { - symbols.push({ key: "aave", name: "AAVE" }); - symbols.push({ key: "link", name: "LINK" }); - symbols.push({ key: "usdc", name: "USDC" }); - } - } else if (isOptimism(currentNetwork.chainId)) { - symbols.push({ key: "eth", name: "ETH" }); - symbols.push({ key: "dai", name: "DAI" }); - if (showAllVaults) { - symbols.push({ key: "link", name: "LINK" }); - symbols.push({ key: "uni", name: "UNI" }); - symbols.push({ key: "snx", name: "SNX" }); - } - } else { - symbols.push({ key: "matic", name: "MATIC" }); - symbols.push({ key: "dai", name: "DAI" }); - symbols.push({ key: "wbtc", name: "WBTC" }); - } - - return symbols; - }; - - const handleItemsViewChange = (number: string) => { - setSkipQuery(true); - confPagination(vaultList, parseInt(number)); - }; - - const handleRadioBtnChange = (value: string) => { - setSkipQuery(false); - setRadioValue(value); - if (value === "1") { - setOwnerAddress(""); - } else { - setOwnerAddress(currentAddress); - } - }; - - const handleStatusChange = (newStatus: string) => { - setSkipQuery(false); - setCurrentStatus(newStatus); - }; - - const handleTokenChange = (newToken: string) => { - setSkipQuery(false); - setTokenSymbol(newToken); - }; - - const handleModeChange = (newMode: string) => { - setSkipQuery(false); - setVaultMode(newMode); - }; - - /* const onChangeMinFilterRatio = async (event: React.ChangeEvent) => { - setMinFilterRatio(event.target.value); - }; - - const onChangeMaxFilterRatio = async (event: React.ChangeEvent) => { - setMaxFilterRatio(event.target.value); - }; */ - - const onFilterRatioClick = () => { - if (minRatioInput && maxRatioInput) { - // @ts-ignore - const minRatio = minRatioInput.current.value; - // @ts-ignore - const maxRatio = maxRatioInput.current.value; - if (isValidRatio(minRatio) && isValidRatio(maxRatio)) { - setCurrentMinRatio(minRatio.concat("%")); - setCurrentMaxRatio(maxRatio.concat("%")); - // @ts-ignore - loadVaults(vaultGraphList); - if (ratioRangeDropdown !== null) { - // @ts-ignore - ratioRangeDropdown.current.click(); - } - } - } - }; - - const onPageSelected = (pageNumber: number) => { - const nextPage = pageNumber === pagination.pages ? 0 : pageNumber + 1; - const newPagination = { - ...pagination, - previous: pageNumber === 1 ? 0 : pageNumber - 1, - current: pageNumber, - next: nextPage, - }; - setPagination(newPagination); - }; - - const updateLiquidatedVault = async (index: number, symbol: string) => { - let currentVault = vaults?.wethVault; - if (vaultList[index].isHardVault) { - currentVault = hardVaults?.wethVault; - } - switch (symbol) { - case "DAI": - if (vaultList[index].isHardVault) { - currentVault = hardVaults?.daiVault; - } else { - currentVault = vaults?.daiVault; - } - break; - case "AAVE": - currentVault = vaults?.aaveVault; - break; - case "LINK": - currentVault = vaults?.linkVault; - break; - case "UNI": - currentVault = vaults?.uniVault; - break; - case "SNX": - currentVault = vaults?.snxVault; - break; - case "MATIC": - currentVault = vaults?.maticVault; - break; - case "WBTC": - currentVault = vaults?.wbtcVault; - break; - case "USDC": - currentVault = hardVaults?.usdcVault; - break; - default: - break; - } - const [vaultId, collateral, , debt] = await currentVault?.getVault( - BigNumber.from(vaultList[index].id) - ); - const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = - calculateVaultData( - collateral, - debt, - symbol, - vaultList[index].isHardVault, - vaultList[index].decimals - ); - const allVaults = vaultList; - const v = { - id: vaultId, - collateralSymbol: symbol, - collateralValue: collateralText, - collateralUsd: collateralUSD.toFixed(2), - debt: debtText, - debtUsd: debtUSD.toFixed(2), - ratio, - minRatio: minRatio.toString(), - decimals: vaultList[index].decimals, - isHardVault: vaultList[index].isHardVault, - netReward: 0, - status, - blockTS: vaultList[index].blockTS, - url: vaultList[index].url, - }; - allVaults[index] = Object.create(v); - setVaultList(Array.from(allVaults)); - setRenderTable(!renderTable); - }; - - return ( -
- - - - -
- <>{t("totals")} -
-
- - - -
- <>{t("vaults")} -
- {vaultsTotals.vaults} - - -
- <>{t("collateral")} (USD) -
- - ${numberFormatStr(vaultsTotals.collateralUSD, 2, 2)} - - - -
-
- <>{t("debt")} -
- -
- {numberFormatStr(vaultsTotals.debt, 4, 4)} - - -
- <>{t("debt")} (USD) -
- ${numberFormatStr(vaultsTotals.debtUSD, 2, 2)} - - -
-
- - - -
-
-
- <>{t("view")}: -
- handleItemsViewChange(eventKey || "15")}> - -
- {pagination.itemsPerPage} -
-
- - {viewsList.map((item) => ( - - {item.name} - - ))} - -
-
-
-
-
-
- <>{t("collateral")} -
- handleTokenChange(eventKey || "ALL")} - > - -
- - {tokenSymbol.toUpperCase()} -
-
- - {tokensSymbols().map((item) => ( - - {item.name} - - ))} - -
-
-
-
Status
- handleStatusChange(eventKey || "ALL")}> - -
- {capitalize(currentStatus)} -
-
- - {statusList.map((item) => ( - - {item.name} - - ))} - -
-
- {isInLayer1(currentNetwork.chainId) && ( -
-
- <>{t("mode")} -
- handleModeChange(eventKey || "ALL")} - > - -
- {capitalize(vaultMode)} -
-
- - {modeList.map((item) => ( - - {item.name} - - ))} - -
-
- )} - {currentStatus !== VAULT_STATUS.empty && currentStatus !== VAULT_STATUS.ready && ( -
-
Ratio Range
- - -
- - {currentMinRatio} {currentMaxRatio} - -
-
- -
- - - -
- -
-
-
- )} - {currentAddress !== "" && ( -
- - {radios.map((radio, idx) => ( - handleRadioBtnChange(e.currentTarget.value)} - > - {radio.name} - - ))} - -
- )} -
- - {loading || filteringRatios || !pricesUpdated ? ( - - ) : ( - ) => setVaultList(v)} - currentStatus={currentStatus} - pagination={pagination} - refresh={updateLiquidatedVault} - /> - )} - - {pagination.pages > 0 && !loading && ( - - )} - -
-
-
-
-
- ); -}; diff --git a/src/components/Vault/Monitoring/types.tsx b/src/components/Vault/Monitoring/types.tsx deleted file mode 100644 index e4883a8..0000000 --- a/src/components/Vault/Monitoring/types.tsx +++ /dev/null @@ -1,69 +0,0 @@ -export type PaginationType = { - previous: number; - current: number; - next: number; - pages: number; - lastDataPage: number; - itemsPerPage: number; - itemsCount: number; - lastId: string; -}; - -export type OraclePricesType = { - tcapOraclePrice: string; - wethOraclePrice: string; - daiOraclePrice: string; - aaveOraclePrice: string; - linkOraclePrice: string; - uniOraclePrice: string; - snxOraclePrice: string; - maticOraclePrice: string; - wbtcOraclePrice: string; - usdcOraclePrice: string; -}; - -export type VaultsRatioType = { - ethRatio: number; - wethRatio: number; - daiRatio: number; - aaveRatio: number; - linkRatio: number; - uniRatio: number; - snxRatio: number; - maticRatio: number; - wbtcRatio: number; - hardEthRatio: number; - hardWethRatio: number; - hardDaiRatio: number; - hardUsdcRatio: number; -}; - -export type VaultsType = { - id: string; - collateralSymbol: string; - collateralValue: string; - collateralUsd: string; - debt: string; - debtUsd: string; - ratio: number; - minRatio: string; - decimals: number; - isHardVault: boolean; - netReward: number; - status: string; - blockTS: string; - url: string; -}; - -export type VaultsTotalsType = { - vaults: number; - collateral: string; - collateralUSD: string; - debt: string; - debtUSD: string; -}; - -export type DropdownItemType = { - key: string; - name: string; -}; diff --git a/src/components/Vault/Vault.tsx b/src/components/Vault/Vault.tsx deleted file mode 100644 index 6c83183..0000000 --- a/src/components/Vault/Vault.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import React, { useState, useEffect, useContext } from "react"; -import Button from "react-bootstrap/esm/Button"; -import { useTranslation } from "react-i18next"; -import { signerContext, Web3ModalContext } from "../../state"; -import "../../styles/mint.scss"; - -import Loading from "../Loading"; -import Mint from "./Mint"; - -export const Vault = () => { - const { t } = useTranslation(); - const web3Modal = useContext(Web3ModalContext); - const signer = useContext(signerContext); - - // State - const [isLoading, setIsLoading] = useState(true); - const [address, setAddress] = useState(""); - - useEffect(() => { - async function load() { - if (!signer.signer) { - setIsLoading(false); - } else if (signer.signer) { - const currentAddress = await signer.signer.getAddress(); - setAddress(currentAddress); - setIsLoading(false); - } - } - load(); - // eslint-disable-next-line - }, [signer.signer, address]); - - if (isLoading) { - return ; - } - - return ( -
-
-

- <>{t("vault.title1")} -

- {!signer.signer ? ( -
-
- <>{t("connect")} -
-

- <>{t("vault.no-connected")} -

- -
- ) : ( - - )} -
-
- ); -}; diff --git a/src/components/Vault/index.tsx b/src/components/Vault/index.tsx deleted file mode 100644 index e1cac8e..0000000 --- a/src/components/Vault/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Vault"; - -export * from "./Monitoring/index"; diff --git a/src/components/Vaults/types.tsx b/src/components/Vaults/types.tsx index 5005605..af0d71e 100644 --- a/src/components/Vaults/types.tsx +++ b/src/components/Vaults/types.tsx @@ -10,6 +10,7 @@ export type PaginationType = { }; export type OraclePricesType = { + jpegzOraclePrice: string; tcapOraclePrice: string; wethOraclePrice: string; daiOraclePrice: string; diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 297e37e..b3620bb 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -111,23 +111,41 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const setCollaterals = (newMode: string) => { if (currentAddress !== "") { - let aOptions = ["TCAP"]; + let aOptions = [TOKENS_SYMBOLS.TCAP]; if (isArbitrum(currentNetwork.chainId)) { - aOptions = ["JPEGz"]; + aOptions = [TOKENS_SYMBOLS.JPEGz]; } - let cOptions = ["ETH", "WETH", "DAI", "AAVE", "LINK"]; + let cOptions = [ + TOKENS_SYMBOLS.ETH, + TOKENS_SYMBOLS.WETH, + TOKENS_SYMBOLS.DAI, + TOKENS_SYMBOLS.AAVE, + TOKENS_SYMBOLS.LINK, + ]; if (newMode === "hard") { - cOptions = ["ETH", "WETH", "DAI", "USDC", "WBTC"]; + cOptions = [ + TOKENS_SYMBOLS.ETH, + TOKENS_SYMBOLS.WETH, + TOKENS_SYMBOLS.DAI, + TOKENS_SYMBOLS.USDC, + TOKENS_SYMBOLS.WBTC, + ]; } if (isArbitrum(currentNetwork.chainId)) { - cOptions = ["ETH", "DAI"]; + cOptions = [TOKENS_SYMBOLS.ETH, TOKENS_SYMBOLS.WETH, TOKENS_SYMBOLS.DAI]; } if (isOptimism(currentNetwork.chainId) && !isHardMode()) { - cOptions = ["ETH", "DAI", "LINK", "UNI", "SNX"]; + cOptions = [ + TOKENS_SYMBOLS.ETH, + TOKENS_SYMBOLS.DAI, + TOKENS_SYMBOLS.LINK, + TOKENS_SYMBOLS.UNI, + TOKENS_SYMBOLS.SNX, + ]; } if (isPolygon(currentNetwork.chainId) && !isHardMode()) { - cOptions = ["MATIC", "DAI", "WBTC"]; + cOptions = [TOKENS_SYMBOLS.MATIC, TOKENS_SYMBOLS.DAI, TOKENS_SYMBOLS.WBTC]; } setAssetOptions(aOptions); @@ -138,10 +156,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { async function loadVault() { setIsLoading(true); let balance; - const provider = getDefaultProvider( - currentNetwork.chainId || NETWORKS.mainnet.chainId, - currentNetwork.chainId === 1 ? NETWORKS.mainnet.name : NETWORKS.goerli.name - ); + const provider = getDefaultProvider(currentNetwork.chainId || NETWORKS.mainnet.chainId); let currentVaultData: any; // @ts-ignore @@ -157,7 +172,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { }; } - if (vaultData.collateralSymbol !== "ETH") { + if (vaultData.collateralSymbol !== TOKENS_SYMBOLS.ETH) { // @ts-ignore balance = await currentCollateral.balanceOf(currentAddress); } else { @@ -165,10 +180,10 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { } let decimals = 18; - if (vaultData.collateralSymbol === "WBTC") { + if (vaultData.collateralSymbol === TOKENS_SYMBOLS.WBTC) { decimals = 8; } - if (vaultData.collateralSymbol === "USDC") { + if (vaultData.collateralSymbol === TOKENS_SYMBOLS.USDC) { decimals = 6; } @@ -208,7 +223,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); setAssetBalance(cBalance); - if (!allowance.isZero() || vaultData.collateralSymbol === "ETH") { + if (!allowance.isZero() || vaultData.collateralSymbol === TOKENS_SYMBOLS.ETH) { const safeValue = isHardMode() ? 20 : 50; const warnValue = isHardMode() ? 10 : 30; @@ -542,7 +557,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { try { if (isGasAsset()) { let tx; - if (vaultData.collateralSymbol === "ETH") { + if (vaultData.collateralSymbol === TOKENS_SYMBOLS.ETH) { tx = await currentVault?.addCollateralETH({ value: amount, }); @@ -575,8 +590,8 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const maxAddCollateral = async (e: React.MouseEvent) => { e.preventDefault(); let balance = "0"; - if (vaultData.collateralSymbol === "ETH") { - const provider = getDefaultProvider(currentNetwork.chainId, currentNetwork.name); + if (vaultData.collateralSymbol === TOKENS_SYMBOLS.ETH) { + const provider = getDefaultProvider(currentNetwork.chainId); balance = ethers.utils.formatEther(await provider.getBalance(currentAddress)); } else if (currentCollateral) { const value = BigNumber.from(await currentCollateral.balanceOf(currentAddress)); @@ -602,7 +617,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { try { if (isGasAsset()) { let tx; - if (vaultData.collateralSymbol === "ETH") { + if (vaultData.collateralSymbol === TOKENS_SYMBOLS.ETH) { tx = await currentVault?.removeCollateralETH(amount); } else { tx = await currentVault?.removeCollateralMATIC(amount); @@ -1010,6 +1025,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ); const creatOrApprovee = async () => { + // currentCollateral?.mint(); if (currentVaultId === "0") { setBtnDisabled(true); try { diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index bb87f46..b057d60 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -79609,7 +79609,7 @@ "chainId": "42161", "contracts": { "DAI": { - "address": "0x17aC26AB292660126d2baF16e5304DcbEc54340C", + "address": "0x7E574b5F8B61B71A6A1DA6127A9383F656d1a800", "abi": [ { "inputs": [], @@ -81509,8 +81509,8 @@ } ] }, - "TCAP": { - "address": "0x35B33115D3bf7DCE5380B9728e778393F00C3666", + "JPEGZ": { + "address": "0xB091FCDE940d3303f7174C41e184AEDe3dd7AdBf", "abi": [ { "inputs": [ @@ -82090,8 +82090,8 @@ } ] }, - "TCAPOracle": { - "address": "0xEf0809527ce67fB95aAdbfcfB2e1345313389a6c", + "JPEGZOracle": { + "address": "0xB67AD4cd26B33Ec60EbA6718626FF76a41CC676F", "abi": [ { "inputs": [ @@ -82331,28 +82331,54 @@ } ] }, - "WETH": { - "address": "0x85f85C12FADEec638c63850117203f098386e6b9", + "TCAP": { + "address": "0x35B33115D3bf7DCE5380B9728e778393F00C3666", "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + }, + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", - "name": "src", + "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "guy", + "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "wad", + "name": "value", "type": "uint256" } ], @@ -82365,17 +82391,17 @@ { "indexed": true, "internalType": "address", - "name": "dst", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "wad", + "name": "_amount", "type": "uint256" } ], - "name": "Deposit", + "name": "NewCap", "type": "event" }, { @@ -82384,19 +82410,57 @@ { "indexed": true, "internalType": "address", - "name": "src", + "name": "_owner", "type": "address" }, + { + "indexed": false, + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "NewCapEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { "indexed": true, "internalType": "address", - "name": "dst", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "wad", + "name": "value", "type": "uint256" } ], @@ -82409,29 +82473,61 @@ { "indexed": true, "internalType": "address", - "name": "src", + "name": "_owner", "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "_tokenHandler", + "type": "address" } ], - "name": "Withdrawal", + "name": "VaultHandlerAdded", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "_owner", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "", + "name": "_tokenHandler", + "type": "address" + } + ], + "name": "VaultHandlerRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vaultHandler", + "type": "address" + } + ], + "name": "addVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", "type": "address" } ], @@ -82450,12 +82546,12 @@ "inputs": [ { "internalType": "address", - "name": "guy", + "name": "spender", "type": "address" }, { "internalType": "uint256", - "name": "wad", + "name": "amount", "type": "uint256" } ], @@ -82474,7 +82570,7 @@ "inputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], @@ -82490,33 +82586,31 @@ "type": "function" }, { - "inputs": [], - "name": "decimals", - "outputs": [ + "inputs": [ { - "internalType": "uint8", - "name": "", - "type": "uint8" + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "deposit", + "name": "burn", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "name", + "name": "cap", "outputs": [ { - "internalType": "string", + "internalType": "uint256", "name": "", - "type": "string" + "type": "uint256" } ], "stateMutability": "view", @@ -82524,12 +82618,12 @@ }, { "inputs": [], - "name": "symbol", + "name": "capEnabled", "outputs": [ { - "internalType": "string", + "internalType": "bool", "name": "", - "type": "string" + "type": "bool" } ], "stateMutability": "view", @@ -82537,12 +82631,12 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "decimals", "outputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "", - "type": "uint256" + "type": "uint8" } ], "stateMutability": "view", @@ -82552,16 +82646,16 @@ "inputs": [ { "internalType": "address", - "name": "dst", + "name": "spender", "type": "address" }, { "internalType": "uint256", - "name": "wad", + "name": "subtractedValue", "type": "uint256" } ], - "name": "transfer", + "name": "decreaseAllowance", "outputs": [ { "internalType": "bool", @@ -82575,22 +82669,30 @@ { "inputs": [ { - "internalType": "address", - "name": "src", - "type": "address" - }, + "internalType": "bool", + "name": "_enable", + "type": "bool" + } + ], + "name": "enableCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", - "name": "dst", + "name": "spender", "type": "address" }, { "internalType": "uint256", - "name": "wad", + "name": "addedValue", "type": "uint256" } ], - "name": "transferFrom", + "name": "increaseAllowance", "outputs": [ { "internalType": "bool", @@ -82603,37 +82705,231 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, { "internalType": "uint256", - "name": "wad", + "name": "_amount", "type": "uint256" } ], - "name": "withdraw", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" - } - ] - }, - "WETHOracle": { - "address": "0x7E398fD108f81D7074c8512bd307270F936b19d3", - "abi": [ + }, { - "inputs": [ + "inputs": [], + "name": "name", + "outputs": [ { - "internalType": "address", - "name": "_aggregator", - "type": "address" - }, + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ { "internalType": "address", - "name": "_owner", + "name": "", "type": "address" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vaultHandler", + "type": "address" + } + ], + "name": "removeVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + } + ], + "name": "setCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "vaultHandlers", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "TCAPOracle": { + "address": "0xEf0809527ce67fB95aAdbfcfB2e1345313389a6c", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, @@ -82857,74 +83153,33 @@ } ] }, - "WETHVaultHandler": { - "address": "0x94BD0Ea4f4497F877aFeeDb7b1242b286f94D621", + "WETH": { + "address": "0x85f85C12FADEec638c63850117203f098386e6b9", "abi": [ { + "anonymous": false, "inputs": [ { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_divisor", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { + "indexed": true, "internalType": "address", - "name": "_ethOracle", + "name": "src", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "_treasury", + "name": "guy", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_minimumTCAP", + "name": "wad", "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "Approval", + "type": "event" }, { "anonymous": false, @@ -82932,23 +83187,17 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "dst", "type": "address" }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "wad", "type": "uint256" } ], - "name": "CollateralAdded", + "name": "Deposit", "type": "event" }, { @@ -82957,23 +83206,23 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "src", "type": "address" }, { "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "address", + "name": "dst", + "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "wad", "type": "uint256" } ], - "name": "CollateralRemoved", + "name": "Transfer", "type": "event" }, { @@ -82982,367 +83231,382 @@ { "indexed": true, "internalType": "address", - "name": "_owner", + "name": "src", "type": "address" }, { "indexed": false, - "internalType": "enum IVaultHandler.FunctionChoices", - "name": "_function", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "bool", - "name": "_isDisabled", - "type": "bool" + "internalType": "uint256", + "name": "wad", + "type": "uint256" } ], - "name": "FunctionToggled", + "name": "Withdrawal", "type": "event" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "", "type": "address" }, { - "indexed": false, + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" } ], - "name": "NewBurnFee", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "guy", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "wad", "type": "uint256" } ], - "name": "NewLiquidationPenalty", - "type": "event" + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "", "type": "address" - }, + } + ], + "name": "balanceOf", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_minimumTCAP", + "name": "", "type": "uint256" } ], - "name": "NewMinimumTCAP", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "decimals", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_ratio", + "name": "", "type": "uint256" } ], - "name": "NewRatio", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "dst", "type": "address" }, { - "indexed": false, - "internalType": "address", - "name": "_tresury", - "type": "address" + "internalType": "uint256", + "name": "wad", + "type": "uint256" } ], - "name": "NewTreasury", - "type": "event" + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "previousOwner", + "name": "src", "type": "address" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "dst", "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "wad", + "type": "uint256" } ], - "name": "Paused", - "type": "event" - }, + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "WETHOracle": { + "address": "0x7E398fD108f81D7074c8512bd307270F936b19d3", + "abi": [ { - "anonymous": false, "inputs": [ { - "indexed": false, "internalType": "address", - "name": "_token", + "name": "_aggregator", "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "_owner", + "type": "address" } ], - "name": "Recovered", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" + "internalType": "address", + "name": "previousOwner", + "type": "address" }, { "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "RoleAdminChanged", + "name": "OwnershipTransferred", "type": "event" }, { - "anonymous": false, - "inputs": [ + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "int256", + "name": "", + "type": "int256" } ], - "name": "RoleGranted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "inputs": [], + "name": "getLatestRound", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint80", + "name": "", + "type": "uint80" }, { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "int256", + "name": "", + "type": "int256" }, { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "", "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "TokensBurned", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "TokensMinted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "Unpaused", - "type": "event" + "name": "getPreviousAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", + "outputs": [ { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "", "type": "uint256" } ], - "name": "VaultCreated", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" }, { - "indexed": true, - "internalType": "address", - "name": "_liquidator", - "type": "address" + "internalType": "int256", + "name": "", + "type": "int256" }, { - "indexed": false, "internalType": "uint256", - "name": "_liquidationCollateral", + "name": "", "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "_reward", + "name": "", "type": "uint256" - } - ], - "name": "VaultLiquidated", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ + }, { - "internalType": "bytes32", + "internalType": "uint80", "name": "", - "type": "bytes32" + "type": "uint80" } ], "stateMutability": "view", @@ -83350,10 +83614,10 @@ }, { "inputs": [], - "name": "ETHPriceOracle", + "name": "owner", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "address", "name": "", "type": "address" } @@ -83363,89 +83627,1022 @@ }, { "inputs": [], - "name": "MAX_DECIMAL_PLACES", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_FEE", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "MIN_RATIO", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_aggregator", + "type": "address" } ], - "stateMutability": "view", + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "TCAPPrice", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "price", - "type": "uint256" + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TCAPToken", + "name": "supportsInterface", "outputs": [ { - "internalType": "contract TCAP", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "addCollateral", + "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" + } + ] + }, + "WETHVaultHandler": { + "address": "0x94BD0Ea4f4497F877aFeeDb7b1242b286f94D621", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "_function", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bool", + "name": "_isDisabled", + "type": "bool" + } + ], + "name": "FunctionToggled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + } + ], + "name": "NewBurnFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + } + ], + "name": "NewLiquidationPenalty", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "NewMinimumTCAP", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + } + ], + "name": "NewRatio", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_tresury", + "type": "address" + } + ], + "name": "NewTreasury", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "VaultCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_liquidator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "VaultLiquidated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETHPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DECIMAL_PLACES", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TCAPToken", + "outputs": [ + { + "internalType": "contract TCAP", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "addCollateralETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "burnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralContract", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralPriceOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counter", + "outputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "createVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "divisor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "_oracle", + "type": "address" + } + ], + "name": "getOraclePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "currentRatio", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" }, { - "inputs": [], - "name": "addCollateralETH", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "", + "type": "uint8" + } + ], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTCAP", + "type": "uint256" + } + ], + "name": "liquidateVault", "outputs": [], "stateMutability": "payable", "type": "function" }, + { + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ + { + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumTCAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -83454,14 +84651,14 @@ "type": "uint256" } ], - "name": "burn", + "name": "mint", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "burnFee", + "name": "oracleDigits", "outputs": [ { "internalType": "uint256", @@ -83474,10 +84671,10 @@ }, { "inputs": [], - "name": "collateralContract", + "name": "owner", "outputs": [ { - "internalType": "contract IERC20", + "internalType": "address", "name": "", "type": "address" } @@ -83487,11 +84684,138 @@ }, { "inputs": [], - "name": "collateralDecimalsAdjustmentFactor", + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ratio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "removeCollateralETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "collateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "requiredLiquidationTCAP", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], @@ -83499,103 +84823,115 @@ "type": "function" }, { - "inputs": [], - "name": "collateralPriceOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", "type": "address" } ], - "stateMutability": "view", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "counter", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "_value", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "createVault", + "name": "setBurnFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "divisor", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_liquidationPenalty", "type": "uint256" } ], - "stateMutability": "view", + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "_amount", + "name": "_minimumTCAP", "type": "uint256" } ], - "name": "getFee", - "outputs": [ + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "fee", + "name": "_ratio", "type": "uint256" } ], - "stateMutability": "view", + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "internalType": "address", + "name": "_treasury", "type": "address" } ], - "name": "getOraclePrice", - "outputs": [ - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" } ], - "name": "getRoleAdmin", + "name": "supportsInterface", "outputs": [ { - "internalType": "bytes32", + "internalType": "bool", "name": "", - "type": "bytes32" + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "tcapOracle", + "outputs": [ + { + "internalType": "contract ChainlinkOracle", + "name": "", + "type": "address" } ], "stateMutability": "view", @@ -83604,17 +84940,37 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "_function", + "type": "uint8" }, { - "internalType": "uint256", - "name": "index", - "type": "uint256" + "internalType": "bool", + "name": "_isDisabled", + "type": "bool" } ], - "name": "getRoleMember", + "name": "toggleFunction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", "outputs": [ { "internalType": "address", @@ -83625,15 +84981,22 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "getRoleMemberCount", + "name": "userToVault", "outputs": [ { "internalType": "uint256", @@ -83648,87 +85011,146 @@ "inputs": [ { "internalType": "uint256", - "name": "_id", + "name": "", "type": "uint256" } ], - "name": "getVault", + "name": "vaults", "outputs": [ { "internalType": "uint256", - "name": "", + "name": "Id", "type": "uint256" }, { "internalType": "uint256", - "name": "", + "name": "Collateral", "type": "uint256" }, - { - "internalType": "address", - "name": "", - "type": "address" - }, { "internalType": "uint256", - "name": "", + "name": "Debt", "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], "stateMutability": "view", "type": "function" }, { + "stateMutability": "payable", + "type": "receive" + } + ] + } + } + } + }, + "421613": { + "arbitrum_goerli": { + "name": "arbitrum-goerli", + "chainId": "421613", + "contracts": { + "DAI": { + "address": "0x7E574b5F8B61B71A6A1DA6127A9383F656d1a800", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", - "name": "_vaultId", + "name": "value", "type": "uint256" } ], - "name": "getVaultRatio", - "outputs": [ + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "currentRatio", + "name": "value", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Transfer", + "type": "event" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "owner", + "type": "address" }, { "internalType": "address", - "name": "account", + "name": "spender", "type": "address" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "spender", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" } ], - "name": "hasRole", + "name": "approve", "outputs": [ { "internalType": "bool", @@ -83736,23 +85158,23 @@ "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "enum IVaultHandler.FunctionChoices", - "name": "", - "type": "uint8" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "isDisabled", + "name": "balanceOf", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", @@ -83761,29 +85183,29 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "_account", + "type": "address" }, { "internalType": "uint256", - "name": "_maxTCAP", + "name": "_amount", "type": "uint256" } ], - "name": "liquidateVault", + "name": "burn", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "liquidationPenalty", + "name": "decimals", "outputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "", - "type": "uint256" + "type": "uint8" } ], "stateMutability": "view", @@ -83791,38 +85213,59 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "_vaultId", + "name": "subtractedValue", "type": "uint256" } ], - "name": "liquidationReward", + "name": "decreaseAllowance", "outputs": [ { - "internalType": "uint256", - "name": "rewardCollateral", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "minimumTCAP", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "addedValue", "type": "uint256" } ], - "stateMutability": "view", + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, { "internalType": "uint256", "name": "_amount", @@ -83836,12 +85279,12 @@ }, { "inputs": [], - "name": "oracleDigits", + "name": "name", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], "stateMutability": "view", @@ -83849,12 +85292,12 @@ }, { "inputs": [], - "name": "owner", + "name": "symbol", "outputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" } ], "stateMutability": "view", @@ -83862,120 +85305,183 @@ }, { "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", + "name": "totalSupply", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "ratio", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", "type": "address" }, { "internalType": "uint256", - "name": "_tokenAmount", + "name": "amount", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "DAIOracle": { + "address": "0x435D960a2Dcfb04f9099F13A6B5d09AD8849AD6A", + "abi": [ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" } ], - "name": "removeCollateral", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "removeCollateralETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getLatestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getLatestRound", + "outputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "uint80", + "name": "", + "type": "uint80" }, { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "requiredCollateral", + "name": "getPreviousAnswer", "outputs": [ { - "internalType": "uint256", - "name": "collateral", - "type": "uint256" + "internalType": "int256", + "name": "", + "type": "int256" } ], "stateMutability": "view", @@ -83984,16 +85490,16 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "requiredLiquidationTCAP", + "name": "getPreviousTimestamp", "outputs": [ { "internalType": "uint256", - "name": "amount", + "name": "", "type": "uint256" } ], @@ -84003,69 +85509,58 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "getRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" - } - ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + }, { "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "owner", + "outputs": [ { - "internalType": "uint256", - "name": "_minimumTCAP", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "setMinimumTCAP", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - } - ], - "name": "setRatio", + "inputs": [], + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -84074,11 +85569,11 @@ "inputs": [ { "internalType": "address", - "name": "_treasury", + "name": "_aggregator", "type": "address" } ], - "name": "setTreasury", + "name": "setReferenceContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -84087,7 +85582,7 @@ "inputs": [ { "internalType": "bytes4", - "name": "_interfaceId", + "name": "interfaceId", "type": "bytes4" } ], @@ -84103,143 +85598,201 @@ "type": "function" }, { - "inputs": [], - "name": "tcapOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", + "internalType": "address", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" - }, + } + ] + }, + "DAIVaultHandler": { + "address": "0xCEcB53DDa8C14796966a3797351E62cC72a98beE", + "abi": [ { "inputs": [ { - "internalType": "enum IVaultHandler.FunctionChoices", - "name": "_function", - "type": "uint8" + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" }, { - "internalType": "bool", - "name": "_isDisabled", - "type": "bool" + "internalType": "uint256", + "name": "_divisor", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_ratio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tcapOracle", + "type": "address" + }, + { + "internalType": "contract TCAP", + "name": "_tcapAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_collateralOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_ethOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" } ], - "name": "toggleFunction", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "_owner", "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "CollateralAdded", + "type": "event" }, { - "inputs": [], - "name": "treasury", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "_owner", "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "CollateralRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "_function", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bool", + "name": "_isDisabled", + "type": "bool" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "FunctionToggled", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "_owner", "type": "address" - } - ], - "name": "userToVault", - "outputs": [ + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "_burnFee", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "NewBurnFee", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "vaults", - "outputs": [ - { - "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "Debt", + "name": "_liquidationPenalty", "type": "uint256" - }, - { - "internalType": "address", - "name": "Owner", - "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ] - } - } - } - }, - "421613": { - "arbitrum_goerli": { - "name": "arbitrum-goerli", - "chainId": "421613", - "contracts": { - "DAI": { - "address": "0x17aC26AB292660126d2baF16e5304DcbEc54340C", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" + "name": "NewLiquidationPenalty", + "type": "event" }, { "anonymous": false, @@ -84247,23 +85800,36 @@ { "indexed": true, "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minimumTCAP", + "type": "uint256" + } + ], + "name": "NewMinimumTCAP", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "value", + "name": "_ratio", "type": "uint256" } ], - "name": "Approval", + "name": "NewRatio", "type": "event" }, { @@ -84272,197 +85838,266 @@ { "indexed": true, "internalType": "address", - "name": "from", + "name": "_owner", "type": "address" }, { - "indexed": true, + "indexed": false, "internalType": "address", - "name": "to", + "name": "_tresury", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" } ], - "name": "Transfer", + "name": "NewTreasury", "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "owner", + "name": "previousOwner", "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "newOwner", "type": "address" } ], - "name": "allowance", - "outputs": [ + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "Paused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": false, "internalType": "address", - "name": "spender", + "name": "_token", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "_amount", "type": "uint256" } ], - "name": "approve", - "outputs": [ + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleAdminChanged", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", "name": "account", "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "account", "type": "address" }, { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { - "inputs": [], - "name": "decimals", - "outputs": [ + "anonymous": false, + "inputs": [ { - "internalType": "uint8", - "name": "", - "type": "uint8" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "TokensBurned", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "subtractedValue", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", "type": "uint256" } ], - "name": "decreaseAllowance", - "outputs": [ + "name": "TokensMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "nonpayable", - "type": "function" + "name": "Unpaused", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "spender", + "name": "_owner", "type": "address" }, { + "indexed": true, "internalType": "uint256", - "name": "addedValue", + "name": "_id", "type": "uint256" } ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" + "name": "VaultCreated", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + }, + { + "indexed": true, "internalType": "address", - "name": "_account", + "name": "_liquidator", "type": "address" }, { + "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_liquidationCollateral", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", "type": "uint256" } ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "VaultLiquidated", + "type": "event" }, { "inputs": [], - "name": "name", + "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { - "internalType": "string", + "internalType": "bytes32", "name": "", - "type": "string" + "type": "bytes32" } ], "stateMutability": "view", @@ -84470,12 +86105,12 @@ }, { "inputs": [], - "name": "symbol", + "name": "ETHPriceOracle", "outputs": [ { - "internalType": "string", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "string" + "type": "address" } ], "stateMutability": "view", @@ -84483,159 +86118,98 @@ }, { "inputs": [], - "name": "totalSupply", + "name": "MAX_DECIMAL_PLACES", "outputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "", - "type": "uint256" + "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", + "inputs": [], + "name": "MAX_FEE", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", + "inputs": [], + "name": "MIN_RATIO", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" - } - ] - }, - "DAIOracle": { - "address": "0x435D960a2Dcfb04f9099F13A6B5d09AD8849AD6A", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_aggregator", - "type": "address" - }, - { - "internalType": "address", - "name": "_owner", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "inputs": [], + "name": "TCAPPrice", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint256", + "name": "price", + "type": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "stateMutability": "view", + "type": "function" }, { "inputs": [], - "name": "getLatestAnswer", + "name": "TCAPToken", "outputs": [ { - "internalType": "int256", + "internalType": "contract TCAP", "name": "", - "type": "int256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "getLatestRound", - "outputs": [ - { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, + } + ], + "name": "addCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_amount", "type": "uint256" - }, - { - "internalType": "uint80", - "name": "", - "type": "uint80" } ], - "stateMutability": "view", + "name": "burn", + "outputs": [], + "stateMutability": "payable", "type": "function" }, { "inputs": [], - "name": "getLatestTimestamp", + "name": "burnFee", "outputs": [ { "internalType": "uint256", @@ -84647,33 +86221,21 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousAnswer", + "inputs": [], + "name": "collateralContract", "outputs": [ { - "internalType": "int256", + "internalType": "contract IERC20", "name": "", - "type": "int256" + "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getPreviousTimestamp", + "inputs": [], + "name": "collateralDecimalsAdjustmentFactor", "outputs": [ { "internalType": "uint256", @@ -84685,39 +86247,13 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint80", - "name": "_id", - "type": "uint80" - } - ], - "name": "getRound", + "inputs": [], + "name": "collateralPriceOracle", "outputs": [ { - "internalType": "uint80", - "name": "", - "type": "uint80" - }, - { - "internalType": "int256", - "name": "", - "type": "int256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint80", + "internalType": "contract ChainlinkOracle", "name": "", - "type": "uint80" + "type": "address" } ], "stateMutability": "view", @@ -84725,12 +86261,12 @@ }, { "inputs": [], - "name": "owner", + "name": "counter", "outputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_value", + "type": "uint256" } ], "stateMutability": "view", @@ -84738,620 +86274,575 @@ }, { "inputs": [], - "name": "renounceOwnership", + "name": "createVault", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "divisor", + "outputs": [ { - "internalType": "address", - "name": "_aggregator", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "setReferenceContract", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "supportsInterface", + "name": "getFee", "outputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "uint256", + "name": "fee", + "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "newOwner", + "internalType": "contract ChainlinkOracle", + "name": "_oracle", "type": "address" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ] - }, - "DAIVaultHandler": { - "address": "0xCEcB53DDa8C14796966a3797351E62cC72a98beE", - "abi": [ - { - "inputs": [ - { - "internalType": "contract Orchestrator", - "name": "_orchestrator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_divisor", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_ratio", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_tcapOracle", - "type": "address" - }, - { - "internalType": "contract TCAP", - "name": "_tcapAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_collateralOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_ethOracle", - "type": "address" - }, - { - "internalType": "address", - "name": "_treasury", - "type": "address" - }, + "name": "getOraclePrice", + "outputs": [ { "internalType": "uint256", - "name": "_minimumTCAP", + "name": "price", "type": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "CollateralAdded", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "index", "type": "uint256" } ], - "name": "CollateralRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "getRoleMember", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "", "type": "address" - }, - { - "indexed": false, - "internalType": "enum IVaultHandler.FunctionChoices", - "name": "_function", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "bool", - "name": "_isDisabled", - "type": "bool" } ], - "name": "FunctionToggled", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_burnFee", + "name": "", "type": "uint256" } ], - "name": "NewBurnFee", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "_liquidationPenalty", + "name": "", "type": "uint256" - } - ], - "name": "NewLiquidationPenalty", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "", "type": "address" }, { - "indexed": false, "internalType": "uint256", - "name": "_minimumTCAP", + "name": "", "type": "uint256" } ], - "name": "NewMinimumTCAP", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "getVaultRatio", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_ratio", + "name": "currentRatio", "type": "uint256" } ], - "name": "NewRatio", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": false, "internalType": "address", - "name": "_tresury", + "name": "account", "type": "address" } ], - "name": "NewTreasury", - "type": "event" + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": true, "internalType": "address", - "name": "newOwner", + "name": "account", "type": "address" } ], - "name": "OwnershipTransferred", - "type": "event" + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "", + "type": "uint8" } ], - "name": "Paused", - "type": "event" + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "_token", - "type": "address" + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" }, { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "_maxTCAP", "type": "uint256" } ], - "name": "Recovered", - "type": "event" + "name": "liquidateVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, + "inputs": [], + "name": "liquidationPenalty", + "outputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "RoleAdminChanged", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "internalType": "uint256", + "name": "_vaultId", + "type": "uint256" + } + ], + "name": "liquidationReward", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, + "internalType": "uint256", + "name": "rewardCollateral", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumTCAP", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "RoleGranted", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDigits", + "outputs": [ { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ { - "indexed": true, "internalType": "address", - "name": "sender", + "name": "", "type": "address" } ], - "name": "RoleRevoked", - "type": "event" + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, + "inputs": [], + "name": "ratio", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "", "type": "uint256" } ], - "name": "TokensBurned", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "address", - "name": "_owner", + "name": "_tokenAddress", "type": "address" }, { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "_tokenAmount", "type": "uint256" - }, + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "TokensMinted", - "type": "event" + "name": "removeCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": false, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { "internalType": "address", "name": "account", "type": "address" } ], - "name": "Unpaused", - "type": "event" + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "requiredCollateral", + "outputs": [ { - "indexed": true, "internalType": "uint256", - "name": "_id", + "name": "collateral", "type": "uint256" } ], - "name": "VaultCreated", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "anonymous": false, "inputs": [ { - "indexed": true, "internalType": "uint256", "name": "_vaultId", "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "_liquidator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_liquidationCollateral", - "type": "uint256" - }, + } + ], + "name": "requiredLiquidationTCAP", + "outputs": [ { - "indexed": false, "internalType": "uint256", - "name": "_reward", + "name": "amount", "type": "uint256" } ], - "name": "VaultLiquidated", - "type": "event" + "stateMutability": "view", + "type": "function" }, { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ + "inputs": [ { "internalType": "bytes32", - "name": "", + "name": "role", "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "ETHPriceOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "", - "type": "address" + "internalType": "uint256", + "name": "_burnFee", + "type": "uint256" } ], - "stateMutability": "view", + "name": "setBurnFee", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "MAX_DECIMAL_PLACES", - "outputs": [ + "inputs": [ { - "internalType": "uint8", - "name": "", - "type": "uint8" + "internalType": "uint256", + "name": "_liquidationPenalty", + "type": "uint256" } ], - "stateMutability": "view", + "name": "setLiquidationPenalty", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "MAX_FEE", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_minimumTCAP", "type": "uint256" } ], - "stateMutability": "view", + "name": "setMinimumTCAP", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "MIN_RATIO", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "_ratio", "type": "uint256" } ], - "stateMutability": "view", + "name": "setRatio", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "TCAPPrice", + "inputs": [ + { + "internalType": "address", + "name": "_treasury", + "type": "address" + } + ], + "name": "setTreasury", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { - "internalType": "uint256", - "name": "price", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { "inputs": [], - "name": "TCAPToken", + "name": "tcapOracle", "outputs": [ { - "internalType": "contract TCAP", + "internalType": "contract ChainlinkOracle", "name": "", "type": "address" } @@ -85362,12 +86853,17 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "enum IVaultHandler.FunctionChoices", + "name": "_function", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "_isDisabled", + "type": "bool" } ], - "name": "addCollateral", + "name": "toggleFunction", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -85375,24 +86871,24 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "burn", + "name": "transferOwnership", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "burnFee", + "name": "treasury", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -85400,20 +86896,20 @@ }, { "inputs": [], - "name": "collateralContract", - "outputs": [ + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "contract IERC20", + "internalType": "address", "name": "", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "collateralDecimalsAdjustmentFactor", + "name": "userToVault", "outputs": [ { "internalType": "uint256", @@ -85425,141 +86921,242 @@ "type": "function" }, { - "inputs": [], - "name": "collateralPriceOracle", - "outputs": [ + "inputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "counter", + "name": "vaults", "outputs": [ { "internalType": "uint256", - "name": "_value", + "name": "Id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Collateral", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Debt", "type": "uint256" + }, + { + "internalType": "address", + "name": "Owner", + "type": "address" } ], "stateMutability": "view", "type": "function" - }, + } + ] + }, + "JPEGZ": { + "address": "0xB091FCDE940d3303f7174C41e184AEDe3dd7AdBf", + "abi": [ { - "inputs": [], - "name": "createVault", - "outputs": [], + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + }, + { + "internalType": "contract Orchestrator", + "name": "_orchestrator", + "type": "address" + } + ], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { - "inputs": [], - "name": "divisor", - "outputs": [ + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "", + "name": "value", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Approval", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256" } ], - "name": "getFee", - "outputs": [ + "name": "NewCap", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "internalType": "uint256", - "name": "fee", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "_enable", + "type": "bool" } ], - "stateMutability": "view", - "type": "function" + "name": "NewCapEnabled", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "contract ChainlinkOracle", - "name": "_oracle", + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", "type": "address" } ], - "name": "getOraclePrice", - "outputs": [ + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, { + "indexed": false, "internalType": "uint256", - "name": "price", + "name": "value", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" + "name": "Transfer", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "_tokenHandler", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "VaultHandlerAdded", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" }, { - "internalType": "uint256", - "name": "index", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "_tokenHandler", + "type": "address" } ], - "name": "getRoleMember", - "outputs": [ + "name": "VaultHandlerRemoved", + "type": "event" + }, + { + "inputs": [ { "internalType": "address", - "name": "", + "name": "_vaultHandler", "type": "address" } ], - "stateMutability": "view", + "name": "addVaultHandler", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" } ], - "name": "getRoleMemberCount", + "name": "allowance", "outputs": [ { "internalType": "uint256", @@ -85572,51 +87169,41 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "_id", + "name": "amount", "type": "uint256" } ], - "name": "getVault", + "name": "approve", "outputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "getVaultRatio", + "name": "balanceOf", "outputs": [ { "internalType": "uint256", - "name": "currentRatio", + "name": "", "type": "uint256" } ], @@ -85625,36 +87212,38 @@ }, { "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { "internalType": "address", - "name": "account", + "name": "_account", "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" } ], - "name": "grantRole", + "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "inputs": [], + "name": "cap", + "outputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "hasRole", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "capEnabled", "outputs": [ { "internalType": "bool", @@ -85666,19 +87255,13 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "enum IVaultHandler.FunctionChoices", - "name": "", - "type": "uint8" - } - ], - "name": "isDisabled", + "inputs": [], + "name": "decimals", "outputs": [ { - "internalType": "bool", + "internalType": "uint8", "name": "", - "type": "bool" + "type": "uint8" } ], "stateMutability": "view", @@ -85687,68 +87270,71 @@ { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "spender", + "type": "address" }, { "internalType": "uint256", - "name": "_maxTCAP", + "name": "subtractedValue", "type": "uint256" } ], - "name": "liquidateVault", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "liquidationPenalty", + "name": "decreaseAllowance", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "bool", + "name": "_enable", + "type": "bool" } ], - "name": "liquidationReward", - "outputs": [ + "name": "enableCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, { "internalType": "uint256", - "name": "rewardCollateral", + "name": "addedValue", "type": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "minimumTCAP", + "name": "increaseAllowance", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, { "internalType": "uint256", "name": "_amount", @@ -85762,12 +87348,12 @@ }, { "inputs": [], - "name": "oracleDigits", + "name": "name", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], "stateMutability": "view", @@ -85787,15 +87373,47 @@ "type": "function" }, { - "inputs": [], - "name": "pause", + "inputs": [ + { + "internalType": "address", + "name": "_vaultHandler", + "type": "address" + } + ], + "name": "removeVaultHandler", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "paused", + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_cap", + "type": "uint256" + } + ], + "name": "setCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { "internalType": "bool", @@ -85803,12 +87421,25 @@ "type": "bool" } ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "ratio", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -85823,206 +87454,219 @@ "inputs": [ { "internalType": "address", - "name": "_tokenAddress", + "name": "recipient", "type": "address" }, { "internalType": "uint256", - "name": "_tokenAmount", + "name": "amount", "type": "uint256" } ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "transfer", + "outputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "removeCollateral", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "sender", + "type": "address" }, { "internalType": "address", - "name": "account", + "name": "recipient", "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "renounceRole", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "requiredCollateral", - "outputs": [ - { - "internalType": "uint256", - "name": "collateral", - "type": "uint256" + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" + "internalType": "address", + "name": "", + "type": "address" } ], - "name": "requiredLiquidationTCAP", + "name": "vaultHandlers", "outputs": [ { - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], "stateMutability": "view", "type": "function" - }, + } + ] + }, + "JPEGZOracle": { + "address": "0xB67AD4cd26B33Ec60EbA6718626FF76a41CC676F", + "abi": [ { "inputs": [ { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" + "internalType": "address", + "name": "_aggregator", + "type": "address" }, { "internalType": "address", - "name": "account", + "name": "_owner", "type": "address" } ], - "name": "revokeRole", - "outputs": [], "stateMutability": "nonpayable", - "type": "function" + "type": "constructor" }, { + "anonymous": false, "inputs": [ { - "internalType": "uint256", - "name": "_burnFee", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" } ], - "name": "setBurnFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "OwnershipTransferred", + "type": "event" }, { - "inputs": [ + "inputs": [], + "name": "getLatestAnswer", + "outputs": [ { - "internalType": "uint256", - "name": "_liquidationPenalty", - "type": "uint256" + "internalType": "int256", + "name": "", + "type": "int256" } ], - "name": "setLiquidationPenalty", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getLatestRound", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, { "internalType": "uint256", - "name": "_minimumTCAP", + "name": "", "type": "uint256" - } - ], - "name": "setMinimumTCAP", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + }, { "internalType": "uint256", - "name": "_ratio", + "name": "", "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "setRatio", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ { - "internalType": "address", - "name": "_treasury", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "setTreasury", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "supportsInterface", + "name": "getPreviousAnswer", "outputs": [ { - "internalType": "bool", + "internalType": "int256", "name": "", - "type": "bool" + "type": "int256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "tcapOracle", + "inputs": [ + { + "internalType": "uint80", + "name": "_id", + "type": "uint80" + } + ], + "name": "getPreviousTimestamp", "outputs": [ { - "internalType": "contract ChainlinkOracle", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -86031,37 +87675,45 @@ { "inputs": [ { - "internalType": "enum IVaultHandler.FunctionChoices", - "name": "_function", - "type": "uint8" - }, - { - "internalType": "bool", - "name": "_isDisabled", - "type": "bool" + "internalType": "uint80", + "name": "_id", + "type": "uint80" } ], - "name": "toggleFunction", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "getRound", + "outputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "treasury", + "name": "owner", "outputs": [ { "internalType": "address", @@ -86074,7 +87726,7 @@ }, { "inputs": [], - "name": "unpause", + "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -86083,59 +87735,51 @@ "inputs": [ { "internalType": "address", - "name": "", + "name": "_aggregator", "type": "address" } ], - "name": "userToVault", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", + "name": "setReferenceContract", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" } ], - "name": "vaults", + "name": "supportsInterface", "outputs": [ { - "internalType": "uint256", - "name": "Id", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Collateral", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "Debt", - "type": "uint256" - }, + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", - "name": "Owner", + "name": "newOwner", "type": "address" } ], - "stateMutability": "view", + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" } ] }, "TCAP": { - "address": "0x35B33115D3bf7DCE5380B9728e778393F00C3666", + "address": "0xe2a460850caE5ee351608182B8534aA48545b590", "abi": [ { "inputs": [ @@ -86716,7 +88360,7 @@ ] }, "TCAPOracle": { - "address": "0xEf0809527ce67fB95aAdbfcfB2e1345313389a6c", + "address": "0x67672B15FF09EBdc2e6e606FaB3B3be5cb84CAc2", "abi": [ { "inputs": [ @@ -86957,7 +88601,7 @@ ] }, "WETH": { - "address": "0x85f85C12FADEec638c63850117203f098386e6b9", + "address": "0xE8bc5dD936A974808211C9c7A4F3020366Fd6B61", "abi": [ { "anonymous": false, @@ -87242,7 +88886,7 @@ ] }, "WETHOracle": { - "address": "0x7E398fD108f81D7074c8512bd307270F936b19d3", + "address": "0x59a47B0738203A65D085b2854EC7a22B6fee927D", "abi": [ { "inputs": [ @@ -87483,7 +89127,7 @@ ] }, "WETHVaultHandler": { - "address": "0x94BD0Ea4f4497F877aFeeDb7b1242b286f94D621", + "address": "0xfA425b8bAf51E5ab840bC521AFfB1a5F7a7A8d80", "abi": [ { "inputs": [ diff --git a/src/hooks/useOracles.tsx b/src/hooks/useOracles.tsx index fab0eeb..8cefa75 100644 --- a/src/hooks/useOracles.tsx +++ b/src/hooks/useOracles.tsx @@ -7,6 +7,7 @@ export const useOracles = (): IOraclesContext => { const [wethOracle, setETHOracle] = useState(); const [daiOracle, setDAIOracle] = useState(); const [wbtcOracle, setWBTCOracle] = useState(); + const [jpegzOracle, setJPEGZOracle] = useState(); const [tcapOracle, setTCAPOracle] = useState(); const [aaveOracle, setAAVEOracle] = useState(); const [linkOracle, setLINKOracle] = useState(); @@ -17,6 +18,7 @@ export const useOracles = (): IOraclesContext => { const [wethOracleRead, setETHOracleRead] = useState(); const [daiOracleRead, setDAIOracleRead] = useState(); const [wbtcOracleRead, setWBTCOracleRead] = useState(); + const [jpegzOracleRead, setJPEGZOracleRead] = useState(); const [tcapOracleRead, setTCAPOracleRead] = useState(); const [aaveOracleRead, setAAVEOracleRead] = useState(); const [linkOracleRead, setLINKOracleRead] = useState(); @@ -34,6 +36,9 @@ export const useOracles = (): IOraclesContext => { const setCurrentWBTCOracle = React.useCallback((currentWBTCOracle: ethers.Contract): void => { setWBTCOracle(currentWBTCOracle); }, []); + const setCurrentJPEGZOracle = React.useCallback((currentJPEGZOracle: ethers.Contract): void => { + setJPEGZOracle(currentJPEGZOracle); + }, []); const setCurrentTCAPOracle = React.useCallback((currentTCAPOracle: ethers.Contract): void => { setTCAPOracle(currentTCAPOracle); }, []); @@ -64,6 +69,9 @@ export const useOracles = (): IOraclesContext => { const setCurrentWBTCOracleRead = React.useCallback((currentWBTCOracleRead: Contract): void => { setWBTCOracleRead(currentWBTCOracleRead); }, []); + const setCurrentJPEGZOracleRead = React.useCallback((currentJPEGZOracleRead: Contract): void => { + setJPEGZOracleRead(currentJPEGZOracleRead); + }, []); const setCurrentTCAPOracleRead = React.useCallback((currentTCAPOracleRead: Contract): void => { setTCAPOracleRead(currentTCAPOracleRead); }, []); @@ -92,6 +100,8 @@ export const useOracles = (): IOraclesContext => { setCurrentDAIOracle, wbtcOracle, setCurrentWBTCOracle, + jpegzOracle, + setCurrentJPEGZOracle, tcapOracle, setCurrentTCAPOracle, aaveOracle, @@ -112,6 +122,8 @@ export const useOracles = (): IOraclesContext => { setCurrentDAIOracleRead, wbtcOracleRead, setCurrentWBTCOracleRead, + jpegzOracleRead, + setCurrentJPEGZOracleRead, tcapOracleRead, setCurrentTCAPOracleRead, aaveOracleRead, diff --git a/src/hooks/usePrices.tsx b/src/hooks/usePrices.tsx index b6250a8..402eae5 100644 --- a/src/hooks/usePrices.tsx +++ b/src/hooks/usePrices.tsx @@ -1,7 +1,7 @@ import { useContext, useEffect, useState } from "react"; import { ethers, BigNumber } from "ethers"; import { oraclesContext, networkContext, signerContext } from "../state/index"; -import { isInLayer1, isOptimism, isPolygon, validOracles } from "../utils/utils"; +import { isArbitrum, isInLayer1, isOptimism, isPolygon, validOracles } from "../utils/utils"; import { OraclePricesType } from "../components/Vaults/types"; export const usePrices = (): OraclePricesType => { @@ -9,6 +9,7 @@ export const usePrices = (): OraclePricesType => { const oracles = useContext(oraclesContext); const signer = useContext(signerContext); const [oraclePrices, setOraclePrices] = useState({ + jpegzOraclePrice: "0", tcapOraclePrice: "0", wethOraclePrice: "0", daiOraclePrice: "0", @@ -23,16 +24,17 @@ export const usePrices = (): OraclePricesType => { const loadPrices = async () => { if (signer && oracles && validOracles(currentNetwork.chainId || 1, oracles)) { - const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); - const ethcalls = [tcapPriceCall, daiOraclePriceCall]; + const ethcalls = [daiOraclePriceCall]; if (isInLayer1(currentNetwork.chainId)) { + const tcapOraclePriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + ethcalls.push(tcapOraclePriceCall); ethcalls.push(wethOraclePriceCall); ethcalls.push(aaveOraclePriceCall); ethcalls.push(linkOraclePriceCall); @@ -40,21 +42,33 @@ export const usePrices = (): OraclePricesType => { ethcalls.push(wbtcOraclePriceCall); } if (isOptimism(currentNetwork.chainId)) { + const tcapOraclePriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); + ethcalls.push(tcapOraclePriceCall); ethcalls.push(wethOraclePriceCall); ethcalls.push(linkOraclePriceCall); ethcalls.push(snxOraclePriceCall); ethcalls.push(uniOraclePriceCall); } if (isPolygon(currentNetwork.chainId)) { + const tcapOraclePriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + ethcalls.push(tcapOraclePriceCall); ethcalls.push(maticOraclePriceCall); ethcalls.push(wbtcOraclePriceCall); } + if (isArbitrum(currentNetwork.chainId)) { + const jpegzPriceCall = await oracles.jpegzOracleRead?.getLatestAnswer(); + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + ethcalls.push(jpegzPriceCall); + ethcalls.push(wethOraclePriceCall); + } + + let jpegzOraclePrice = BigNumber.from(0); let tcapOraclePrice = BigNumber.from(0); let wethOraclePrice = BigNumber.from(0); let daiOraclePrice = BigNumber.from(0); @@ -69,8 +83,8 @@ export const usePrices = (): OraclePricesType => { if (isInLayer1(currentNetwork.chainId)) { // @ts-ignore [ - tcapOraclePrice, daiOraclePrice, + tcapOraclePrice, wethOraclePrice, aaveOraclePrice, linkOraclePrice, @@ -80,8 +94,8 @@ export const usePrices = (): OraclePricesType => { } else if (isOptimism(currentNetwork.chainId)) { // @ts-ignore [ - tcapOraclePrice, daiOraclePrice, + tcapOraclePrice, wethOraclePrice, linkOraclePrice, snxOraclePrice, @@ -89,11 +103,17 @@ export const usePrices = (): OraclePricesType => { ] = await signer.ethcallProvider?.all(ethcalls); } else if (isPolygon(currentNetwork.chainId)) { // @ts-ignore - [tcapOraclePrice, daiOraclePrice, maticOraclePrice, wbtcOraclePrice] = + [daiOraclePrice, tcapOraclePrice, maticOraclePrice, wbtcOraclePrice] = await signer.ethcallProvider?.all(ethcalls); + } else { + // @ts-ignore + [daiOraclePrice, jpegzOraclePrice, wethOraclePrice] = await signer.ethcallProvider?.all( + ethcalls + ); } setOraclePrices({ + jpegzOraclePrice: ethers.utils.formatEther(jpegzOraclePrice), tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), diff --git a/src/hooks/usePrices2.tsx b/src/hooks/usePrices2.tsx index f66efee..491cd0b 100644 --- a/src/hooks/usePrices2.tsx +++ b/src/hooks/usePrices2.tsx @@ -2,7 +2,7 @@ import { useContext, useEffect, useState } from "react"; import { ethers, BigNumber } from "ethers"; import { Provider } from "ethers-multicall"; import { oraclesContext } from "../state/index"; -import { isInLayer1, isOptimism, isPolygon, validOracles } from "../utils/utils"; +import { isArbitrum, isInLayer1, isOptimism, isPolygon, validOracles } from "../utils/utils"; import { OraclePricesType } from "../components/Vaults/types"; export const usePrices2 = ( @@ -11,6 +11,7 @@ export const usePrices2 = ( ): OraclePricesType => { const oracles = useContext(oraclesContext); const [oraclePrices, setOraclePrices] = useState({ + jpegzOraclePrice: "0", tcapOraclePrice: "0", wethOraclePrice: "0", daiOraclePrice: "0", @@ -26,16 +27,17 @@ export const usePrices2 = ( const loadPrices = async () => { if (oracles && ethcallProvider && validOracles(chainId, oracles)) { await ethcallProvider.init(); - const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); - const ethcalls = [tcapPriceCall, daiOraclePriceCall]; + const ethcalls = [daiOraclePriceCall]; if (isInLayer1(chainId)) { + const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + ethcalls.push(tcapPriceCall); ethcalls.push(wethOraclePriceCall); ethcalls.push(aaveOraclePriceCall); ethcalls.push(linkOraclePriceCall); @@ -43,21 +45,33 @@ export const usePrices2 = ( ethcalls.push(wbtcOraclePriceCall); } if (isOptimism(chainId)) { + const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); + ethcalls.push(tcapPriceCall); ethcalls.push(wethOraclePriceCall); ethcalls.push(linkOraclePriceCall); ethcalls.push(snxOraclePriceCall); ethcalls.push(uniOraclePriceCall); } if (isPolygon(chainId)) { + const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + ethcalls.push(tcapPriceCall); ethcalls.push(maticOraclePriceCall); ethcalls.push(wbtcOraclePriceCall); } + if (isArbitrum(chainId)) { + const jpegzPriceCall = await oracles.jpegzOracleRead?.getLatestAnswer(); + const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + ethcalls.push(jpegzPriceCall); + ethcalls.push(wethOraclePriceCall); + } + + let jpegzOraclePrice = BigNumber.from(0); let tcapOraclePrice = BigNumber.from(0); let wethOraclePrice = BigNumber.from(0); let daiOraclePrice = BigNumber.from(0); @@ -72,8 +86,8 @@ export const usePrices2 = ( if (isInLayer1(chainId)) { // @ts-ignore [ - tcapOraclePrice, daiOraclePrice, + tcapOraclePrice, wethOraclePrice, aaveOraclePrice, linkOraclePrice, @@ -83,8 +97,8 @@ export const usePrices2 = ( } else if (isOptimism(chainId)) { // @ts-ignore [ - tcapOraclePrice, daiOraclePrice, + tcapOraclePrice, wethOraclePrice, linkOraclePrice, snxOraclePrice, @@ -92,11 +106,15 @@ export const usePrices2 = ( ] = await ethcallProvider?.all(ethcalls); } else if (isPolygon(chainId)) { // @ts-ignore - [tcapOraclePrice, daiOraclePrice, maticOraclePrice, wbtcOraclePrice] = + [daiOraclePrice, tcapOraclePrice, maticOraclePrice, wbtcOraclePrice] = await ethcallProvider?.all(ethcalls); + } else { + // @ts-ignore + [daiOraclePrice, jpegzOraclePrice, wethOraclePrice] = await ethcallProvider?.all(ethcalls); } setOraclePrices({ + jpegzOraclePrice: ethers.utils.formatEther(jpegzOraclePrice), tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), diff --git a/src/hooks/useRatios.tsx b/src/hooks/useRatios.tsx index c6aa5e9..fe10999 100644 --- a/src/hooks/useRatios.tsx +++ b/src/hooks/useRatios.tsx @@ -1,6 +1,13 @@ import { useContext, useEffect, useState } from "react"; import { hardVaultsContext, networkContext, signerContext, vaultsContext } from "../state/index"; -import { isInLayer1, isOptimism, isPolygon, validVaults, validHardVaults } from "../utils/utils"; +import { + isArbitrum, + isInLayer1, + isOptimism, + isPolygon, + validVaults, + validHardVaults, +} from "../utils/utils"; import { VaultsRatioType } from "../components/Vaults/types"; export const useRatios = (): VaultsRatioType => { @@ -65,6 +72,10 @@ export const useRatios = (): VaultsRatioType => { ethcalls.push(maticRatioCall); ethcalls.push(wbtcRatioCall); } + if (isArbitrum(currentNetwork.chainId)) { + const wethRatioCall = await vaults.wethVaultRead?.ratio(); + ethcalls.push(wethRatioCall); + } let ethRatio = 0; let daiRatio = 0; let aaveRatio = 0; @@ -88,6 +99,9 @@ export const useRatios = (): VaultsRatioType => { } else if (isPolygon(currentNetwork.chainId)) { // @ts-ignore [daiRatio, maticRatio, wbtcRatio] = await signer.ethcallProvider?.all(ethcalls); + } else { + // @ts-ignore + [daiRatio, ethRatio] = await signer.ethcallProvider?.all(ethcalls); } setVaultsRatio({ ethRatio, diff --git a/src/hooks/useTokens.tsx b/src/hooks/useTokens.tsx index 35db826..9d6a0a4 100644 --- a/src/hooks/useTokens.tsx +++ b/src/hooks/useTokens.tsx @@ -7,6 +7,7 @@ export const useTokens = (): ITokensContext => { const [wethToken, setETHToken] = useState(); const [daiToken, setDAIToken] = useState(); const [wbtcToken, setWBTCToken] = useState(); + const [jpegzToken, setJPEGZToken] = useState(); const [tcapToken, setTCAPToken] = useState(); const [ctxToken, setCtxToken] = useState(); const [aaveToken, setAAVEToken] = useState(); @@ -22,6 +23,7 @@ export const useTokens = (): ITokensContext => { const [wethTokenRead, setETHTokenRead] = useState(); const [daiTokenRead, setDAITokenRead] = useState(); const [wbtcTokenRead, setWBTCTokenRead] = useState(); + const [jpegzTokenRead, setJPEGZTokenRead] = useState(); const [tcapTokenRead, setTCAPTokenRead] = useState(); const [ctxTokenRead, setCtxTokenRead] = useState(); const [aaveTokenRead, setAAVETokenRead] = useState(); @@ -44,6 +46,9 @@ export const useTokens = (): ITokensContext => { const setCurrentWBTCToken = React.useCallback((currentWBTCToken: ethers.Contract): void => { setWBTCToken(currentWBTCToken); }, []); + const setCurrentJPEGZToken = React.useCallback((currentJPEGZToken: ethers.Contract): void => { + setJPEGZToken(currentJPEGZToken); + }, []); const setCurrentTCAPToken = React.useCallback((currentTCAPToken: ethers.Contract): void => { setTCAPToken(currentTCAPToken); }, []); @@ -95,6 +100,9 @@ export const useTokens = (): ITokensContext => { const setCurrentWBTCTokenRead = React.useCallback((currentWBTCTokenRead: Contract): void => { setWBTCTokenRead(currentWBTCTokenRead); }, []); + const setCurrentJPEGZTokenRead = React.useCallback((currentJPEGZTokenRead: Contract): void => { + setJPEGZTokenRead(currentJPEGZTokenRead); + }, []); const setCurrentTCAPTokenRead = React.useCallback((currentTCAPTokenRead: Contract): void => { setTCAPTokenRead(currentTCAPTokenRead); }, []); @@ -151,6 +159,8 @@ export const useTokens = (): ITokensContext => { setCurrentDAIToken, wbtcToken, setCurrentWBTCToken, + jpegzToken, + setCurrentJPEGZToken, tcapToken, setCurrentTCAPToken, ctxToken, @@ -181,6 +191,8 @@ export const useTokens = (): ITokensContext => { setCurrentDAITokenRead, wbtcTokenRead, setCurrentWBTCTokenRead, + jpegzTokenRead, + setCurrentJPEGZTokenRead, tcapTokenRead, setCurrentTCAPTokenRead, ctxTokenRead, diff --git a/src/hooks/useVault.tsx b/src/hooks/useVault.tsx index 7f20c4f..865dd4d 100644 --- a/src/hooks/useVault.tsx +++ b/src/hooks/useVault.tsx @@ -10,7 +10,7 @@ import { vaultsContext, } from "../state/index"; import { validVaults, validHardVaults } from "../utils/utils"; -import { NETWORKS } from "../utils/constants"; +import { NETWORKS, TOKENS_SYMBOLS } from "../utils/constants"; type contractsType = { currentAsset: ethers.Contract | null; @@ -58,14 +58,14 @@ export const useVault = ( cVault = hardVaults.wethVault; cVaultRead = hardVaults.wethVaultRead; } - if (assetSymbol === "JPEGz") { - cAsset = tokens.tcapToken; - cAssetRead = tokens.tcapTokenRead; - cAssetOracleRead = oracles.tcapOracleRead; + if (assetSymbol === TOKENS_SYMBOLS.JPEGz) { + cAsset = tokens.jpegzToken; + cAssetRead = tokens.jpegzTokenRead; + cAssetOracleRead = oracles.jpegzOracleRead; } switch (collateralSymbol) { - case "DAI": + case TOKENS_SYMBOLS.DAI: if (isHardVault) { cVault = hardVaults.daiVault; cVaultRead = hardVaults.daiVaultRead; @@ -77,49 +77,49 @@ export const useVault = ( cCollateralRead = tokens.daiTokenRead; cOracleRead = oracles.daiOracleRead; break; - case "AAVE": + case TOKENS_SYMBOLS.AAVE: cVault = vaults.aaveVault; cVaultRead = vaults.aaveVaultRead; cCollateral = tokens.aaveToken; cCollateralRead = tokens.aaveTokenRead; cOracleRead = oracles.aaveOracleRead; break; - case "LINK": + case TOKENS_SYMBOLS.LINK: cVault = vaults.linkVault; cVaultRead = vaults.linkVaultRead; cCollateral = tokens.daiToken; cCollateralRead = tokens.daiTokenRead; cOracleRead = oracles.linkOracleRead; break; - case "SNX": + case TOKENS_SYMBOLS.SNX: cVault = vaults.snxVault; cVaultRead = vaults.snxVaultRead; cCollateral = tokens.snxToken; cCollateralRead = tokens.snxTokenRead; cOracleRead = oracles.snxOracleRead; break; - case "UNI": + case TOKENS_SYMBOLS.UNI: cVault = vaults.uniVault; cVaultRead = vaults.uniVaultRead; cCollateral = tokens.uniToken; cCollateralRead = tokens.uniTokenRead; cOracleRead = oracles.uniOracleRead; break; - case "MATIC": + case TOKENS_SYMBOLS.MATIC: cVault = vaults.maticVault; cVaultRead = vaults.maticVaultRead; cCollateral = tokens.maticToken; cCollateralRead = tokens.maticTokenRead; cOracleRead = oracles.maticOracleRead; break; - case "WBTC": + case TOKENS_SYMBOLS.WBTC: cVault = vaults.wbtcVault; cVaultRead = vaults.wbtcVaultRead; cCollateral = tokens.wbtcToken; cCollateralRead = tokens.wbtcTokenRead; cOracleRead = oracles.wbtcOracleRead; break; - case "USDC": + case TOKENS_SYMBOLS.USDC: cVault = hardVaults.usdcVault; cVaultRead = hardVaults.usdcVaultRead; cCollateral = tokens.usdcToken; diff --git a/src/state/OraclesContext.tsx b/src/state/OraclesContext.tsx index 8cfd574..fc2c8ae 100644 --- a/src/state/OraclesContext.tsx +++ b/src/state/OraclesContext.tsx @@ -9,6 +9,8 @@ export interface IOraclesContext { setCurrentDAIOracle: (currentOracle: ethers.Contract) => void; wbtcOracle?: ethers.Contract; setCurrentWBTCOracle: (currentOracle: ethers.Contract) => void; + jpegzOracle?: ethers.Contract; + setCurrentJPEGZOracle: (currentOracle: ethers.Contract) => void; tcapOracle?: ethers.Contract; setCurrentTCAPOracle: (currentOracle: ethers.Contract) => void; aaveOracle?: ethers.Contract; @@ -29,6 +31,8 @@ export interface IOraclesContext { setCurrentDAIOracleRead: (currentOracle: Contract) => void; wbtcOracleRead?: Contract; setCurrentWBTCOracleRead: (currentOracle: Contract) => void; + jpegzOracleRead?: Contract; + setCurrentJPEGZOracleRead: (currentOracle: Contract) => void; tcapOracleRead?: Contract; setCurrentTCAPOracleRead: (currentOracle: Contract) => void; aaveOracleRead?: Contract; @@ -49,6 +53,7 @@ export const ORACLES_DEFAULT_VALUE = { setCurrentWETHOracle: () => {}, setCurrentDAIOracle: () => {}, setCurrentWBTCOracle: () => {}, + setCurrentJPEGZOracle: () => {}, setCurrentTCAPOracle: () => {}, setCurrentAAVEOracle: () => {}, setCurrentLINKOracle: () => {}, @@ -59,6 +64,7 @@ export const ORACLES_DEFAULT_VALUE = { setCurrentWETHOracleRead: () => {}, setCurrentDAIOracleRead: () => {}, setCurrentWBTCOracleRead: () => {}, + setCurrentJPEGZOracleRead: () => {}, setCurrentTCAPOracleRead: () => {}, setCurrentAAVEOracleRead: () => {}, setCurrentLINKOracleRead: () => {}, diff --git a/src/state/TokensContext.tsx b/src/state/TokensContext.tsx index 84e63ee..c94f466 100644 --- a/src/state/TokensContext.tsx +++ b/src/state/TokensContext.tsx @@ -9,6 +9,8 @@ export interface ITokensContext { setCurrentDAIToken: (currentToken: ethers.Contract) => void; wbtcToken?: ethers.Contract; setCurrentWBTCToken: (currentToken: ethers.Contract) => void; + jpegzToken?: ethers.Contract; + setCurrentJPEGZToken: (currentToken: ethers.Contract) => void; tcapToken?: ethers.Contract; setCurrentTCAPToken: (currentToken: ethers.Contract) => void; ctxToken?: ethers.Contract; @@ -39,6 +41,8 @@ export interface ITokensContext { setCurrentDAITokenRead: (currentTokenRead: Contract) => void; wbtcTokenRead?: Contract; setCurrentWBTCTokenRead: (currentTokenRead: Contract) => void; + jpegzTokenRead?: Contract; + setCurrentJPEGZTokenRead: (currentTokenRead: Contract) => void; tcapTokenRead?: Contract; setCurrentTCAPTokenRead: (currentTokenRead: Contract) => void; ctxTokenRead?: Contract; @@ -69,6 +73,7 @@ export const TOKENS_DEFAULT_VALUE = { setCurrentWETHToken: () => {}, setCurrentDAIToken: () => {}, setCurrentWBTCToken: () => {}, + setCurrentJPEGZToken: () => {}, setCurrentTCAPToken: () => {}, setCurrentCtxToken: () => {}, setCurrentAAVEToken: () => {}, @@ -84,6 +89,7 @@ export const TOKENS_DEFAULT_VALUE = { setCurrentWETHTokenRead: () => {}, setCurrentDAITokenRead: () => {}, setCurrentWBTCTokenRead: () => {}, + setCurrentJPEGZTokenRead: () => {}, setCurrentTCAPTokenRead: () => {}, setCurrentCtxTokenRead: () => {}, setCurrentAAVETokenRead: () => {}, diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 16a85cc..b2ae3d7 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -48,9 +48,9 @@ export const NETWORKS = { chainId: 421613, hexChainId: "0x66EED", name: "Arbitrum Goerli", - eth: "0x85f85C12FADEec638c63850117203f098386e6b9", - weth: "0x85f85C12FADEec638c63850117203f098386e6b9", - dai: "0x17aC26AB292660126d2baF16e5304DcbEc54340C", + eth: "0xE8bc5dD936A974808211C9c7A4F3020366Fd6B61", + weth: "0xE8bc5dD936A974808211C9c7A4F3020366Fd6B61", + dai: "0x7E574b5F8B61B71A6A1DA6127A9383F656d1a800", }, optimism: { chainId: 10, diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 1f7f1b3..08181e3 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -324,7 +324,7 @@ export const isGoerli = (chainId: number | undefined) => { export const getDefaultProvider = (chainId: number | undefined) => { let provider; if (chainId === NETWORKS.arbitrum_goerli.chainId) { - provider = ethers.getDefaultProvider(chainId, { + provider = new ethers.providers.InfuraProvider("arbitrum-goerli", { infura: process.env.REACT_APP_INFURA_ID, }); } else if (chainId === NETWORKS.okovan.chainId) { @@ -411,10 +411,12 @@ export const validVaults = (chainId: number, vaults: IVaultsContext): boolean => !isUndefined(vaults.snxVaultRead) && !isUndefined(vaults.uniVaultRead); } - if (isPolygon(chainId)) { valid = valid && !isUndefined(vaults.maticVaultRead) && !isUndefined(vaults.wbtcVaultRead); } + if (isArbitrum(chainId)) { + valid = valid && !isUndefined(vaults.wethVaultRead); + } return valid; }; From 415f750c9637fab6c2e98953546de485132c8f9f Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 11 Jan 2023 23:09:23 -0600 Subject: [PATCH 210/278] fixed summary data and vault issues --- src/assets/images/jpegz-coin.png | Bin 0 -> 4068 bytes src/assets/images/tcap-coin.svg | 2 +- src/components/Sidebar.tsx | 15 +- src/components/Summary/Balance.tsx | 224 ++++++++------- src/components/Summary/Indexes.tsx | 109 ++++---- src/components/Summary/Protocol.tsx | 83 +++--- src/components/Summary/Summary.tsx | 98 +++---- src/components/Summary/SummaryOptions.tsx | 72 +++++ src/components/Summary/index.tsx | 132 ++++++++- .../Summary/warnings/VaultsWarning.tsx | 10 +- .../Vaults/monitoring/Liquidate.tsx | 19 +- src/components/Vaults/monitoring/Vaults.tsx | 12 +- src/components/Vaults/types.tsx | 14 - src/components/Vaults/vault/index.tsx | 206 +++++++++----- src/hooks/index.tsx | 8 + src/hooks/types.tsx | 23 ++ src/hooks/useArbitrum.tsx | 34 +++ src/hooks/useBalances.tsx | 110 ++++++++ src/hooks/useEthereum.tsx | 73 +++++ src/hooks/useOptimism.tsx | 52 ++++ src/hooks/usePrices.tsx | 6 +- src/hooks/usePrices2.tsx | 264 +++++++++++------- src/hooks/useVault.tsx | 27 +- src/state/ArbitrumContext.tsx | 22 ++ src/state/EthereumContext.tsx | 40 +++ src/state/OptimismContext.tsx | 31 ++ src/state/index.tsx | 6 + src/styles/app.scss | 21 ++ src/styles/summary.scss | 39 ++- src/styles/vault-monitoring.scss | 2 +- src/styles/{mint2.scss => vault.scss} | 16 +- src/utils/utils.tsx | 54 +++- 32 files changed, 1319 insertions(+), 505 deletions(-) create mode 100755 src/assets/images/jpegz-coin.png create mode 100644 src/components/Summary/SummaryOptions.tsx create mode 100644 src/hooks/types.tsx create mode 100644 src/hooks/useArbitrum.tsx create mode 100644 src/hooks/useBalances.tsx create mode 100644 src/hooks/useEthereum.tsx create mode 100644 src/hooks/useOptimism.tsx create mode 100644 src/state/ArbitrumContext.tsx create mode 100644 src/state/EthereumContext.tsx create mode 100644 src/state/OptimismContext.tsx rename src/styles/{mint2.scss => vault.scss} (97%) diff --git a/src/assets/images/jpegz-coin.png b/src/assets/images/jpegz-coin.png new file mode 100755 index 0000000000000000000000000000000000000000..11d0f8c93ab7c1bab0f660aa846d7653440ca4a4 GIT binary patch literal 4068 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 + \ No newline at end of file diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index e89cc4f..3a9e345 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useState } from "react"; +import React, { useContext, useEffect, useState } from "react"; import Nav from "react-bootstrap/esm/Nav"; import { GiSpottedMushroom } from "react-icons/gi"; import "../styles/sidebar.scss"; @@ -56,6 +56,19 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { const [active, setActive] = useState(activeVal); const web3Modal = useContext(Web3ModalContext); + useEffect( + () => { + const path = window.location.pathname.replace("/", ""); + if (path !== "") { + setActive(path); + } else { + setActive(activeVal); + } + }, + // eslint-disable-next-line + [window.location.pathname] + ); + const sidebarClass = () => { if (!isMobile) return "sidebar"; if (showSidebar) return "sidebar mobile slide-out"; diff --git a/src/components/Summary/Balance.tsx b/src/components/Summary/Balance.tsx index fb79f88..5de2a58 100644 --- a/src/components/Summary/Balance.tsx +++ b/src/components/Summary/Balance.tsx @@ -1,13 +1,14 @@ import React, { useContext, useEffect, useState } from "react"; -import { Spinner } from "react-bootstrap/esm/"; -import { ethers } from "ethers"; -import { useTranslation } from "react-i18next"; +import { Image, Spinner } from "react-bootstrap/esm/"; +// import { useTranslation } from "react-i18next"; import NumberFormat from "react-number-format"; import { Provider } from "ethers-multicall"; -import { oraclesContext, tokensContext } from "../../state"; -import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; +import jpegzIcon from "../../assets/images/jpegz-coin.png"; import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; -import { getPriceInUSDFromPair, isUndefined } from "../../utils/utils"; +import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; +import { BalancesType, OraclePricesType } from "../../hooks/types"; +import { ethereumContext } from "../../state"; +import { getPriceInUSDFromPair, isArbitrum, isInLayer1 } from "../../utils/utils"; import { NETWORKS } from "../../utils/constants"; import { VaultsWarning } from "./warnings/index"; @@ -15,12 +16,14 @@ type props = { currentChainId: number; ethCallProvider: Provider | undefined; signerAddress: string; + balances: BalancesType; + prices: OraclePricesType; }; -const Balance = ({ currentChainId, ethCallProvider, signerAddress }: props) => { - const { t } = useTranslation(); - const oracles = useContext(oraclesContext); - const tokens = useContext(tokensContext); +const Balance = ({ currentChainId, ethCallProvider, signerAddress, balances, prices }: props) => { + // const { t } = useTranslation(); + const currentIndexName = isArbitrum(currentChainId) ? "JPEGz" : "TCAP"; + const ethereumContracts = useContext(ethereumContext); const [loading, setLoading] = useState(true); const [indexBalance, setIndexBalance] = useState("0.0"); const [ctxBalance, setCtxBalance] = useState("0.0"); @@ -28,54 +31,38 @@ const Balance = ({ currentChainId, ethCallProvider, signerAddress }: props) => { const [ctxUsdBalance, setCtxUsdBalance] = useState("0.0"); const loadData = async () => { - if (oracles.tcapOracleRead && tokens && !isUndefined(tokens.tcapTokenRead) && ethCallProvider) { - const currentIndexPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - // @ts-ignore - const [currentIndexPrice] = await ethCallProvider?.all([currentIndexPriceCall]); - const totalIndexPrice = currentIndexPrice.mul(10000000000); - const indexPrice = ethers.utils.formatEther(totalIndexPrice.div(10000000000)); - + if (ethCallProvider) { + console.log("Entra: "); let currentPriceCTX = 0; if (signerAddress === "" || currentChainId === NETWORKS.mainnet.chainId) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); + const reservesCtxPoolCall = await ethereumContracts.ctxPoolTokenRead?.getReserves(); // @ts-ignore - const [wethOraclePrice, reservesCtxPool] = await ethCallProvider?.all([ - wethOraclePriceCall, - reservesCtxPoolCall, - ]); - const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + const [reservesCtxPool] = await ethCallProvider?.all([reservesCtxPoolCall]); currentPriceCTX = await getPriceInUSDFromPair( reservesCtxPool[0], reservesCtxPool[1], - parseFloat(currentPriceETH) + parseFloat(prices.wethOraclePrice) ); } - if (tokens.tcapTokenRead && signerAddress !== "") { - const currentTcapBalanceCall = await tokens.tcapTokenRead?.balanceOf(signerAddress); - // @ts-ignore - const [currentIndexBalance] = await ethCallProvider?.all([currentTcapBalanceCall]); - const indexString = ethers.utils.formatEther(currentIndexBalance); - setIndexBalance(indexString); - const indexUSD = parseFloat(indexString) * parseFloat(indexPrice); - if (indexUSD < 0.0001) { - setIndexUsdBalance("0.0"); - } else { - setIndexUsdBalance(indexUSD.toString()); - } - if (currentChainId === NETWORKS.mainnet.chainId) { - const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(signerAddress); - // @ts-ignore - const [currentCtxBalance] = await ethCallProvider?.all([currentCtxBalanceCall]); - const ctxString = ethers.utils.formatEther(currentCtxBalance); - setCtxBalance(ctxString); - const ctxUSD = parseFloat(ctxString) * currentPriceCTX; - setCtxUsdBalance(ctxUSD.toString()); - } else { - setCtxBalance("21.5"); - setCtxUsdBalance("67.08"); - } + let indexUSD = 0; + if (isArbitrum(currentChainId)) { + indexUSD = parseFloat(balances.jpegzBalance) * parseFloat(prices.jpegzOraclePrice); + setIndexBalance(balances.jpegzBalance); + } else { + indexUSD = parseFloat(balances.tcapBalance) * parseFloat(prices.tcapOraclePrice); + setIndexBalance(balances.tcapBalance); + } + if (indexUSD < 0.0001) { + setIndexUsdBalance("0.0"); + } else { + setIndexUsdBalance(indexUSD.toString()); + } + + if (currentChainId === NETWORKS.mainnet.chainId) { + setCtxBalance(balances.ctxBalance); + const ctxUSD = parseFloat(balances.ctxBalance) * currentPriceCTX; + setCtxUsdBalance(ctxUSD.toString()); } } }; @@ -88,10 +75,17 @@ const Balance = ({ currentChainId, ethCallProvider, signerAddress }: props) => { }; load(); // eslint-disable-next-line - }, [currentChainId, ethCallProvider, signerAddress]); + }, [ethCallProvider, signerAddress, balances]); + + const IndexIcon = () => { + if (!isArbitrum(currentChainId)) { + return ; + } + return JPEGz icon; + }; return ( -
+
{loading ? (
@@ -100,25 +94,36 @@ const Balance = ({ currentChainId, ethCallProvider, signerAddress }: props) => { <>
- +
-
- <>{t("welcome.tcap-balance")} -
-
- -
+ {/*
{currentIndexName} Balance
*/} +
+
+ +
+
/
+
+ +
+
-
- + {/*
+
-
TCAP USD Balance
+
{currentIndexName} USD Balance
{ />
-
-
- -
-
- <>{t("welcome.ctx-balance")} -
-
- -
-
-
-
- -
-
CTX USD Balance
-
- -
-
-
+
*/} + {isInLayer1(currentChainId) && ( + <> +
+ +
+ {/*
+ <>{t("welcome.ctx-balance")} +
*/} +
+
+ +
+
/
+
+ +
+
+
+
+ {/*
+ +
+
CTX USD Balance
+
+ +
+
+
*/} + + )}
- +
)} diff --git a/src/components/Summary/Indexes.tsx b/src/components/Summary/Indexes.tsx index fd8a52f..208ecc5 100644 --- a/src/components/Summary/Indexes.tsx +++ b/src/components/Summary/Indexes.tsx @@ -1,22 +1,23 @@ -import React, { useContext, useEffect, useState } from "react"; -import { Spinner } from "react-bootstrap/esm/"; -import { ethers } from "ethers"; +import React, { useEffect, useState } from "react"; +import { Image, Spinner } from "react-bootstrap/esm/"; import { useTranslation } from "react-i18next"; import NumberFormat from "react-number-format"; import { Provider } from "ethers-multicall"; -import { oraclesContext, tokensContext } from "../../state"; +import jpegzIcon from "../../assets/images/jpegz-coin.png"; +import { BalancesType, OraclePricesType } from "../../hooks/types"; import { ReactComponent as TcapIcon } from "../../assets/images/tcap-coin.svg"; -import { isUndefined } from "../../utils/utils"; +import { isArbitrum } from "../../utils/utils"; type props = { currentChainId: number; ethCallProvider: Provider | undefined; + balances: BalancesType; + prices: OraclePricesType; }; -const Indexes = ({ currentChainId, ethCallProvider }: props) => { +const Indexes = ({ currentChainId, ethCallProvider, balances, prices }: props) => { const { t } = useTranslation(); - const oracles = useContext(oraclesContext); - const tokens = useContext(tokensContext); + const currentIndexName = isArbitrum(currentChainId) ? "JPEGz" : "TCAP"; const [loading, setLoading] = useState(true); const [marketCap, setMarketCap] = useState("0.0"); const [indexOraclePrice, setIndexOraclePrice] = useState("0.0"); @@ -24,48 +25,37 @@ const Indexes = ({ currentChainId, ethCallProvider }: props) => { const [totalSupply, setTotalSupply] = useState("0.0"); const loadData = async () => { - if ( - oracles.tcapOracleRead && - tokens && - !isUndefined(tokens.tcapTokenRead) && - !isUndefined(ethCallProvider) - ) { - const currentTotalSupplyCall = await tokens.tcapTokenRead?.totalSupply(); - const currentIndexPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - - // @ts-ignore - const [currentTotalSupply, currentIndexPrice] = await ethCallProvider?.all([ - currentTotalSupplyCall, - currentIndexPriceCall, - ]); - - setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); - const totalIndexMarketCap = currentIndexPrice.mul(10000000000); - const indexPrice = ethers.utils.formatEther(totalIndexMarketCap.div(10000000000)); - setMarketCap(ethers.utils.formatEther(totalIndexMarketCap)); - setIndexOraclePrice(indexPrice); + if (!isArbitrum(currentChainId)) { + setTotalSupply(balances.tcapSupplly); + setIndexOraclePrice(prices.tcapOraclePrice); + setMarketCap(prices.tcapMarketCap); + } else { + setTotalSupply(balances.jpegzSupplly); + setIndexOraclePrice(prices.jpegzOraclePrice); + setMarketCap(prices.jpegzMarketCap); + } - const urlParams = new URLSearchParams({ - ids: "total-crypto-market-cap-token", - vs_currencies: "usd", - include_last_updated_at: true, - precision: 10, - }); + // @ts-ignore + const urlParams = new URLSearchParams({ + ids: "total-crypto-market-cap-token", + vs_currencies: "usd", + include_last_updated_at: true, + precision: 10, + }); - const reponse = await fetch( - "https://api.coingecko.com/api/v3/simple/price?".concat(urlParams.toString()), - { - method: "GET", - mode: "cors", - headers: { - "Content-Type": "application/json", - }, - } - ); - const resp = await reponse.json(); - if (resp) { - setIndexMarketPrice(resp["total-crypto-market-cap-token"].usd); + const reponse = await fetch( + "https://api.coingecko.com/api/v3/simple/price?".concat(urlParams.toString()), + { + method: "GET", + mode: "cors", + headers: { + "Content-Type": "application/json", + }, } + ); + const resp = await reponse.json(); + if (resp) { + setIndexMarketPrice(resp["total-crypto-market-cap-token"].usd); } }; @@ -77,7 +67,14 @@ const Indexes = ({ currentChainId, ethCallProvider }: props) => { }; load(); // eslint-disable-next-line - }, [currentChainId, ethCallProvider]); + }, [currentChainId, ethCallProvider, balances, prices]); + + const IndexIcon = () => { + if (!isArbitrum(currentChainId)) { + return ; + } + return JPEGz icon; + }; return (
@@ -88,7 +85,7 @@ const Indexes = ({ currentChainId, ethCallProvider }: props) => { ) : (
- +
<>{t("welcome.tcap")} @@ -105,9 +102,9 @@ const Indexes = ({ currentChainId, ethCallProvider }: props) => {
- +
-
TCAP Oracle Price
+
{currentIndexName} Oracle Price
{
- +
-
TCAP Market Price
+
{currentIndexName} Market Price
{
- +
-
- <>{t("welcome.summary.total-supply")} -
+
{currentIndexName} Supply
{ +const Protocol = ({ currentChainId, ethCallProvider, prices }: props) => { const { t } = useTranslation(); - const currentNetwork = useContext(networkContext); - const tokens = useContext(tokensContext); - const signer = useContext(signerContext); - const oracles = useContext(oraclesContext); - const prices = usePrices2(currentChainId, ethCallProvider); const [ethStake, setETHStake] = useState("0"); const [daiStake, setDAIStake] = useState("0"); const [maticStake, setMATICStake] = useState("0"); @@ -62,14 +56,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => { `; const loadStaked = async (data: any) => { - if ( - oracles && - tokens && - data && - signer && - !isUndefined(tokens.tcapTokenRead) && - validOracles(currentNetwork.chainId || 1, oracles) - ) { + if (data) { let currentDAIStake = BigNumber.from(0); let currentWETHStake = BigNumber.from(0); let currentAAVEStake = BigNumber.from(0); @@ -80,7 +67,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => { let currentWBTCStake = BigNumber.from(0); let currentUSDCStake = BigNumber.from(0); - const networkId = currentNetwork.chainId; + const networkId = currentChainId; // @ts-ignore let contracts; switch (networkId) { @@ -122,19 +109,19 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => { ); } - if (isPolygon(currentNetwork.chainId)) { + if (isPolygon(currentChainId)) { // @ts-ignore if (cAddress === contracts.MATICVaultHandler.address.toLowerCase()) { currentMATICStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); } } - if (isInLayer1(currentNetwork.chainId) || isPolygon(currentNetwork.chainId)) { + if (isInLayer1(currentChainId) || isPolygon(currentChainId)) { // @ts-ignore if (cAddress === contracts.HardWBTCVaultHandler.address.toLowerCase()) { currentWBTCStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); } } - if (isInLayer1(currentNetwork.chainId) || isOptimism(currentNetwork.chainId)) { + if (isInLayer1(currentChainId) || isOptimism(currentChainId)) { // @ts-ignore if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { currentWETHStake = currentWETHStake.add( @@ -147,7 +134,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => { } } - if (isInLayer1(currentNetwork.chainId)) { + if (isInLayer1(currentChainId)) { // @ts-ignore if (cAddress === contracts.AaveVaultHandler.address.toLowerCase()) { currentAAVEStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); @@ -169,7 +156,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => { ); } } - if (isOptimism(currentNetwork.chainId)) { + if (isOptimism(currentChainId)) { // @ts-ignore if (cAddress === contracts.SNXVaultHandler.address.toLowerCase()) { currentSNXStake = s.amountStaked ? s.amountStaked : BigNumber.from(0); @@ -180,7 +167,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => { } } - if (isArbitrum(currentNetwork.chainId)) { + if (isArbitrum(currentChainId)) { // @ts-ignore if (cAddress === contracts.WETHVaultHandler.address.toLowerCase()) { currentWETHStake = currentWETHStake.add( @@ -254,7 +241,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => {
) : (
-
+
@@ -271,7 +258,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => {
- {!isPolygon(currentNetwork.chainId) && ( + {!isPolygon(currentChainId) && (
@@ -305,7 +292,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => {
- {isInLayer1(currentNetwork.chainId) && ( + {isInLayer1(currentChainId) && (
@@ -323,7 +310,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => {
)} - {!isPolygon(currentNetwork.chainId) && ( + {!isPolygon(currentChainId) && !isArbitrum(currentChainId) && (
@@ -341,7 +328,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => {
)} - {isOptimism(currentNetwork.chainId) && ( + {isOptimism(currentChainId) && ( <>
@@ -377,7 +364,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => {
)} - {isPolygon(currentNetwork.chainId) && ( + {isPolygon(currentChainId) && (
@@ -395,7 +382,7 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => {
)} - {!isOptimism(currentNetwork.chainId) && ( + {!isOptimism(currentChainId) && !isArbitrum(currentChainId) && (
@@ -413,22 +400,24 @@ const Protocol = ({ currentChainId, ethCallProvider }: props) => {
)} -
- -
-
- <>{t("welcome.summary.staked-usdc")} -
-
- -
+ {!isArbitrum(currentChainId) && ( +
+ +
+
+ <>{t("welcome.summary.staked-usdc")} +
+
+ +
+
-
+ )}
)}
diff --git a/src/components/Summary/Summary.tsx b/src/components/Summary/Summary.tsx index 20b47e0..49f2eae 100644 --- a/src/components/Summary/Summary.tsx +++ b/src/components/Summary/Summary.tsx @@ -1,20 +1,11 @@ import React, { useEffect, useState } from "react"; import { ethers } from "ethers"; import { Provider } from "ethers-multicall"; -import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; import { Card, Col, Dropdown } from "react-bootstrap/esm"; import "../../styles/summary.scss"; -import Balance from "./Balance"; -import Indexes from "./Indexes"; -import Protocol from "./Protocol"; -import { GRAPHQL_ENDPOINT, NETWORKS } from "../../utils/constants"; -import { getDefaultProvider } from "../../utils/utils"; - -const clientOracle = (graphqlEndpoint: string) => - new ApolloClient({ - uri: graphqlEndpoint, - cache: new InMemoryCache(), - }); +import SummaryOptions from "./SummaryOptions"; +import { NETWORKS } from "../../utils/constants"; +import { getDefaultProvider, isArbitrum } from "../../utils/utils"; type props = { signerAddress: string; @@ -22,11 +13,12 @@ type props = { }; const Summary = ({ signerAddress, signerChainId }: props) => { - const options = [ + const indexName = isArbitrum(signerChainId) ? "JPEGz" : "TCAP"; + const [options, setOptions] = useState([ { id: "0", name: "My Balance" }, - { id: "1", name: "TCAP Summary" }, + { id: "1", name: indexName.concat(" Summary") }, { id: "2", name: "Vaults Summary" }, - ]; + ]); let chains = [ { id: NETWORKS.mainnet.chainId, name: "Mainnet" }, { id: NETWORKS.arbitrum.chainId, name: "Arbitrum" }, @@ -39,6 +31,7 @@ const Summary = ({ signerAddress, signerChainId }: props) => { { id: NETWORKS.okovan.chainId, name: "OKovan" }, ]; } + const [updatingChain, setUpdatingChain] = useState(false); const [currentOption, setCurrentOption] = useState( signerAddress !== "" ? options[0] : options[1] ); @@ -64,47 +57,15 @@ const Summary = ({ signerAddress, signerChainId }: props) => { const [currentChain, setCurrentChain] = useState(getDefaultChain()); const [currentEthProvider, setCurrentEthProvider] = useState(); - const [apolloClient, setApolloClient] = useState( - clientOracle( - process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.goerli - ) - ); useEffect(() => { - switch (currentChain.id) { - case NETWORKS.mainnet.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); - break; - case NETWORKS.goerli.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.goerli)); - break; - case NETWORKS.arbitrum.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum)); - break; - case NETWORKS.arbitrum_goerli.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum_goerli)); - break; - case NETWORKS.optimism.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.optimism)); - break; - case NETWORKS.okovan.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.okovan)); - break; - case NETWORKS.polygon.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.polygon)); - break; - case NETWORKS.mumbai.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mumbai)); - break; - default: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); - break; - } + setUpdatingChain(true); const provider = getDefaultProvider(currentChain.id); const randomSigner = ethers.Wallet.createRandom().connect(provider); const ethcallProvider = new Provider(randomSigner.provider); ethcallProvider.init(); setCurrentEthProvider(ethcallProvider); + setUpdatingChain(false); }, [currentChain.id]); const handleOptionChange = (eventKey: string) => { @@ -114,7 +75,23 @@ const Summary = ({ signerAddress, signerChainId }: props) => { const handleChainChange = (eventKey: string) => { const c = chains.find((chain) => chain.id.toString() === eventKey); + setUpdatingChain(true); setCurrentChain(c || chains[0]); + + const ops = [...options]; + if (c) { + if (!isArbitrum(c.id)) { + ops[1].name = "TCAP Summary"; + } else { + ops[1].name = "JPEGz Summary"; + } + } + if (currentOption.id === "1") { + const cOpt = currentOption; + cOpt.name = ops[1].name; + setCurrentOption(cOpt); + } + setOptions(ops); }; return ( @@ -153,21 +130,14 @@ const Summary = ({ signerAddress, signerChainId }: props) => { - - {currentOption.id === options[0].id && signerAddress !== "" && ( - - )} - {currentOption.id === options[1].id && ( - - )} - {currentOption.id === options[2].id && ( - - )} - + {!updatingChain && ( + + )} diff --git a/src/components/Summary/SummaryOptions.tsx b/src/components/Summary/SummaryOptions.tsx new file mode 100644 index 0000000..9a61ba9 --- /dev/null +++ b/src/components/Summary/SummaryOptions.tsx @@ -0,0 +1,72 @@ +import React from "react"; +import { Provider } from "ethers-multicall"; +import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; +import { Spinner } from "react-bootstrap/esm/"; +import { useBalances, usePrices2 } from "../../hooks"; +import Balance from "./Balance"; +import Indexes from "./Indexes"; +import Protocol from "./Protocol"; +import { getGraphqlEndPoint } from "../../utils/utils"; + +const clientOracle = (graphqlEndpoint: string) => + new ApolloClient({ + uri: graphqlEndpoint, + cache: new InMemoryCache(), + }); + +type props = { + signerAddress: string; + currentOption: string; + currentChainId: number; + ethCallProvider: Provider | undefined; +}; + +const SummaryOptions = ({ + signerAddress, + currentOption, + currentChainId, + ethCallProvider, +}: props) => { + const apolloClient = clientOracle(getGraphqlEndPoint(currentChainId)); + const [balances, loadingBalances] = useBalances(currentChainId, ethCallProvider, signerAddress); + const [prices, loadingPrices] = usePrices2(currentChainId, ethCallProvider); + + return ( + + {loadingBalances || loadingPrices ? ( +
+ +
+ ) : ( + <> + {currentOption === "0" && signerAddress !== "" && ( + + )} + {currentOption === "1" && ( + + )} + {currentOption === "2" && ( + + )} + + )} +
+ ); +}; + +export default SummaryOptions; diff --git a/src/components/Summary/index.tsx b/src/components/Summary/index.tsx index 0e6b682..0b2d76c 100644 --- a/src/components/Summary/index.tsx +++ b/src/components/Summary/index.tsx @@ -1,25 +1,145 @@ import React, { useContext, useEffect, useState } from "react"; // import { Spinner } from "react-bootstrap/esm/"; +import { Contract } from "ethers-multicall"; import "../../styles/summary.scss"; -import { signerContext } from "../../state"; +import cryptexJson from "../../contracts/cryptex.json"; +import UniV2Pair from "../../contracts/UniswapV2Pair.json"; +import { arbitrumContext, ethereumContext, optimismContext, signerContext } from "../../state"; +import { useArbitrum, useEthereum, useOptimism } from "../../hooks"; import Features from "./Features"; import Summary from "./Summary"; import { NETWORKS } from "../../utils/constants"; const SummaryPage = () => { const signer = useContext(signerContext); + const arbitrum = useArbitrum(); + const ethereum = useEthereum(); + const optimism = useOptimism(); const [loading, setLoading] = useState(true); const [signerAddress, setSignerAddress] = useState(""); const [signerChainId, setSignerChainId] = useState( process.env.REACT_APP_NETWORK_ID === "1" ? NETWORKS.mainnet.chainId : NETWORKS.goerli.chainId ); + const setArbitrumContracts = () => { + let contracts; + if (process.env.REACT_APP_NETWORK_ID === "1") { + contracts = cryptexJson[42161].arbitrum.contracts; + } else { + contracts = cryptexJson[421613].arbitrum_goerli.contracts; + } + + const currentJpegzTokenRead = new Contract(contracts.JPEGZ.address, contracts.JPEGZ.abi); + arbitrum.setCurrentJpegzTokenRead(currentJpegzTokenRead); + const currentJpegzOracleRead = new Contract( + contracts.JPEGZOracle.address, + contracts.JPEGZOracle.abi + ); + arbitrum.setCurrentJpegzOracleRead(currentJpegzOracleRead); + const currentWethOracleRead = new Contract( + contracts.WETHOracle.address, + contracts.WETHOracle.abi + ); + arbitrum.setCurrentWethOracleRead(currentWethOracleRead); + const currentDaiOracleRead = new Contract(contracts.DAIOracle.address, contracts.DAIOracle.abi); + arbitrum.setCurrentDaiOracleRead(currentDaiOracleRead); + }; + + const setEthereumContracts = () => { + let contracts; + let ctxPoolAddress; + if (process.env.REACT_APP_NETWORK_ID === "1") { + contracts = cryptexJson[1].mainnet.contracts; + ctxPoolAddress = NETWORKS.mainnet.ctxPool; + } else { + contracts = cryptexJson[5].goerli.contracts; + } + + const currentTcapTokenRead = new Contract(contracts.TCAP.address, contracts.TCAP.abi); + ethereum.setCurrentTcapTokenRead(currentTcapTokenRead); + const currentCtxTokenRead = new Contract(contracts.Ctx.address, contracts.Ctx.abi); + ethereum.setCurrentCtxTokenRead(currentCtxTokenRead); + const currentTcapOracleRead = new Contract( + contracts.TCAPOracle.address, + contracts.TCAPOracle.abi + ); + ethereum.setCurrentTcapOracleRead(currentTcapOracleRead); + const currentWethOracleRead = new Contract( + contracts.WETHOracle.address, + contracts.WETHOracle.abi + ); + ethereum.setCurrentWethOracleRead(currentWethOracleRead); + const currentDaiOracleRead = new Contract(contracts.DAIOracle.address, contracts.DAIOracle.abi); + ethereum.setCurrentDaiOracleRead(currentDaiOracleRead); + const currentAaveOracleRead = new Contract( + contracts.AaveOracle.address, + contracts.AaveOracle.abi + ); + ethereum.setCurrentAaveOracleRead(currentAaveOracleRead); + const currentLinkOracleRead = new Contract( + contracts.LinkOracle.address, + contracts.LinkOracle.abi + ); + ethereum.setCurrentLinkOracleRead(currentLinkOracleRead); + const currentWbtcOracleRead = new Contract( + contracts.WBTCOracle.address, + contracts.WBTCOracle.abi + ); + ethereum.setCurrentWbtcOracleRead(currentWbtcOracleRead); + const currentUsdcOracleRead = new Contract( + contracts.USDCOracle.address, + contracts.USDCOracle.abi + ); + ethereum.setCurrentUsdcOracleRead(currentUsdcOracleRead); + + if (ctxPoolAddress) { + const currentCTXPoolTokenRead = new Contract(ctxPoolAddress, UniV2Pair.abi); + ethereum.setCurrentCtxPoolTokenRead(currentCTXPoolTokenRead); + } + }; + + const setOptimismContracts = () => { + let contracts; + if (process.env.REACT_APP_NETWORK_ID === "1") { + contracts = cryptexJson[10].optimism.contracts; + } else { + contracts = cryptexJson[69].okovan.contracts; + } + + const currentTcapTokenRead = new Contract(contracts.TCAP.address, contracts.TCAP.abi); + optimism.setCurrentTcapTokenRead(currentTcapTokenRead); + const currentTcapOracleRead = new Contract( + contracts.TCAPOracle.address, + contracts.TCAPOracle.abi + ); + optimism.setCurrentTcapOracleRead(currentTcapOracleRead); + const currentWethOracleRead = new Contract( + contracts.WETHOracle.address, + contracts.WETHOracle.abi + ); + optimism.setCurrentWethOracleRead(currentWethOracleRead); + const currentDaiOracleRead = new Contract(contracts.DAIOracle.address, contracts.DAIOracle.abi); + optimism.setCurrentDaiOracleRead(currentDaiOracleRead); + const currentLinkOracleRead = new Contract( + contracts.LinkOracle.address, + contracts.LinkOracle.abi + ); + optimism.setCurrentLinkOracleRead(currentLinkOracleRead); + const currentSnxOracleRead = new Contract(contracts.SNXOracle.address, contracts.SNXOracle.abi); + optimism.setCurrentSnxOracleRead(currentSnxOracleRead); + const currentUniOracleRead = new Contract(contracts.UNIOracle.address, contracts.UNIOracle.abi); + optimism.setCurrentUniOracleRead(currentUniOracleRead); + }; + useEffect(() => { const load = async () => { if (signer.signer) { setSignerAddress(await signer.signer.getAddress()); setSignerChainId(await signer.signer.getChainId()); } + setArbitrumContracts(); + setEthereumContracts(); + setOptimismContracts(); setLoading(false); }; load(); @@ -29,7 +149,15 @@ const SummaryPage = () => { return (
- {!loading && } + {!loading && ( + + + + + + + + )}
); }; diff --git a/src/components/Summary/warnings/VaultsWarning.tsx b/src/components/Summary/warnings/VaultsWarning.tsx index 955d89d..b6d7f0d 100644 --- a/src/components/Summary/warnings/VaultsWarning.tsx +++ b/src/components/Summary/warnings/VaultsWarning.tsx @@ -2,22 +2,20 @@ import React, { useState } from "react"; import { Button, Spinner } from "react-bootstrap/esm/"; import { FaArrowRight } from "react-icons/fa"; import { ethers } from "ethers"; -import { Provider } from "ethers-multicall"; import { useHistory } from "react-router-dom"; import { useQuery, gql } from "@apollo/client"; -import { usePrices2, useRatios } from "../../../hooks"; +import { useRatios } from "../../../hooks"; +import { OraclePricesType } from "../../../hooks/types"; import { getCollateralPrice, getMinRatio } from "../../Vaults/common"; import { getRatio2, isUndefined } from "../../../utils/utils"; type props = { - chainId: number; - ethCallProvider: Provider | undefined; ownerAddress: string; + prices: OraclePricesType; }; -export const VaultsWarning = ({ chainId, ethCallProvider, ownerAddress }: props) => { +export const VaultsWarning = ({ ownerAddress, prices }: props) => { const history = useHistory(); - const prices = usePrices2(chainId, ethCallProvider); const ratios = useRatios(); const [loadingVaults, setLoadingVaults] = useState(false); const [liquidableVaults, setLiquidableVaults] = useState(0); diff --git a/src/components/Vaults/monitoring/Liquidate.tsx b/src/components/Vaults/monitoring/Liquidate.tsx index 326534d..2649756 100644 --- a/src/components/Vaults/monitoring/Liquidate.tsx +++ b/src/components/Vaults/monitoring/Liquidate.tsx @@ -12,6 +12,7 @@ import "../../../styles/modal.scss"; import { networkContext, oraclesContext, signerContext } from "../../../state"; import { VaultsType } from "../types"; import { useVault } from "../../../hooks"; +import { TOKENS_SYMBOLS } from "../../../utils/constants"; import { errorNotification, isPolygon, @@ -33,15 +34,17 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); const oracles = useContext(oraclesContext); - const { - currentVault, - currentAssetRead, - currentVaultRead, - currentCollateralOracleRead, - currentAssetOracleRead, - } = useVault( + const [ + { + currentVault, + currentAssetRead, + currentVaultRead, + currentCollateralOracleRead, + currentAssetOracleRead, + }, + ] = useVault( "TCAP", - liqVault ? liqVault?.collateralSymbol : "WETH", + liqVault ? liqVault?.collateralSymbol : TOKENS_SYMBOLS.WETH, liqVault ? liqVault.isHardVault : true ); diff --git a/src/components/Vaults/monitoring/Vaults.tsx b/src/components/Vaults/monitoring/Vaults.tsx index 0e8a180..0f7eb68 100644 --- a/src/components/Vaults/monitoring/Vaults.tsx +++ b/src/components/Vaults/monitoring/Vaults.tsx @@ -1,10 +1,11 @@ import React, { useContext, useState } from "react"; -import Button from "react-bootstrap/esm/Button"; +import { Button, Image } from "react-bootstrap/esm"; import Table from "react-bootstrap/Table"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; import { ethers } from "ethers"; import { useTranslation } from "react-i18next"; +import jpegzIcon from "../../../assets/images/jpegz-coin.png"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; import { ReactComponent as SortIcon } from "../../../assets/images/sort.svg"; import { ReactComponent as SortUpIcon } from "../../../assets/images/sort-up.svg"; @@ -201,6 +202,13 @@ export const Vaults = ({ setVaultToUpdate(initData); }; + const IndexIcon = () => { + if (!isArbitrum(currentNetwork.chainId)) { + return ; + } + return JPEGz icon; + }; + return ( <> @@ -242,7 +250,7 @@ export const Vaults = ({ +

Use Cryptex For

@@ -75,7 +75,7 @@ const Features = () => {
- +
); }; diff --git a/src/components/Summary/Summary.tsx b/src/components/Summary/Summary.tsx index 49f2eae..914198b 100644 --- a/src/components/Summary/Summary.tsx +++ b/src/components/Summary/Summary.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from "react"; import { ethers } from "ethers"; import { Provider } from "ethers-multicall"; -import { Card, Col, Dropdown } from "react-bootstrap/esm"; +import { Card, Dropdown } from "react-bootstrap/esm"; import "../../styles/summary.scss"; import SummaryOptions from "./SummaryOptions"; import { NETWORKS } from "../../utils/constants"; @@ -95,52 +95,50 @@ const Summary = ({ signerAddress, signerChainId }: props) => { }; return ( - - - - handleOptionChange(eventKey || "0")}> - -
{currentOption.name}
-
- - {signerAddress !== "" && ( - - {options[0].name} - - )} - - {options[1].name} + + + handleOptionChange(eventKey || "0")}> + +
{currentOption.name}
+
+ + {signerAddress !== "" && ( + + {options[0].name} - - {options[2].name} + )} + + {options[1].name} + + + {options[2].name} + + +
+ handleChainChange(eventKey || "1")}> + +
{currentChain.name}
+
+ + {chains.map((item) => ( + + {item.name} - -
- handleChainChange(eventKey || "1")}> - -
{currentChain.name}
-
- - {chains.map((item) => ( - - {item.name} - - ))} - -
-
- - {!updatingChain && ( - - )} - -
- + ))} +
+
+
+ + {!updatingChain && ( + + )} + +
); }; diff --git a/src/components/Warnings/VaultsWarning.tsx b/src/components/Warnings/VaultsWarning.tsx index 35f2618..bc591d9 100644 --- a/src/components/Warnings/VaultsWarning.tsx +++ b/src/components/Warnings/VaultsWarning.tsx @@ -10,7 +10,7 @@ const VaultsWarning = () => { return ( <> - {showWarning && location.pathname === "/vault" && ( + {showWarning && location.pathname === "/vaults" && ( { setShowWarning(false); diff --git a/src/styles/app.scss b/src/styles/app.scss index 818308e..1a83970 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -633,6 +633,7 @@ form { @media (max-width: 600px) { .wrapper { padding-left: 0rem; + padding-right: 0rem; } .alert { margin-top: 4rem; diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 07b0990..ddf8a70 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -62,7 +62,7 @@ .card-wrapper { margin-top: 2rem; - + margin-left: 1rem; h2 { font-size: 1.375rem; margin-bottom: 1.5625rem; diff --git a/src/styles/summary.scss b/src/styles/summary.scss index 8308a89..e20fe66 100644 --- a/src/styles/summary.scss +++ b/src/styles/summary.scss @@ -8,7 +8,6 @@ margin-top: 2rem; padding: 3rem 2rem; padding-bottom: 2rem; - display: flex; .jpegz-icon { width: 2.1rem; @@ -109,6 +108,8 @@ } .features { + flex: 1; + margin-right: 1rem; &-title { margin-bottom: 2rem; } @@ -144,6 +145,8 @@ } .summary { + flex: 1; + margin-left: 1rem; height: 100%; width: 100%; padding-left: 1rem; @@ -285,15 +288,42 @@ } } + @media (max-width: 1024px) { + display: flex; + flex-direction: column; + + .features { + margin-bottom: 2rem; + margin-right: 0rem; + } + .summary { + margin-left: 0rem; + } + } + @media (max-width: 600px) { - padding: 3rem 0.5rem; + padding: 3rem 1rem; .card { - padding: 1.5rem 0.5rem; + padding: 1.5rem 0rem; margin-bottom: 3rem; + + &-header { + display: flex; + flex-direction: column; + .dropdown { + margin-bottom: 0.7rem; + .btn { + h6 { + font-size: 0.9rem; + } + } + } + } } .features { + margin-bottom: 1rem; .btn-feature { padding: 0rem 1rem; } @@ -313,15 +343,27 @@ .protocol, .indexes, - .balance { + .balance-container { .detail { - display: grid; - grid-template-columns: 100%; + display: flex; + flex-direction: column; + + h6 { + font-size: 0.85rem; + } } + } - .market-cap { - grid-column-start: 1; - grid-column-end: 2; + .balance-container { + .value { + display: flex; + flex-direction: column; + .number { + margin-bottom: 0.5rem !important; + } + } + .value-separator { + display: none; } } } diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx index bc73fd0..eb32f6c 100644 --- a/src/utils/univ3.tsx +++ b/src/utils/univ3.tsx @@ -25,7 +25,7 @@ export const UNIV3 = { ], }, }, - rinkeby: { + goerli: { tcapPool: { id: "0xfb7BDD5B703f57BC7807b9D731503050EdC8c722", feeTier: 3000, From 297aa89a899ea42c5686198b60dfd6ed01143e4e Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sat, 14 Jan 2023 13:26:34 -0600 Subject: [PATCH 214/278] vaults mobile support --- src/components/Vaults/vault/index.tsx | 56 ++++++++----- src/styles/vault-monitoring.scss | 2 +- src/styles/vault.scss | 115 +++++++++++++++++++++++++- 3 files changed, 150 insertions(+), 23 deletions(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 927b123..ee379a0 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -840,7 +840,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ); const AddCollateral = () => ( - + { ); const RemoveCollateral = () => ( - + { ); const MintAsset = () => ( - + { ); + const BurnFeeLabel = (className: string) => ( + + <> + {t("vault.debt.fee")}: {burnFee} {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} + + + } + > +
+ + <>{t("vault.debt.fee")}: + + {" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} +
+
+ ); + const BurnAsset = () => ( - + { decimalScale={2} /> + {BurnFeeLabel("burn-fee2")} ); @@ -1193,7 +1223,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ); return ( -
+
@@ -1283,21 +1313,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => {
- {activeAction === actions[3] && ( -
- - <>{t("vault.debt.fee")}: - - {" "} - {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} -
- )} + {activeAction === actions[3] && BurnFeeLabel("burn-fee")}
{ActionControls()}
diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 39cf1db..cca8856 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -437,7 +437,7 @@ } } - @media (max-width: 800px) { + @media (max-width: 1200px) { .row { display: flex; margin-top: 1rem; diff --git a/src/styles/vault.scss b/src/styles/vault.scss index 91b68ba..096ecac 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -6,7 +6,7 @@ background-color: black; } -.vault2 { +.vault { display: flex; flex-direction: column; align-items: center; @@ -89,6 +89,12 @@ padding-left: 1rem; } + .form-group { + .burn-fee2 { + display: none; + } + } + .input-group { background-color: #281e31; border: 1px solid $dark; @@ -110,7 +116,7 @@ height: 4.1rem; border-top-right-radius: 5px; border-bottom-right-radius: 5px; - } + } } .burn-fee.text-muted { @@ -263,6 +269,9 @@ padding: 0rem 0.3rem; } } + .burn-fee:hover { + cursor: pointer; + } } .dropdown { @@ -572,4 +581,106 @@ width: 43%; } } + + @media (max-width: 1200px) { + .vault-container { + width: 55%; + } + } + + @media (max-width: 1000px) { + .vault-container { + width: 80%; + } + } + + @media (max-width: 600px) { + margin-left: 0rem; + + .vault { + &-container { + width: 95%; + margin-bottom: 6rem; + } + &-header { + padding: 2rem 1rem 1.5rem 0.5rem; + } + + &-actions { + .dropdown { + width: 170px; + } + .actions-options { + .burn-fee { + display: none; + } + } + } + + &-assets { + &-box { + padding: 2rem 0.5rem; + + .assets-box-options { + display: flex; + flex-direction: column; + } + + .asset-box.right { + margin-top: 1.5rem; + align-items: flex-start; + } + } + .vault-ratio { + .title { + width: 30%; + } + + .values { + width: 70%; + + .number { + font-size: 0.85rem; + } + } + } + } + + &-controls { + .form-group { + display: flex; + flex-direction: column; + + .burn-fee2 { + display: flex; + justify-content: flex-end; + margin-top: 0.5rem; + margin-right: 0.5rem; + + span { + color: $off-white; + font-size: 0.85rem; + } + + .number { + color: $white; + padding: 0rem 0.3rem; + } + } + .burn-fee2:hover { + cursor: pointer; + } + } + .input-group { + .btn { + width: 6.2rem; + font-size: 0.9rem; + } + } + .text-muted { + position: relative; + } + } + } + } } From c55a147a374c779ab38594d5a5311b745015f5b2 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 17 Jan 2023 19:23:10 -0600 Subject: [PATCH 215/278] added okx wallet --- package.json | 2 +- src/state/Web3ModalContext.tsx | 37 ++++++++++++++-------------------- yarn.lock | 8 ++++---- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/package.json b/package.json index 86a91bd..e0d03b9 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "typescript": "4.0.5", "walletlink": "^2.4.2", "web-vitals": "^0.2.4", - "web3modal": "^1.9.5" + "web3modal": "^1.9.8" }, "devDependencies": { "@babel/core": "7.12.3", diff --git a/src/state/Web3ModalContext.tsx b/src/state/Web3ModalContext.tsx index 0d85a11..5041780 100644 --- a/src/state/Web3ModalContext.tsx +++ b/src/state/Web3ModalContext.tsx @@ -1,12 +1,9 @@ import React from "react"; import Web3Modal from "web3modal"; -import Portis from "@portis/web3"; import WalletConnectProvider from "@walletconnect/web3-provider"; -import Authereum from "authereum"; import WalletLink from "walletlink"; -import Fortmatic from "fortmatic"; -import { NETWORKS } from "../utils/constants"; +import okxImage from "../assets/images/okx.png"; let network = "mainnet"; @@ -17,6 +14,9 @@ switch (process.env.REACT_APP_NETWORK_ID) { case "3": network = "ropsten"; break; + case "4": + network = "rinkeby"; + break; case "5": network = "goerli"; break; @@ -44,27 +44,20 @@ const providerOptions = { infuraId: process.env.REACT_APP_INFURA_ID, // required }, }, - fortmatic: { - package: Fortmatic, - options: { - key: process.env.REACT_APP_FORTMATIC_KEY, - network: { - chainId: process.env.REACT_APP_NETWORK_ID, - rpcUrl: - process.env.REACT_APP_NETWORK_ID === "1" - ? NETWORKS.mainnet.infuraFortmaticRpcUrl - : NETWORKS.goerli.infuraFortmaticRpcUrl, - }, // if we don't pass it, it will default to localhost:8454 + burnerconnect: { + display: { + logo: okxImage, + name: "OKX", + description: "Scan with OKX mobile app to connect", }, - }, - portis: { - package: Portis, // required + package: WalletConnectProvider, // required options: { - id: process.env.REACT_APP_PORTIS_ID, + infuraId: process.env.REACT_APP_INFURA_ID, // required }, - }, - authereum: { - package: Authereum, // required + // connector: async (ProviderPackage: new (arg0: any) => any, options: any) => { + // const provider = WalletConnectProvider; + // return provider; + // } }, }; diff --git a/yarn.lock b/yarn.lock index 2e5be88..59d2f4a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15842,10 +15842,10 @@ web3-utils@^1.3.4: randombytes "^2.1.0" utf8 "3.0.0" -web3modal@^1.9.5: - version "1.9.10" - resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.10.tgz#ab7836ff27c6a16b9ca881ba0e8008bd33cb0dff" - integrity sha512-gRByp+toRiADwkJLLGRXsnIVbLS1aJB71sJyryS6C7cF6jJ3cRN1LbPYEMObMyJkyjOZonx0CNZVAYGiD099aA== +web3modal@^1.9.8: + version "1.9.11" + resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.11.tgz#6a2c3c66f2e183c21446a441a217f996b38a82b6" + integrity sha512-fJ8HAHKxS05DlyZIV1oFbA7cT+E2/keyN1E4Yuhb023qGQIXlnht2DtTH978DERYnAnX28wZchwnwpSUnTTmhg== dependencies: detect-browser "^5.1.0" prop-types "^15.7.2" From 6d95d0f207e45105399cee149c4c87648770248d Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 19 Jan 2023 09:40:22 -0600 Subject: [PATCH 216/278] added mint fee for jpegz --- public/locales/en/translation.json | 2 +- src/assets/images/okx.png | Bin 0 -> 4514 bytes src/components/Header.tsx | 34 +---- src/components/Summary/Balance.tsx | 28 ++-- src/components/Summary/Indexes.tsx | 2 +- src/components/Summary/Protocol.tsx | 18 +-- src/components/Vaults/common.tsx | 81 +++++----- src/components/Vaults/monitoring/Vaults.tsx | 10 +- src/components/Vaults/monitoring/index.tsx | 10 +- src/components/Vaults/vault/index.tsx | 156 +++++++++++++------- src/contracts/cryptex.json | 89 +++++++++-- src/styles/summary.scss | 11 +- src/styles/vault-monitoring.scss | 31 ++-- src/styles/vault.scss | 6 +- src/utils/constants.tsx | 6 +- 15 files changed, 300 insertions(+), 184 deletions(-) create mode 100644 src/assets/images/okx.png diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index f7be31c..b32903a 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -53,7 +53,7 @@ "unstaked": "Unstaked", "update": "Update", "vault-warning": "⚠️ Make sure to always have a ratio above the minimum ratio to avoid getting liquidated.", - "vaults": "Vauts", + "vaults": "Vaults", "view": "View", "votes": "Votes", "wait": "Please wait", diff --git a/src/assets/images/okx.png b/src/assets/images/okx.png new file mode 100644 index 0000000000000000000000000000000000000000..f57c063aa43a54eb43971b781c7b94777fdc9d29 GIT binary patch literal 4514 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 XYpHtvFt$nd$Aq)Jt6hOj(0Bg^mkc2B literal 0 HcmV?d00001 diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 82833bf..923bc3c 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -6,10 +6,8 @@ import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; import { useTranslation } from "react-i18next"; import "../styles/header.scss"; -import { ethers } from "ethers"; import Davatar from "@davatar/react"; -import NumberFormat from "react-number-format"; -import { networkContext, signerContext, tokensContext, Web3ModalContext } from "../state"; +import { networkContext, signerContext, Web3ModalContext } from "../state"; import { makeShortAddress, getENS, @@ -19,7 +17,6 @@ import { isArbitrum, } from "../utils/utils"; import { NETWORKS, FEATURES } from "../utils/constants"; -import { ReactComponent as TcapIcon } from "../assets/images/tcap-coin.svg"; import { ReactComponent as ETHIcon } from "../assets/images/graph/weth.svg"; import { ReactComponent as OPTIMISMIcon } from "../assets/images/graph/optimism.svg"; import { ReactComponent as POLYGONIcon } from "../assets/images/polygon2.svg"; @@ -36,11 +33,9 @@ const Header = ({ signerAddress, isMobile }: props) => { const { t } = useTranslation(); const web3Modal = useContext(Web3ModalContext); const signer = useContext(signerContext); - const tokens = useContext(tokensContext); const currentNetwork = useContext(networkContext); const [address, setAddress] = useState("0x0000000000000000000000000000000000000000"); const [addressField, setAddressField] = useState(""); - const [tokenBalance, setTokenBalance] = useState("0.0"); // const [language, setLanguage] = useState("EN"); const [loading, setLoading] = useState(false); @@ -142,28 +137,14 @@ const Header = ({ signerAddress, isMobile }: props) => { useEffect(() => { const loadAddress = async () => { setLoading(true); - if (signerAddress !== "" && signer.signer && tokens.tcapToken) { - const filterMint = tokens.tcapToken.filters.Transfer(null, signerAddress); - const filterBurn = tokens.tcapToken.filters.Transfer(signerAddress, null); - tokens.tcapToken.on(filterMint, async () => { - const currentBalance = await tokens.tcapToken?.balanceOf(signerAddress); - setTokenBalance(ethers.utils.formatEther(currentBalance)); - }); - - tokens.tcapToken.on(filterBurn, async () => { - const currentBalance = await tokens.tcapToken?.balanceOf(signerAddress); - setTokenBalance(ethers.utils.formatEther(currentBalance)); - }); + if (signerAddress !== "" && signer.signer) { const ens = await getENS(signerAddress); if (ens) { setAddressField(ens); } else { setAddressField(makeShortAddress(signerAddress)); } - setAddress(signerAddress); - const currentTcapBalance = await tokens.tcapToken.balanceOf(signerAddress); - setTokenBalance(ethers.utils.formatEther(currentTcapBalance)); setLoading(false); } /* let lng = localStorage.getItem("language"); @@ -304,17 +285,6 @@ const Header = ({ signerAddress, isMobile }: props) => {
)}
- -
- -
{ // const { t } = useTranslation(); - const currentIndexName = isArbitrum(currentChainId) ? "JPEGz" : "TCAP"; + const currentIndexName = isArbitrum(currentChainId) ? TOKENS_SYMBOLS.JPEGz : TOKENS_SYMBOLS.TCAP; const ethereumContracts = useContext(ethereumContext); const [loading, setLoading] = useState(true); const [indexBalance, setIndexBalance] = useState("0.0"); const [ctxBalance, setCtxBalance] = useState("0.0"); const [indexUsdBalance, setIndexUsdBalance] = useState("0.0"); const [ctxUsdBalance, setCtxUsdBalance] = useState("0.0"); + const [indexPrice, setIndexPrice] = useState("0.0"); + const [ctxPrice, setCtxPrice] = useState("0.0"); const loadData = async () => { if (ethCallProvider) { - console.log("Entra: "); let currentPriceCTX = 0; if (signerAddress === "" || currentChainId === NETWORKS.mainnet.chainId) { const reservesCtxPoolCall = await ethereumContracts.ctxPoolTokenRead?.getReserves(); @@ -49,9 +50,11 @@ const Balance = ({ currentChainId, ethCallProvider, signerAddress, balances, pri if (isArbitrum(currentChainId)) { indexUSD = parseFloat(balances.jpegzBalance) * parseFloat(prices.jpegzOraclePrice); setIndexBalance(balances.jpegzBalance); + setIndexPrice(prices.jpegzOraclePrice); } else { indexUSD = parseFloat(balances.tcapBalance) * parseFloat(prices.tcapOraclePrice); setIndexBalance(balances.tcapBalance); + setIndexPrice(prices.tcapOraclePrice); } if (indexUSD < 0.0001) { setIndexUsdBalance("0.0"); @@ -63,6 +66,7 @@ const Balance = ({ currentChainId, ethCallProvider, signerAddress, balances, pri setCtxBalance(balances.ctxBalance); const ctxUSD = parseFloat(balances.ctxBalance) * currentPriceCTX; setCtxUsdBalance(ctxUSD.toString()); + setCtxPrice(currentPriceCTX.toFixed(8)); } } }; @@ -120,13 +124,13 @@ const Balance = ({ currentChainId, ethCallProvider, signerAddress, balances, pri
- {/*
+
-
{currentIndexName} USD Balance
+
{currentIndexName} Oracle Price
-
*/} +
{isInLayer1(currentChainId) && ( <>
@@ -144,7 +148,7 @@ const Balance = ({ currentChainId, ethCallProvider, signerAddress, balances, pri <>{t("welcome.ctx-balance")} */}
-
+
- {/*
+
-
CTX USD Balance
+
CTX Price
-
*/} +
)} diff --git a/src/components/Summary/Indexes.tsx b/src/components/Summary/Indexes.tsx index 208ecc5..a00720a 100644 --- a/src/components/Summary/Indexes.tsx +++ b/src/components/Summary/Indexes.tsx @@ -90,7 +90,7 @@ const Indexes = ({ currentChainId, ethCallProvider, balances, prices }: props) =
<>{t("welcome.tcap")}
-
+
{
<>{t("welcome.summary.staked-usd")}
-
+
{
<>{t("welcome.summary.staked-eth")}
-
+
{
<>{t("welcome.summary.staked-dai")}
-
+
{
<>{t("welcome.summary.staked-aave")}
-
+
{
<>{t("welcome.summary.staked-link")}
-
+
{

<>{t("welcome.summary.staked-uni")}

-
+
{
<>{t("welcome.summary.staked-matic")}
-
+
{
<>{t("welcome.summary.staked-wbtc")}
-
+
{
<>{t("welcome.summary.staked-usdc")}
-
+
str.charAt(0).toUpperCase() + str.slice(1); export const TokenIcon = ({ name }: iconProps) => { - switch (name.toLowerCase()) { - case "eth": - return ; - case "weth": - return ; - case "dai": - return ; - case "aave": + switch (name.toUpperCase()) { + case TOKENS_SYMBOLS.AAVE: return ; - case "link": + case TOKENS_SYMBOLS.DAI: + return ; + case TOKENS_SYMBOLS.ETH: + return ; + case TOKENS_SYMBOLS.JPEGz.toUpperCase(): + return ; + case TOKENS_SYMBOLS.LINK: return ; - case "uni": - return ; - case "snx": - return ; - case "matic": + case TOKENS_SYMBOLS.MATIC: return ; - case "wbtc": - return ; - case "tcap": + case TOKENS_SYMBOLS.SNX: + return ; + case TOKENS_SYMBOLS.TCAP: return ; - case "usdc": + case TOKENS_SYMBOLS.UNI: + return ; + case TOKENS_SYMBOLS.USDC: return ; + case TOKENS_SYMBOLS.WBTC: + return ; + case TOKENS_SYMBOLS.WETH: + return ; default: return <>; } }; export const TokenIconSmall = ({ name }: iconProps) => { - switch (name.toLowerCase()) { - case "eth": - return ; - case "weth": - return ; - case "dai": - return ; - case "aave": + switch (name.toUpperCase()) { + case TOKENS_SYMBOLS.AAVE: return ; - case "link": + case TOKENS_SYMBOLS.DAI: + return ; + case TOKENS_SYMBOLS.ETH: + return ; + case TOKENS_SYMBOLS.JPEGz.toUpperCase(): + return ; + case TOKENS_SYMBOLS.LINK: return ; - case "uni": - return ; - case "snx": - return ; - case "matic": + case TOKENS_SYMBOLS.MATIC: return ; - case "wbtc": - return ; - case "tcap": + case TOKENS_SYMBOLS.SNX: + return ; + case TOKENS_SYMBOLS.TCAP: return ; - case "usdc": + case TOKENS_SYMBOLS.UNI: + return ; + case TOKENS_SYMBOLS.USDC: return ; + case TOKENS_SYMBOLS.WBTC: + return ; + case TOKENS_SYMBOLS.WETH: + return ; default: return <>; } diff --git a/src/components/Vaults/monitoring/Vaults.tsx b/src/components/Vaults/monitoring/Vaults.tsx index 0f7eb68..080cbe4 100644 --- a/src/components/Vaults/monitoring/Vaults.tsx +++ b/src/components/Vaults/monitoring/Vaults.tsx @@ -1,12 +1,10 @@ import React, { useContext, useState } from "react"; -import { Button, Image } from "react-bootstrap/esm"; +import { Button } from "react-bootstrap/esm"; import Table from "react-bootstrap/Table"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; import { ethers } from "ethers"; import { useTranslation } from "react-i18next"; -import jpegzIcon from "../../../assets/images/jpegz-coin.png"; -import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; import { ReactComponent as SortIcon } from "../../../assets/images/sort.svg"; import { ReactComponent as SortUpIcon } from "../../../assets/images/sort-up.svg"; import { ReactComponent as SortDownIcon } from "../../../assets/images/sort-down.svg"; @@ -204,9 +202,9 @@ export const Vaults = ({ const IndexIcon = () => { if (!isArbitrum(currentNetwork.chainId)) { - return ; + return ; } - return ; + return ; }; return ( @@ -250,7 +248,6 @@ export const Vaults = ({
- {currentStatus === "liquidation" && ( + {currentStatus === VAULT_STATUS.liquidation && ( - -
- <>{t("vaults")} -
- {vaultsTotals.vaults} - - -
- <>{t("collateral")} (USD) -
- - ${numberFormatStr(vaultsTotals.collateralUSD, 2, 2)} - - - -
-
- <>{t("debt")} -
- -
- {numberFormatStr(vaultsTotals.debt, 4, 4)} - - + + + +
+ <>{t("totals")} +
+
+ +
+ +
+ <>{t("vaults")} +
+ {vaultsTotals.vaults} + + +
+ <>{t("collateral")} (USD) +
+ ${numberFormatStr(vaultsTotals.collateralUSD, 2, 2)} + + +
- <>{t("debt")} (USD) + <>{t("debt")}
- ${numberFormatStr(vaultsTotals.debtUSD, 2, 2)} - - - - - - -
-
-
-
- <>{t("view")}: -
- handleItemsViewChange(eventKey || "15")}> - -
- {pagination.itemsPerPage} -
-
- - {viewsList.map((item) => ( - - {item.name} - - ))} - -
-
-
-
-
-
- <>{t("collateral")} -
- handleTokenChange(eventKey || "ALL")} - > - -
- - {tokenSymbol.toUpperCase()} -
-
- - {tokensSymbols().map((item) => ( - - {item.name} - - ))} - -
-
-
-
Status
- handleStatusChange(eventKey || "ALL")}> - -
- {capitalize(currentStatus)} -
-
- - {statusList.map((item) => ( - - {item.name} - - ))} - -
-
- {isInLayer1(currentNetwork.chainId) && ( -
-
- <>{t("mode")} -
- handleModeChange(eventKey || "ALL")} - > - -
- {capitalize(vaultMode)} -
-
- - {modeList.map((item) => ( - - {item.name} - - ))} - -
-
- )} -
-
Ratio Range
- - -
- - {currentMinRatio} {currentMaxRatio} - -
-
- -
- - - -
- -
-
-
-
-
Vaults
- handleVaultOwnerFilterChange(eventKey || "1")} - > - -
- {capitalize(currentOwnerFilter.name)} -
-
- - - {vaultsOwnerFilter[0].name} - - - {vaultsOwnerFilter[1].name} - - -
-
-
- -
+
+ {numberFormatStr(vaultsTotals.debt, 4, 4)} - {loading || filteringRatios ? ( - - ) : ( - ) => setVaultList(v)} - currentStatus={currentStatus} - pagination={pagination} - refresh={updateLiquidatedVault} - setVaultToUpdate={setVaultToUpdate} - myVaults={currentOwnerFilter.value === "1"} - /> - )} - - {pagination.pages > 0 && !loading && ( - - )} + +
+ <>{t("debt")} (USD) +
+ ${numberFormatStr(vaultsTotals.debtUSD, 2, 2)} - - - - + + + + + {!isMobile ? ( + + + + + + {loading || filteringRatios ? ( + + ) : ( + ) => setVaultList(v)} + currentStatus={currentStatus} + pagination={pagination} + refresh={updateLiquidatedVault} + setVaultToUpdate={setVaultToUpdate} + myVaults={currentOwnerFilter.value === "1"} + /> + )} + + {pagination.pages > 0 && !loading && ( + + )} + + + + ) : ( + <> + + + +
Filters
+
+ + + +
+
+ {loading || filteringRatios ? ( + + ) : ( + ) => setVaultList(v)} + currentStatus={currentStatus} + pagination={pagination} + refresh={updateLiquidatedVault} + setVaultToUpdate={setVaultToUpdate} + myVaults={currentOwnerFilter.value === "1"} + /> + )} + + )} ); }; diff --git a/src/components/Vaults/types.tsx b/src/components/Vaults/types.tsx index 40fbcf1..5baea18 100644 --- a/src/components/Vaults/types.tsx +++ b/src/components/Vaults/types.tsx @@ -1,3 +1,5 @@ +import { ethers } from "ethers"; + export type PaginationType = { previous: number; current: number; @@ -9,6 +11,23 @@ export type PaginationType = { lastId: string; }; +export type VaultsPropsType = { + currentAddress: string; + vaults: Array; + setVaults: (v: Array) => void; + currentStatus: string; + pagination: PaginationType; + refresh: ( + index: number, + symbol: string, + vaultId: string, + collateral: ethers.BigNumberish, + debt: ethers.BigNumberish + ) => void; + setVaultToUpdate: (initData: VaultToUpdateType) => void; + myVaults: boolean; +}; + export type VaultsRatioType = { ethRatio: number; wethRatio: number; diff --git a/src/styles/app.scss b/src/styles/app.scss index 6d7c137..dcf1aa2 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -348,25 +348,39 @@ textarea.neon-green:focus { color: $white; } -.card { +.card, .accordion { background-color: $darker; +} +.accordion { + border-radius: 5px; - /* &.box-empty { - box-shadow: 0 0 10px 1px #f28040; + &-header { + margin-bottom: 0rem; } - &.box-ready { - box-shadow: 0 0 10px 1px #167226; + &-button { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + padding: 0px; + background-color: transparent; + border: none; } - &.box-active { - box-shadow: 0 0 10px 1px #e440f2; + &-button:after { + content: ""; + color: $white; + border-top: .3em solid; + border-right: .25em solid transparent; + border-bottom: 0; + border-left: .25em solid transparent; + margin-top: -5px; } - &.box-liquidation { - box-shadow: 0 0 10px 1px #c33; + .accordion-button:not(.collapsed):after { + border-top: 0; + border-bottom: .3em solid; } - &.box-liquidated { - box-shadow: 0 0 4px #7940f2, 0 0 1px #fcdf49, 0 0 2px #f28040, 0 0px 4px #c33; - } */ } + .custom-file { label { background: no-repeat; @@ -652,7 +666,7 @@ form { } } -.card { +.card, .accordion { &-header { background-color: transparent; } diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 76735b3..c2ac98f 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -28,6 +28,7 @@ span { } .vault-monitoring { + margin-top: 2rem; margin-left: 1.5rem; padding: 1rem 2rem; @@ -35,12 +36,7 @@ span { background-color: transparent; } - .row { - display: block; - margin-top: 2rem; - } - - .card { + .card, .accordion { padding: 1.5rem 2.8125rem; width: 100%; @media (max-width: 1400px) { @@ -383,26 +379,9 @@ span { background-color: $neon-highlight; } } - } - .no-vaults-box { - display: flex; - justify-content: center; - width: 100%; - padding-top: 2rem; - padding-bottom: 1rem; - - p { - font-size: 1.2rem; - } - .btn-create-vault { - border: none; - padding-top: 0rem; - padding-bottom: 0.25rem; - color: $highlight; - } - } + } } - .card.totals { + .accordion.totals { .totals-container { display: flex; flex-direction: row; @@ -451,6 +430,25 @@ span { } } + .no-vaults-box { + display: flex; + justify-content: center; + width: 100%; + padding-top: 2rem; + padding-bottom: 1rem; + + p { + font-size: 1.2rem; + } + + .btn-create-vault { + border: none; + padding-top: 0rem; + padding-bottom: 0.25rem; + color: $highlight; + } + } + @media (max-width: 1200px) { .row { display: flex; @@ -462,121 +460,196 @@ span { } } } -} -.vaults-mobile { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin: 2rem 0rem; - padding: 1rem; - .status { - font-size: 1.2rem; - } - .vault { - width: 100%; - background-color: $darker; - padding: 1rem 0.3rem; - margin: 1rem 0rem; - h5 { - font-size: 1rem; - margin-bottom: 0rem; - } - - svg, .tcap { - height: 30px; - margin-right: 10px; - } - .jpegz { - height: 30px; - width: 30px; + @media (min-width: 801px) { + .accordion { + &-button:after { + display: none; + } } + } - &-assets { - display: flex; - flex-direction: row; - justify-content: space-between; - .asset-box { - display: flex; + @media (max-width: 800px) { + margin-left: 0rem; + padding: 1rem; + + .accordion.totals { + .totals-container { flex-direction: column; - width: 100%; } - .asset { - display: flex; + .total-box { flex-direction: row; - align-items: center; - padding: 0.5rem; - margin-top: 0.5rem; - background-color: $darkest; - border-radius: 5px; - border: 1px solid $light; + justify-content: space-between; + margin: 0.7rem 0rem; + } + } + .accordion.actions { + margin-top: 1rem; + .accordion-body { + margin: 1rem 0rem; - &.index { - margin-right: 0.8rem; + .dd-container { + margin-bottom: 1.2rem; + .titles { + margin-bottom: 0.3rem; + } } - &.collateral { - margin-left: 0.8rem; + .btn-create-vault { + display: none; } } } - - &-values { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - margin: 1rem 0rem; - border: 0.5px solid $off-white; + .no-vaults-box { + padding: 2rem; + border: 1px solid $neon-highlight; border-radius: 5px; - .title { - display: flex; - align-items: center; - background-color: $darkest; - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; - padding-left: 0.6rem; - height: 3.5rem; - width: 40%; + .btn-create-vault { + padding-left: 0rem; } - .values { - display: flex; - flex-direction: column; - padding: 0.5rem; + } + } + + .vaults-mobile { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin: 2rem 0rem; + + .status { + font-size: 1.2rem; + } + + .card { + &-body { + width: 100%; + padding: 0.5rem 0.7rem; } - .status { + &-footer { + width: 100%; + padding: 0.5rem 0.7rem; + } + } + + .vault { + width: 100%; + background-color: $darker; + padding: 1rem 0.3rem; + margin: 1rem 0rem; + + h5 { font-size: 1rem; + margin-bottom: 0rem; } - .number { - font-size: 0.85rem; - text-align: right; + + svg, + .tcap { + height: 30px; + margin-right: 10px; } - .neon-green { - margin-bottom: 0.5rem; + + .jpegz { + height: 30px; + width: 30px; + margin-right: 10px; } - } - &-actions { - display: grid; - grid-template-columns: 100%; - &.two { - grid-template-columns: 50% 50%; - gap: 1rem; - padding-right: 2.5rem; + &-assets { + display: flex; + flex-direction: row; + justify-content: space-between; + + .asset-box { + display: flex; + flex-direction: column; + width: 100%; + } + + .asset { + display: flex; + flex-direction: row; + align-items: center; + padding: 0.5rem; + margin-top: 0.5rem; + background-color: $darkest; + border-radius: 5px; + border: 1px solid $light; + + &.index { + margin-right: 0.8rem; + } + + &.collateral { + margin-left: 0.8rem; + } + } } - .btn { - height: 2.7rem; - width: 100%; + + &-values { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin: 1rem 0rem; + border: 0.5px solid $off-white; + border-radius: 5px; + + .title { + display: flex; + align-items: center; + background-color: $darkest; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + padding-left: 0.6rem; + height: 3.5rem; + width: 40%; + } + + .values { + display: flex; + flex-direction: column; + padding: 0.5rem; + } + + .status { + font-size: 1rem; + } + + .number { + font-size: 0.85rem; + text-align: right; + } + + .neon-green { + margin-bottom: 0.5rem; + } } - .liquidation { - border: 1px solid rgb(236, 97, 97); + + &-actions { + display: grid; + grid-template-columns: 100%; + + &.two { + grid-template-columns: 50% 50%; + gap: 1rem; + padding-right: 2.5rem; + } + + .btn { + height: 2.7rem; + width: 100%; + } + + .liquidation { + border: 1px solid rgb(236, 97, 97); + } } - } - /* .ratio { + + /* .ratio { .values { display: flex; flex-direction: row; - align-items: center; + align-items: center; .empty { font-size: 0.9rem; } @@ -585,5 +658,6 @@ span { } } } */ + } } } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 59d2f4a..e2088d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5623,6 +5623,11 @@ css-loader@4.3.0: schema-utils "^2.7.1" semver "^7.3.2" +css-mediaquery@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0" + integrity sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q== + css-prefers-color-scheme@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" @@ -8685,6 +8690,11 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +hyphenate-style-name@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + i18next-browser-languagedetector@^6.1.3: version "6.1.8" resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-6.1.8.tgz#8e9c61b32a4dfe9b959b38bc9d2a8b95f799b27c" @@ -10588,6 +10598,13 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +matchmediaquery@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/matchmediaquery/-/matchmediaquery-0.3.1.tgz#8247edc47e499ebb7c58f62a9ff9ccf5b815c6d7" + integrity sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ== + dependencies: + css-mediaquery "^0.1.2" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -12732,7 +12749,7 @@ prop-types-extra@^1.1.0: react-is "^16.3.2" warning "^4.0.0" -prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.5.10, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -13079,6 +13096,16 @@ react-refresh@^0.8.3: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== +react-responsive@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/react-responsive/-/react-responsive-9.0.2.tgz#34531ca77a61e7a8775714016d21241df7e4205c" + integrity sha512-+4CCab7z8G8glgJoRjAwocsgsv6VA2w7JPxFWHRc7kvz8mec1/K5LutNC2MG28Mn8mu6+bu04XZxHv5gyfT7xQ== + dependencies: + hyphenate-style-name "^1.0.0" + matchmediaquery "^0.3.0" + prop-types "^15.6.1" + shallow-equal "^1.2.1" + react-router-dom@^5.2.0: version "5.3.4" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" @@ -14135,6 +14162,11 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" +shallow-equal@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" + integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== + shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" From 6cd870933f4223f9a33308b0cd03bec958960fef Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 26 Jan 2023 23:48:56 -0600 Subject: [PATCH 224/278] mobile support --- src/components/Header.tsx | 26 ++++----- src/components/Topbar.tsx | 54 ++++++++++++++++++- src/components/Vaults/monitoring/Vaults.tsx | 2 +- .../Vaults/monitoring/VaultsMobile.tsx | 52 +++++++++--------- src/components/Vaults/monitoring/index.tsx | 31 +++++++---- src/components/Vaults/vault/index.tsx | 4 +- src/styles/app.scss | 13 +++-- src/styles/header.scss | 40 +++++++++++++- src/styles/sidebar.scss | 2 + src/styles/topbar.scss | 45 ++++++++++++++-- src/styles/vault-monitoring.scss | 45 ++++++++++++---- 11 files changed, 244 insertions(+), 70 deletions(-) diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 49094e3..0521bfc 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -286,18 +286,20 @@ const Header = ({ signerAddress, isMobile }: props) => { )}
- -
- Click to Copy} - > - - {addressField} - - -
+
+ +
+ Click to Copy} + > + + {addressField} + + +
+
+
+ ) */} ); }; diff --git a/src/components/Vaults/monitoring/Vaults.tsx b/src/components/Vaults/monitoring/Vaults.tsx index 938828f..7452173 100644 --- a/src/components/Vaults/monitoring/Vaults.tsx +++ b/src/components/Vaults/monitoring/Vaults.tsx @@ -10,7 +10,7 @@ import { ReactComponent as SortUpIcon } from "../../../assets/images/sort-up.svg import { ReactComponent as SortDownIcon } from "../../../assets/images/sort-down.svg"; import Liquidate from "./Liquidate"; import { networkContext } from "../../../state"; -import { PaginationType, VaultsPropsType, VaultsType, VaultToUpdateType } from "../types"; +import { VaultsPropsType, VaultsType } from "../types"; import { isArbitrum, isInLayer1, numberFormatStr } from "../../../utils/utils"; import { capitalize, diff --git a/src/components/Vaults/monitoring/VaultsMobile.tsx b/src/components/Vaults/monitoring/VaultsMobile.tsx index b44e005..b3665c4 100644 --- a/src/components/Vaults/monitoring/VaultsMobile.tsx +++ b/src/components/Vaults/monitoring/VaultsMobile.tsx @@ -4,19 +4,10 @@ import { ethers } from "ethers"; import NumberFormat from "react-number-format"; import { networkContext } from "../../../state"; import Liquidate from "./Liquidate"; -import { - capitalize, - TokenIcon, - getMinRatio, - getCollateralPrice, - findNewArbitrumVaultCollateral, - findNewMainnetVaultCollateral, - findNewOptimismVaultCollateral, - VAULT_STATUS, -} from "../common"; -import { PaginationType, VaultsPropsType, VaultsType, VaultToUpdateType } from "../types"; +import { capitalize, TokenIcon, VAULT_STATUS } from "../common"; +import { VaultsPropsType, VaultsType } from "../types"; import { TOKENS_SYMBOLS } from "../../../utils/constants"; -import { isArbitrum, isInLayer1, numberFormatStr } from "../../../utils/utils"; +import { isArbitrum, isInLayer1 } from "../../../utils/utils"; export const VaultsMobile = ({ currentAddress, @@ -32,12 +23,7 @@ export const VaultsMobile = ({ const [showLiquidate, setShowLiquidate] = useState(false); const [vaultIndex, setVaultIndex] = useState(-1); const [liqVault, setLiqVault] = useState(null); - - const liquidateVault = (index: number, lVault: VaultsType) => { - setVaultIndex(index); - setLiqVault(lVault); - setShowLiquidate(true); - }; + const [vaultsShown, setVaultsShown] = useState(pagination.itemsPerPage); const updateLiqVault = (collateral: ethers.BigNumberish, debt: ethers.BigNumberish) => { if (liqVault !== null) { @@ -49,16 +35,23 @@ export const VaultsMobile = ({ const vtu = { vaultId: v.id, assetSymbol: isArbitrum(currentNetwork.chainId) ? TOKENS_SYMBOLS.JPEGz : TOKENS_SYMBOLS.TCAP, - collateralSymbol: v.collateralSymbol !== "WETH" ? v.collateralSymbol : "ETH", + collateralSymbol: + v.collateralSymbol !== TOKENS_SYMBOLS.WETH ? v.collateralSymbol : TOKENS_SYMBOLS.ETH, isHardVault: v.isHardVault, }; + const vStatus = v.status === VAULT_STATUS.liquidation ? "active" : v.status; return ( - ); }; + const loadMore = () => { + const n = vaultsShown + pagination.itemsPerPage; + setVaultsShown(n); + }; + const newVault = () => { const initData = { vaultId: "0", @@ -67,6 +60,7 @@ export const VaultsMobile = ({ isHardVault: isInLayer1(currentNetwork.chainId), }; setVaultToUpdate(initData); + console.log(setVaults); }; const IndexIcon = () => { @@ -79,10 +73,15 @@ export const VaultsMobile = ({ return (
{vaults.map((v, index) => { - const itemPage = Math.ceil((index + 1) / pagination.itemsPerPage); + const classN = index < vaultsShown ? "vault" : "vault hide"; return ( - + + {v.isHardVault && ( +
+
H Mode
+
+ )}
Index
@@ -172,7 +171,7 @@ export const VaultsMobile = ({ {(v.status === VAULT_STATUS.liquidation || v.url !== "") && ( {v.status === VAULT_STATUS.liquidation && ( @@ -184,6 +183,11 @@ export const VaultsMobile = ({ ); })} + {vaultsShown < pagination.itemsCount && ( + + )} {vaults.length === 0 && currentAddress !== "" && myVaults && currentStatus === "all" && (

diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index 527b367..0025b2f 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -74,7 +74,7 @@ const showAllVaults = true; const Monitoring = ({ setVaultToUpdate }: props) => { const { t } = useTranslation(); - const isMobile = useMediaQuery({ query: "(max-width: 800px)" }); + const isMobile = useMediaQuery({ query: "(max-width: 450px)" }); const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); const vaults = useContext(vaultsContext); @@ -913,19 +913,28 @@ const Monitoring = ({ setVaultToUpdate }: props) => { + {loading || filteringRatios ? ( ) : ( - ) => setVaultList(v)} - currentStatus={currentStatus} - pagination={pagination} - refresh={updateLiquidatedVault} - setVaultToUpdate={setVaultToUpdate} - myVaults={currentOwnerFilter.value === "1"} - /> + <> + ) => setVaultList(v)} + currentStatus={currentStatus} + pagination={pagination} + refresh={updateLiquidatedVault} + setVaultToUpdate={setVaultToUpdate} + myVaults={currentOwnerFilter.value === "1"} + /> + )} )} diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 1ee0e29..5ec2edd 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -52,8 +52,8 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const [vaultMode, setVaultMode] = useState(vaultInitData.isHardVault ? "hard" : "normal"); const [vaultData, setVaultData] = useState(vaultInitData); const radios = [ - { name: "Regular", value: "normal" }, - { name: "Hard", value: "hard" }, + { name: "R Mode", value: "normal" }, + { name: "H Mode", value: "hard" }, ]; const [ diff --git a/src/styles/app.scss b/src/styles/app.scss index dcf1aa2..80f0636 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -99,7 +99,7 @@ body { .btn-primary:not(:disabled):not(.disabled):active { background-color: $darker; - border: none; + border: 1px solid $highlight; } .btn-primary:focus, @@ -123,7 +123,6 @@ body { background-color: $pink; } - .input-group .btn.neon-orange { border: 1px solid $orange; box-sizing: border-box; @@ -254,7 +253,7 @@ body { color: $white !important; } -@keyframes fire { +/* @keyframes fire { 80% { text-shadow: 0px -2px 8px $purple, 0px -2px 10px $yellow, 0px -5px 20px $orange, 0px -20px 40px #c33; @@ -263,7 +262,7 @@ body { text-shadow: 0px -2px 4px $purple, 0px -2px 10px $yellow, 0px -5px 20px $orange, 0px -20px 40px #c33; } -} +} */ .table thead th { border-top: 2px solid $highlight; @@ -519,6 +518,10 @@ form { } } +.btn-primary:not(:disabled):not(.disabled).active { + background-color: $darker; +} + .btn { &.empty { border: 1px solid #f28040; @@ -527,7 +530,7 @@ form { border: 1px solid #167226; } &.active { - border: 1px solid #e440f2; + border: 1px solid #e440f2 !important; } &.liquidation { border: 1px solid #c33; diff --git a/src/styles/header.scss b/src/styles/header.scss index c2e65a5..7f35392 100644 --- a/src/styles/header.scss +++ b/src/styles/header.scss @@ -65,7 +65,7 @@ height: 3.2rem; width: 10.5rem; border-radius: 0.3rem; - + border: 1px solid $highlight; svg { height: 2rem; } @@ -115,6 +115,15 @@ flex-direction: row; align-items: center; justify-content: flex-end; + + &-address { + display: flex; + flex-direction: row; + background-color: $darker; + border: 0.5px solid $highlight;; + padding: 0.5rem; + border-radius: 5px; + } } .btn-network-container{ @@ -243,6 +252,9 @@ } } @media (max-width: 530px) { + .btn-connect { + width: 90%; + } .network-container { margin-bottom: 1rem; .dropdown-toggle::after { @@ -253,4 +265,30 @@ display: none; } } + @media (max-width: 450px) { + display: flex; + flex-direction: column; + padding: 1rem; + .network-container { + width: 100%; + margin-bottom: 1rem; + padding-left: 0rem; + .dropdown { + width: 100%; + border: 0.5px solid $highlight; + } + .dropdown-toggle { + border: 0.5px solid $highlight; + } + .dropdown-toggle::after { + margin-left: 87%; + } + } + .info { + width: 100%; + &-address { + width: 100%; + } + } + } } diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index c5d508c..bb462c3 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -55,6 +55,7 @@ a.active svg { -webkit-filter: drop-shadow(3px 3px 2px $highlight); filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); + text-shadow: none; } .title { font-size: 0.75rem; @@ -63,6 +64,7 @@ .title.active { -webkit-filter: drop-shadow(3px 3px 2px $highlight); filter: brightness(1118%) drop-shadow(0px 0px 12px $highlight); + text-shadow: none; } } diff --git a/src/styles/topbar.scss b/src/styles/topbar.scss index 8d85d37..68679b4 100644 --- a/src/styles/topbar.scss +++ b/src/styles/topbar.scss @@ -11,12 +11,18 @@ top: 0px; z-index: 9; + .menu.nav-item { + width: 25%; + padding-left: 8px; + } .logo.nav-item { - width: 75%; + width: 50%; } - .menu.nav-item { + .settings.nav-item { + display: none; + justify-content: flex-end; width: 25%; - padding-left: 5px; + padding-right: 10px; } .nav-item { @@ -54,3 +60,36 @@ display: none; } } + +.top-settings { + position: absolute; + display: flex; + flex-direction: column; + padding: 1rem; + width: 100%; + background: $darkest; + margin-top: 3.3rem; + .info-address { + display: flex; + flex-direction: row; + padding: 1rem; + + .avatar { + height: 35px; + width: 35px; + border-radius: 50%; + } + .address { + color: $white; + } + } + .logout { + display: flex; + flex-direction: row; + align-items: center; + border: none; + h6 { + margin-left: 10px; + } + } +} diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index c2ac98f..604b17c 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -15,10 +15,10 @@ span { text-shadow: 0 0 4px #7940f2, 0 0 10px #fcdf49, 0 0 20px #f28040, 0 -10px 40px #c33; } .ready { - text-shadow: 0 0 4px #167226, 0 0 10px #61c4b3, 0 0 20px #167226, 0 -10px 40px #167226; + text-shadow: 0 0 4px #167226, 0 0 10px #167226, 0 0 20px #167226, 0 -10px 40px #167226; } .active { - text-shadow: 0 0 4px #e440f2, 0 0 10px #e98ff1, 0 0 20px #e440f2, 0 -10px 40px #b626c4; + text-shadow: 0 0 4px #b626c4, 0 0 10px #e440f2, 0 0 20px #e440f2, 0 -10px 40px #b626c4; } .liquidation { text-shadow: 0 0 4px #c33, 0 0 10px rgb(236, 97, 97), 0 0 20px #c33, 0 -10px 40px #c33; @@ -461,7 +461,7 @@ span { } } - @media (min-width: 801px) { + @media (min-width: 451px) { .accordion { &-button:after { display: none; @@ -469,7 +469,8 @@ span { } } - @media (max-width: 800px) { + @media (max-width: 450px) { + margin-top: 1rem; margin-left: 0rem; padding: 1rem; @@ -507,15 +508,25 @@ span { padding-left: 0rem; } } + .btn-create-vault { + background-color: $highlight; + margin-top: 3rem; + width: 100%; + height: 3rem; + } } + .btn-load-more { + width: 100%; + height: 3rem; + } + .vaults-mobile { display: flex; flex-direction: column; justify-content: center; align-items: center; - margin: 2rem 0rem; - + margin-bottom: 1rem; .status { font-size: 1.2rem; } @@ -531,12 +542,20 @@ span { } } + .btn-load-more { + width: 100%; + } + .vault { width: 100%; background-color: $darker; padding: 1rem 0.3rem; margin: 1rem 0rem; + &.hide { + display: none; + } + h5 { font-size: 1rem; margin-bottom: 0rem; @@ -554,6 +573,13 @@ span { margin-right: 10px; } + &-type { + display: flex; + justify-content: flex-end; + margin-top: -0.5rem; + margin-bottom: 1rem; + } + &-assets { display: flex; flex-direction: row; @@ -613,6 +639,9 @@ span { .status { font-size: 1rem; + span { + text-align: right; + } } .number { @@ -639,10 +668,6 @@ span { height: 2.7rem; width: 100%; } - - .liquidation { - border: 1px solid rgb(236, 97, 97); - } } /* .ratio { From f2c3569df8ba3fdad6c8f21608af3e2fccd84c41 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 27 Jan 2023 19:49:11 -0600 Subject: [PATCH 225/278] farm page mobile version --- .../Farm/MintingRewards/Rewards.tsx | 236 ------------------ src/components/Farm/MintingRewards/index.tsx | 54 ---- src/components/Farm/UniV3Rewards/Rewards.tsx | 143 ++++++++--- src/components/Farm/index.tsx | 21 +- src/components/Vaults/monitoring/index.tsx | 1 + src/styles/app.scss | 5 + src/styles/farm.scss | 110 +++++++- 7 files changed, 228 insertions(+), 342 deletions(-) delete mode 100644 src/components/Farm/MintingRewards/Rewards.tsx delete mode 100644 src/components/Farm/MintingRewards/index.tsx diff --git a/src/components/Farm/MintingRewards/Rewards.tsx b/src/components/Farm/MintingRewards/Rewards.tsx deleted file mode 100644 index 40997a8..0000000 --- a/src/components/Farm/MintingRewards/Rewards.tsx +++ /dev/null @@ -1,236 +0,0 @@ -import React, { useContext, useState } from "react"; -import Card from "react-bootstrap/esm/Card"; -import Button from "react-bootstrap/esm/Button"; -import { ethers } from "ethers"; -import NumberFormat from "react-number-format"; -import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; -import Table from "react-bootstrap/esm/Table"; -import Tooltip from "react-bootstrap/esm/Tooltip"; -import { useQuery, gql } from "@apollo/client"; -import { vaultsContext } from "../../../state"; -import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; -import { ReactComponent as DAIIcon } from "../../../assets/images/graph/DAI.svg"; - -type props = { - address: string; - ethRewards: string; - daiRewards: string; - claimRewards: (vaultType: string) => {}; -}; - -const Rewards = ({ address, ethRewards, daiRewards, claimRewards }: props) => { - const vaults = useContext(vaultsContext); - const [ethDebt, setEthDebt] = useState("0.0"); - const [daiDebt, setDaiDebt] = useState("0.0"); - - const USER_VAULTS = gql` - query getVault($owner: String!) { - vaults(where: { owner: $owner }) { - id - vaultId - owner - collateral - debt - currentRatio - address - owner - } - } - `; - - async function setDebt(vaultData: any) { - // TODO: fix if no graph - await vaultData.vaults.forEach((v: any) => { - switch (v.address.toLowerCase()) { - case vaults?.wethVault?.address.toLowerCase(): - setEthDebt(ethers.utils.formatEther(v.debt)); - break; - case vaults?.wbtcVault?.address.toLowerCase(): - // setWbtcDebt(ethers.utils.formatEther(v.debt)); - break; - case vaults?.daiVault?.address.toLowerCase(): - setDaiDebt(ethers.utils.formatEther(v.debt)); - break; - default: - break; - } - }); - } - - const { data, refetch } = useQuery(USER_VAULTS, { - variables: { owner: address }, - fetchPolicy: "no-cache", - notifyOnNetworkStatusChange: true, - onCompleted: () => { - setDebt(data); - }, - }); - - const claimMintRewards = async (vaultType: string) => { - await claimRewards(vaultType); - refetch(); - }; - - return ( - -

Minting Rewards

-
- + <>{t("debt")} diff --git a/src/components/Vaults/types.tsx b/src/components/Vaults/types.tsx index af0d71e..40fbcf1 100644 --- a/src/components/Vaults/types.tsx +++ b/src/components/Vaults/types.tsx @@ -9,20 +9,6 @@ export type PaginationType = { lastId: string; }; -export type OraclePricesType = { - jpegzOraclePrice: string; - tcapOraclePrice: string; - wethOraclePrice: string; - daiOraclePrice: string; - aaveOraclePrice: string; - linkOraclePrice: string; - uniOraclePrice: string; - snxOraclePrice: string; - maticOraclePrice: string; - wbtcOraclePrice: string; - usdcOraclePrice: string; -}; - export type VaultsRatioType = { ethRatio: number; wethRatio: number; diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index b3620bb..e9334be 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -6,13 +6,15 @@ import { Dropdown, Form, InputGroup, + OverlayTrigger, Spinner, ToggleButton, + Tooltip, } from "react-bootstrap/esm"; import NumberFormat from "react-number-format"; import { useTranslation } from "react-i18next"; import { FaPlus } from "react-icons/fa"; -import "../../../styles/mint2.scss"; +import "../../../styles/vault.scss"; import { useVault } from "../../../hooks"; import { networkContext, signerContext } from "../../../state"; import { capitalize, TokenIcon } from "../common"; @@ -54,23 +56,28 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { { name: "Hard", value: "hard" }, ]; - const { - currentCollateral, - currentVault, - currentAssetRead, - currentCollateralRead, - currentVaultRead, - currentCollateralOracleRead, - currentAssetOracleRead, - } = useVault(vaultData.assetSymbol, vaultData.collateralSymbol, vaultData.isHardVault); + const [ + { + currentCollateral, + currentVault, + currentAssetRead, + currentCollateralRead, + currentVaultRead, + currentCollateralOracleRead, + currentAssetOracleRead, + }, + loadingVault, + ] = useVault(vaultData.assetSymbol, vaultData.collateralSymbol, vaultData.isHardVault); const actions = ["add", "remove", "mint", "burn"]; // Actions const [title, setTitle] = useState(t("vault.create")); const [text, setText] = useState(t("vault.create-text", { asset: "Index" })); const [isLoading, setIsLoading] = useState(false); + const [loadingMax, setLoadingMax] = useState(false); const [btnDisabled, setBtnDisabled] = useState(false); const [activeAction, setActiveAction] = useState("add"); + const [refreshVault, setRefreshVault] = useState(false); // Vault Data // Vault Data @@ -157,7 +164,6 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setIsLoading(true); let balance; const provider = getDefaultProvider(currentNetwork.chainId || NETWORKS.mainnet.chainId); - let currentVaultData: any; // @ts-ignore const vaultID = await currentVault.userToVault(currentAddress); @@ -295,14 +301,19 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { () => { const load = async () => { setCollaterals(vaultData.isHardVault ? "hard" : "normal"); - if (currentAddress !== "" && currentCollateral !== null && currentAssetRead !== null) { + if ( + currentAddress !== "" && + currentCollateral !== null && + currentAssetRead !== null && + !loadingVault + ) { await loadVault(); } }; load(); }, // eslint-disable-next-line - [currentAddress, currentVault] + [currentAddress, currentVault, refreshVault] ); const assetPrice = async () => { @@ -328,6 +339,12 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const refresh = async () => { try { await loadVault(); + if (activeAction === "add") { + setActiveAction("mint"); + } + if (activeAction === "burn") { + setActiveAction("remove"); + } } catch (error) { console.log(error); } @@ -589,6 +606,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const maxAddCollateral = async (e: React.MouseEvent) => { e.preventDefault(); + setLoadingMax(true); let balance = "0"; if (vaultData.collateralSymbol === TOKENS_SYMBOLS.ETH) { const provider = getDefaultProvider(currentNetwork.chainId); @@ -608,6 +626,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); changeVault(r); setAddCollateralUSD(usd.toString()); + setLoadingMax(false); }; const removeCollateral = async () => { @@ -645,6 +664,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const safeRemoveCollateral = async (e: React.MouseEvent) => { e.preventDefault(); + setLoadingMax(true); const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); let collateralToRemove = await getSafeRemoveCollateral( @@ -668,6 +688,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const r = await getRatio(newCollateral.toString(), currentPrice, vaultDebt, currentAssetPrice); changeVault(r); setRemoveCollateralUSD(usd.toString()); + setLoadingMax(false); }; const mintTCAP = async () => { @@ -699,6 +720,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const safeMintTCAP = async (e: React.MouseEvent) => { e.preventDefault(); + setLoadingMax(true); const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); const safeMint = await getSafeMint( @@ -718,6 +740,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); changeVault(r); setMintUSD(usd.toString()); + setLoadingMax(false); }; const burnTCAP = async () => { @@ -728,9 +751,6 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const currentBurnFee = await currentVault?.getFee(amount); const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); - console.log("Amount: ", amount.toString()); - console.log("increasedFee: ", increasedFee.toString()); - console.log("Fee: ", ethFee.toString()); setBurnFee(ethFee.toString()); const tx = await currentVault?.burn(amount, { value: BigNumber.from(increasedFee) }); @@ -754,6 +774,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const maxBurnTCAP = async (e: React.MouseEvent) => { e.preventDefault(); + setLoadingMax(true); const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); const currentBalanceCall = await currentAssetRead?.balanceOf(currentAddress); @@ -792,6 +813,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { } else { setBurnFee("0"); } + setLoadingMax(false); }; const ActionsDropdown = () => ( @@ -947,6 +969,13 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { }; const MaxButton = () => { + if (loadingMax) { + let colorClass = "spinner-green"; + if (activeAction === "remove" || activeAction === "burn") { + colorClass = "spinner-orange"; + } + return ; + } if (activeAction === "add") { return ( + + )} + ) : (
Vault
)} @@ -1186,17 +1247,25 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => {
- {AssetBalance(false)} - {isApproved && } + {!isLoading && ( + <> + {AssetBalance(false)} + {isApproved && } + + )}
- {AssetBalance(true)} - {isApproved && } + {!isLoading && ( + <> + {AssetBalance(true)} + {isApproved && } + + )}
{isLoading ? ( - + ) : (
{!isApproved ? ( @@ -1205,9 +1274,12 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { <>
-
- - +
+

Choose Action

+
+ + +
{activeAction === actions[3] && (
diff --git a/src/hooks/index.tsx b/src/hooks/index.tsx index c5e9c9b..13177b0 100644 --- a/src/hooks/index.tsx +++ b/src/hooks/index.tsx @@ -1,3 +1,9 @@ +export * from "./useArbitrum"; + +export * from "./useBalances"; + +export * from "./useEthereum"; + export * from "./useGovernance"; export * from "./useHardVaults"; @@ -14,6 +20,8 @@ export * from "./usePrices2"; export * from "./useOracles"; +export * from "./useOptimism"; + export * from "./useRatios"; export * from "./useRewards"; diff --git a/src/hooks/types.tsx b/src/hooks/types.tsx new file mode 100644 index 0000000..efc285c --- /dev/null +++ b/src/hooks/types.tsx @@ -0,0 +1,23 @@ +export type BalancesType = { + tcapBalance: string; + jpegzBalance: string; + ctxBalance: string; + tcapSupplly: string; + jpegzSupplly: string; +}; + +export type OraclePricesType = { + jpegzOraclePrice: string; + jpegzMarketCap: string; + tcapOraclePrice: string; + tcapMarketCap: string; + wethOraclePrice: string; + daiOraclePrice: string; + aaveOraclePrice: string; + linkOraclePrice: string; + uniOraclePrice: string; + snxOraclePrice: string; + maticOraclePrice: string; + wbtcOraclePrice: string; + usdcOraclePrice: string; +}; diff --git a/src/hooks/useArbitrum.tsx b/src/hooks/useArbitrum.tsx new file mode 100644 index 0000000..b8d71e5 --- /dev/null +++ b/src/hooks/useArbitrum.tsx @@ -0,0 +1,34 @@ +import React, { useState } from "react"; +import { Contract } from "ethers-multicall"; +import { IArbitrumContext } from "../state"; + +export const useArbitrum = (): IArbitrumContext => { + const [jpegzTokenRead, setJpegzTokenRead] = useState(); + const [jpegzOracleRead, setJpegzOracleRead] = useState(); + const [wethOracleRead, setWethOracleRead] = useState(); + const [daiOracleRead, setDaiOracleRead] = useState(); + + const setCurrentJpegzTokenRead = React.useCallback((currentJpegzTokenRead: Contract): void => { + setJpegzTokenRead(currentJpegzTokenRead); + }, []); + const setCurrentJpegzOracleRead = React.useCallback((currentJpegzOracleRead: Contract): void => { + setJpegzOracleRead(currentJpegzOracleRead); + }, []); + const setCurrentWethOracleRead = React.useCallback((currentWethOracleRead: Contract): void => { + setWethOracleRead(currentWethOracleRead); + }, []); + const setCurrentDaiOracleRead = React.useCallback((currentDaiOracleRead: Contract): void => { + setDaiOracleRead(currentDaiOracleRead); + }, []); + + return { + jpegzTokenRead, + setCurrentJpegzTokenRead, + jpegzOracleRead, + setCurrentJpegzOracleRead, + wethOracleRead, + setCurrentWethOracleRead, + daiOracleRead, + setCurrentDaiOracleRead, + }; +}; diff --git a/src/hooks/useBalances.tsx b/src/hooks/useBalances.tsx new file mode 100644 index 0000000..303b921 --- /dev/null +++ b/src/hooks/useBalances.tsx @@ -0,0 +1,110 @@ +import { useContext, useEffect, useState } from "react"; +import { ethers } from "ethers"; +import { Provider } from "ethers-multicall"; +import { arbitrumContext, ethereumContext, optimismContext } from "../state/index"; +import { isArbitrum, isInLayer1, isOptimism, validOracles } from "../utils/utils"; +import { BalancesType } from "./types"; + +export const useBalances = ( + chainId: number, + ethcallProvider: Provider | undefined, + address: string +): [BalancesType, boolean] => { + const arbitrumContracts = useContext(arbitrumContext); + const ethereumContracts = useContext(ethereumContext); + const optimismContracts = useContext(optimismContext); + const [loadingBalances, setLoadingBalances] = useState(true); + const [balances, setBalances] = useState({ + tcapBalance: "0", + jpegzBalance: "0", + ctxBalance: "0", + tcapSupplly: "0", + jpegzSupplly: "0", + }); + + const loadBalanceArbitrum = async () => { + console.log("Load Arbitrum "); + const jpegzBalanceCall = await arbitrumContracts.jpegzTokenRead?.balanceOf(address); + const jpegzSupplyCall = await arbitrumContracts.jpegzTokenRead?.totalSupply(); + // @ts-ignore + const [jpegzBalance, jpegzSupply] = await ethcallProvider?.all([ + jpegzBalanceCall, + jpegzSupplyCall, + ]); + setBalances({ + tcapBalance: "0", + jpegzBalance: ethers.utils.formatEther(jpegzBalance), + ctxBalance: "0", + tcapSupplly: "0", + jpegzSupplly: ethers.utils.formatEther(jpegzSupply), + }); + }; + + const loadBalanceEthereum = async () => { + console.log("Load Ethereum "); + const tcapBalanceCall = await ethereumContracts.tcapTokenRead?.balanceOf(address); + const tcapSupplyCall = await ethereumContracts.tcapTokenRead?.totalSupply(); + const ctxBalanceCall = await ethereumContracts.ctxTokenRead?.balanceOf(address); + + // @ts-ignore + const [tcapBalance, tcapSupply, ctxBalance] = await ethcallProvider?.all([ + tcapBalanceCall, + tcapSupplyCall, + ctxBalanceCall, + ]); + + setBalances({ + tcapBalance: ethers.utils.formatEther(tcapBalance), + jpegzBalance: "0", + ctxBalance: ethers.utils.formatEther(ctxBalance), + tcapSupplly: ethers.utils.formatEther(tcapSupply), + jpegzSupplly: "0", + }); + }; + + const loadBalanceOptimism = async () => { + const tcapBalanceCall = await optimismContracts.tcapTokenRead?.balanceOf(address); + const tcapSupplyBalanceCall = await ethereumContracts.tcapTokenRead?.totalSupply(); + + // @ts-ignore + const [tcapBalance, tcapSupply] = await ethcallProvider?.all([ + tcapBalanceCall, + tcapSupplyBalanceCall, + ]); + setBalances({ + tcapBalance: ethers.utils.formatEther(tcapBalance), + jpegzBalance: "0", + ctxBalance: "0", + tcapSupplly: ethers.utils.formatEther(tcapSupply), + jpegzSupplly: "0", + }); + }; + + const loadBalance = async () => { + if (arbitrumContracts && ethereumContracts && optimismContracts) { + if (isArbitrum(chainId) && validOracles(chainId, arbitrumContracts)) { + await loadBalanceArbitrum(); + } + if (isInLayer1(chainId) && validOracles(chainId, ethereumContracts)) { + await loadBalanceEthereum(); + } + if (isOptimism(chainId) && validOracles(chainId, optimismContracts)) { + await loadBalanceOptimism(); + } + } + setLoadingBalances(false); + }; + + useEffect( + () => { + if (ethcallProvider && address !== "") { + console.log("Entra balance: "); + loadBalance(); + } + }, + // eslint-disable-next-line + [chainId, ethcallProvider, address] + ); + + return [balances, loadingBalances]; +}; diff --git a/src/hooks/useEthereum.tsx b/src/hooks/useEthereum.tsx new file mode 100644 index 0000000..b0bae18 --- /dev/null +++ b/src/hooks/useEthereum.tsx @@ -0,0 +1,73 @@ +import React, { useState } from "react"; +import { Contract } from "ethers-multicall"; +import { IEthereumContext } from "../state"; + +export const useEthereum = (): IEthereumContext => { + const [tcapTokenRead, setTcapTokenRead] = useState(); + const [ctxTokenRead, setCtxTokenRead] = useState(); + const [ctxPoolTokenRead, setCtxPoolTokenRead] = useState(); + const [tcapOracleRead, setTcapOracleRead] = useState(); + const [wethOracleRead, setWethOracleRead] = useState(); + const [daiOracleRead, setDaiOracleRead] = useState(); + const [aaveOracleRead, setAaveOracleRead] = useState(); + const [linkOracleRead, setLinkOracleRead] = useState(); + const [wbtcOracleRead, setWbtcOracleRead] = useState(); + const [usdcOracleRead, setUsdcOracleRead] = useState(); + + const setCurrentTcapTokenRead = React.useCallback((currentTcapTokenRead: Contract): void => { + setTcapTokenRead(currentTcapTokenRead); + }, []); + const setCurrentCtxTokenRead = React.useCallback((currentCtxTokenRead: Contract): void => { + setCtxTokenRead(currentCtxTokenRead); + }, []); + const setCurrentCtxPoolTokenRead = React.useCallback( + (currentCtxPoolTokenRead: Contract): void => { + setCtxPoolTokenRead(currentCtxPoolTokenRead); + }, + [] + ); + const setCurrentTcapOracleRead = React.useCallback((currentTcapOracleRead: Contract): void => { + setTcapOracleRead(currentTcapOracleRead); + }, []); + const setCurrentWethOracleRead = React.useCallback((currentWethOracleRead: Contract): void => { + setWethOracleRead(currentWethOracleRead); + }, []); + const setCurrentDaiOracleRead = React.useCallback((currentDaiOracleRead: Contract): void => { + setDaiOracleRead(currentDaiOracleRead); + }, []); + const setCurrentAaveOracleRead = React.useCallback((currentAaveOracleRead: Contract): void => { + setAaveOracleRead(currentAaveOracleRead); + }, []); + const setCurrentLinkOracleRead = React.useCallback((currentLinkOracleRead: Contract): void => { + setLinkOracleRead(currentLinkOracleRead); + }, []); + const setCurrentWbtcOracleRead = React.useCallback((currentWbtcOracleRead: Contract): void => { + setWbtcOracleRead(currentWbtcOracleRead); + }, []); + const setCurrentUsdcOracleRead = React.useCallback((currentUsdcOracleRead: Contract): void => { + setUsdcOracleRead(currentUsdcOracleRead); + }, []); + + return { + tcapTokenRead, + setCurrentTcapTokenRead, + ctxTokenRead, + setCurrentCtxTokenRead, + ctxPoolTokenRead, + setCurrentCtxPoolTokenRead, + tcapOracleRead, + setCurrentTcapOracleRead, + wethOracleRead, + setCurrentWethOracleRead, + daiOracleRead, + setCurrentDaiOracleRead, + aaveOracleRead, + setCurrentAaveOracleRead, + linkOracleRead, + setCurrentLinkOracleRead, + wbtcOracleRead, + setCurrentWbtcOracleRead, + usdcOracleRead, + setCurrentUsdcOracleRead, + }; +}; diff --git a/src/hooks/useOptimism.tsx b/src/hooks/useOptimism.tsx new file mode 100644 index 0000000..d21a461 --- /dev/null +++ b/src/hooks/useOptimism.tsx @@ -0,0 +1,52 @@ +import React, { useState } from "react"; +import { Contract } from "ethers-multicall"; +import { IOptimismContext } from "../state"; + +export const useOptimism = (): IOptimismContext => { + const [tcapTokenRead, setTcapTokenRead] = useState(); + const [tcapOracleRead, setTcapOracleRead] = useState(); + const [wethOracleRead, setWethOracleRead] = useState(); + const [daiOracleRead, setDaiOracleRead] = useState(); + const [linkOracleRead, setLinkOracleRead] = useState(); + const [snxOracleRead, setSnxOracleRead] = useState(); + const [uniOracleRead, setUniOracleRead] = useState(); + + const setCurrentTcapTokenRead = React.useCallback((currentTcapTokenRead: Contract): void => { + setTcapTokenRead(currentTcapTokenRead); + }, []); + const setCurrentTcapOracleRead = React.useCallback((currentTcapOracleRead: Contract): void => { + setTcapOracleRead(currentTcapOracleRead); + }, []); + const setCurrentWethOracleRead = React.useCallback((currentWethOracleRead: Contract): void => { + setWethOracleRead(currentWethOracleRead); + }, []); + const setCurrentDaiOracleRead = React.useCallback((currentDaiOracleRead: Contract): void => { + setDaiOracleRead(currentDaiOracleRead); + }, []); + const setCurrentLinkOracleRead = React.useCallback((currentLinkOracleRead: Contract): void => { + setLinkOracleRead(currentLinkOracleRead); + }, []); + const setCurrentSnxOracleRead = React.useCallback((currentSnxOracleRead: Contract): void => { + setSnxOracleRead(currentSnxOracleRead); + }, []); + const setCurrentUniOracleRead = React.useCallback((currentUniOracleRead: Contract): void => { + setUniOracleRead(currentUniOracleRead); + }, []); + + return { + tcapTokenRead, + setCurrentTcapTokenRead, + tcapOracleRead, + setCurrentTcapOracleRead, + wethOracleRead, + setCurrentWethOracleRead, + daiOracleRead, + setCurrentDaiOracleRead, + linkOracleRead, + setCurrentLinkOracleRead, + snxOracleRead, + setCurrentSnxOracleRead, + uniOracleRead, + setCurrentUniOracleRead, + }; +}; diff --git a/src/hooks/usePrices.tsx b/src/hooks/usePrices.tsx index 402eae5..2d361b0 100644 --- a/src/hooks/usePrices.tsx +++ b/src/hooks/usePrices.tsx @@ -2,7 +2,7 @@ import { useContext, useEffect, useState } from "react"; import { ethers, BigNumber } from "ethers"; import { oraclesContext, networkContext, signerContext } from "../state/index"; import { isArbitrum, isInLayer1, isOptimism, isPolygon, validOracles } from "../utils/utils"; -import { OraclePricesType } from "../components/Vaults/types"; +import { OraclePricesType } from "./types"; export const usePrices = (): OraclePricesType => { const currentNetwork = useContext(networkContext); @@ -10,7 +10,9 @@ export const usePrices = (): OraclePricesType => { const signer = useContext(signerContext); const [oraclePrices, setOraclePrices] = useState({ jpegzOraclePrice: "0", + jpegzMarketCap: "0", tcapOraclePrice: "0", + tcapMarketCap: "0", wethOraclePrice: "0", daiOraclePrice: "0", aaveOraclePrice: "0", @@ -114,7 +116,9 @@ export const usePrices = (): OraclePricesType => { setOraclePrices({ jpegzOraclePrice: ethers.utils.formatEther(jpegzOraclePrice), + jpegzMarketCap: ethers.utils.formatEther(jpegzOraclePrice.mul(10000000000)), tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), + tcapMarketCap: ethers.utils.formatEther(tcapOraclePrice.mul(10000000000)), wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), aaveOraclePrice: ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)), diff --git a/src/hooks/usePrices2.tsx b/src/hooks/usePrices2.tsx index 491cd0b..7d1badc 100644 --- a/src/hooks/usePrices2.tsx +++ b/src/hooks/usePrices2.tsx @@ -1,18 +1,23 @@ import { useContext, useEffect, useState } from "react"; import { ethers, BigNumber } from "ethers"; import { Provider } from "ethers-multicall"; -import { oraclesContext } from "../state/index"; -import { isArbitrum, isInLayer1, isOptimism, isPolygon, validOracles } from "../utils/utils"; -import { OraclePricesType } from "../components/Vaults/types"; +import { arbitrumContext, ethereumContext, optimismContext } from "../state/index"; +import { isArbitrum, isInLayer1, isOptimism, validOracles } from "../utils/utils"; +import { OraclePricesType } from "./types"; export const usePrices2 = ( chainId: number, ethcallProvider: Provider | undefined -): OraclePricesType => { - const oracles = useContext(oraclesContext); +): [OraclePricesType, boolean] => { + const arbitrumContracts = useContext(arbitrumContext); + const ethereumContracts = useContext(ethereumContext); + const optimismContracts = useContext(optimismContext); + const [loadingPrices, setLoadingPrices] = useState(true); const [oraclePrices, setOraclePrices] = useState({ jpegzOraclePrice: "0", + jpegzMarketCap: "0", tcapOraclePrice: "0", + tcapMarketCap: "0", wethOraclePrice: "0", daiOraclePrice: "0", aaveOraclePrice: "0", @@ -24,118 +29,167 @@ export const usePrices2 = ( usdcOraclePrice: "0", }); + const loadPricesArbitrum = async () => { + console.log("Load Arbitrum PRICES "); + const jpegzPriceCall = await arbitrumContracts.jpegzOracleRead?.getLatestAnswer(); + const wethOraclePriceCall = await arbitrumContracts.wethOracleRead?.getLatestAnswer(); + const daiOraclePriceCall = await arbitrumContracts.daiOracleRead?.getLatestAnswer(); + + let jpegzOraclePrice = BigNumber.from(0); + let wethOraclePrice = BigNumber.from(0); + let daiOraclePrice = BigNumber.from(0); + + // @ts-ignore + [jpegzOraclePrice, daiOraclePrice, wethOraclePrice] = await ethcallProvider?.all([ + jpegzPriceCall, + wethOraclePriceCall, + daiOraclePriceCall, + ]); + const marketCap = jpegzOraclePrice.mul(10000000000); + + console.log("jpegz price: ", ethers.utils.formatEther(jpegzOraclePrice)); + console.log("jpegz market cap: ", ethers.utils.formatEther(marketCap)); + + const p = oraclePrices; + p.jpegzOraclePrice = ethers.utils.formatEther(jpegzOraclePrice); + p.jpegzMarketCap = ethers.utils.formatEther(marketCap); + p.wethOraclePrice = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + p.daiOraclePrice = ethers.utils.formatEther(daiOraclePrice.mul(10000000000)); + setOraclePrices(p); + }; + + const loadPricesEthereum = async () => { + console.log("Load Ethereum PRICES "); + const tcapPriceCall = await ethereumContracts.tcapOracleRead?.getLatestAnswer(); + const wethOraclePriceCall = await ethereumContracts.wethOracleRead?.getLatestAnswer(); + const daiOraclePriceCall = await ethereumContracts.daiOracleRead?.getLatestAnswer(); + const aaveOraclePriceCall = await ethereumContracts.aaveOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await ethereumContracts.linkOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = await ethereumContracts.wbtcOracleRead?.getLatestAnswer(); + const usdcOraclePriceCall = await ethereumContracts.usdcOracleRead?.getLatestAnswer(); + + let tcapOraclePrice = BigNumber.from(0); + let wethOraclePrice = BigNumber.from(0); + let daiOraclePrice = BigNumber.from(0); + let aaveOraclePrice = BigNumber.from(0); + let linkOraclePrice = BigNumber.from(0); + let wbtcOraclePrice = BigNumber.from(0); + let usdcOraclePrice = BigNumber.from(0); + + // @ts-ignore + [ + tcapOraclePrice, + wethOraclePrice, + daiOraclePrice, + aaveOraclePrice, + linkOraclePrice, + wbtcOraclePrice, + usdcOraclePrice, + ] = await ethcallProvider?.all([ + tcapPriceCall, + wethOraclePriceCall, + daiOraclePriceCall, + aaveOraclePriceCall, + linkOraclePriceCall, + wbtcOraclePriceCall, + usdcOraclePriceCall, + ]); + const marketCap = tcapOraclePrice.mul(10000000000); + + console.log("tcap price: ", ethers.utils.formatEther(tcapOraclePrice)); + console.log("tcap market cap: ", ethers.utils.formatEther(marketCap)); + + setOraclePrices({ + jpegzOraclePrice: "0", + jpegzMarketCap: "0", + tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), + tcapMarketCap: ethers.utils.formatEther(marketCap), + wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), + daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), + aaveOraclePrice: ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)), + linkOraclePrice: ethers.utils.formatEther(linkOraclePrice.mul(10000000000)), + uniOraclePrice: "0", + snxOraclePrice: "0", + maticOraclePrice: "0", + wbtcOraclePrice: ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)), + usdcOraclePrice: ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)), + }); + }; + + const loadPricesOptimism = async () => { + const tcapPriceCall = await optimismContracts.tcapOracleRead?.getLatestAnswer(); + const wethOraclePriceCall = await optimismContracts.wethOracleRead?.getLatestAnswer(); + const daiOraclePriceCall = await optimismContracts.daiOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = await optimismContracts.linkOracleRead?.getLatestAnswer(); + const snxOraclePriceCall = await optimismContracts.snxOracleRead?.getLatestAnswer(); + const uniOraclePriceCall = await optimismContracts.uniOracleRead?.getLatestAnswer(); + + let tcapOraclePrice = BigNumber.from(0); + let wethOraclePrice = BigNumber.from(0); + let daiOraclePrice = BigNumber.from(0); + let linkOraclePrice = BigNumber.from(0); + let snxOraclePrice = BigNumber.from(0); + let uniOraclePrice = BigNumber.from(0); + + // @ts-ignore + [ + tcapOraclePrice, + wethOraclePrice, + daiOraclePrice, + linkOraclePrice, + snxOraclePrice, + uniOraclePrice, + ] = await ethcallProvider?.all([ + tcapPriceCall, + wethOraclePriceCall, + daiOraclePriceCall, + linkOraclePriceCall, + snxOraclePriceCall, + uniOraclePriceCall, + ]); + + const marketCap = tcapOraclePrice.mul(10000000000); + setOraclePrices({ + jpegzOraclePrice: "0", + jpegzMarketCap: "0", + tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), + tcapMarketCap: ethers.utils.formatEther(marketCap), + wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), + daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), + aaveOraclePrice: "0", + linkOraclePrice: ethers.utils.formatEther(linkOraclePrice.mul(10000000000)), + uniOraclePrice: ethers.utils.formatEther(uniOraclePrice.mul(10000000000)), + snxOraclePrice: ethers.utils.formatEther(snxOraclePrice.mul(10000000000)), + maticOraclePrice: "0", + wbtcOraclePrice: "0", + usdcOraclePrice: "0", + }); + }; + const loadPrices = async () => { - if (oracles && ethcallProvider && validOracles(chainId, oracles)) { - await ethcallProvider.init(); - const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); - - const ethcalls = [daiOraclePriceCall]; - if (isInLayer1(chainId)) { - const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - ethcalls.push(tcapPriceCall); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(aaveOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(usdcOraclePriceCall); - ethcalls.push(wbtcOraclePriceCall); + if (arbitrumContracts && ethereumContracts && optimismContracts) { + if (isArbitrum(chainId) && validOracles(chainId, arbitrumContracts)) { + await loadPricesArbitrum(); } - if (isOptimism(chainId)) { - const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); - const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); - ethcalls.push(tcapPriceCall); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(snxOraclePriceCall); - ethcalls.push(uniOraclePriceCall); + if (isInLayer1(chainId) && validOracles(chainId, ethereumContracts)) { + await loadPricesEthereum(); } - if (isPolygon(chainId)) { - const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - ethcalls.push(tcapPriceCall); - ethcalls.push(maticOraclePriceCall); - ethcalls.push(wbtcOraclePriceCall); + if (isOptimism(chainId) && validOracles(chainId, optimismContracts)) { + await loadPricesOptimism(); } - if (isArbitrum(chainId)) { - const jpegzPriceCall = await oracles.jpegzOracleRead?.getLatestAnswer(); - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - ethcalls.push(jpegzPriceCall); - ethcalls.push(wethOraclePriceCall); - } - - let jpegzOraclePrice = BigNumber.from(0); - let tcapOraclePrice = BigNumber.from(0); - let wethOraclePrice = BigNumber.from(0); - let daiOraclePrice = BigNumber.from(0); - let aaveOraclePrice = BigNumber.from(0); - let linkOraclePrice = BigNumber.from(0); - let snxOraclePrice = BigNumber.from(0); - let uniOraclePrice = BigNumber.from(0); - let maticOraclePrice = BigNumber.from(0); - let wbtcOraclePrice = BigNumber.from(0); - let usdcOraclePrice = BigNumber.from(0); - - if (isInLayer1(chainId)) { - // @ts-ignore - [ - daiOraclePrice, - tcapOraclePrice, - wethOraclePrice, - aaveOraclePrice, - linkOraclePrice, - usdcOraclePrice, - wbtcOraclePrice, - ] = await ethcallProvider?.all(ethcalls); - } else if (isOptimism(chainId)) { - // @ts-ignore - [ - daiOraclePrice, - tcapOraclePrice, - wethOraclePrice, - linkOraclePrice, - snxOraclePrice, - uniOraclePrice, - ] = await ethcallProvider?.all(ethcalls); - } else if (isPolygon(chainId)) { - // @ts-ignore - [daiOraclePrice, tcapOraclePrice, maticOraclePrice, wbtcOraclePrice] = - await ethcallProvider?.all(ethcalls); - } else { - // @ts-ignore - [daiOraclePrice, jpegzOraclePrice, wethOraclePrice] = await ethcallProvider?.all(ethcalls); - } - - setOraclePrices({ - jpegzOraclePrice: ethers.utils.formatEther(jpegzOraclePrice), - tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), - wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), - daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), - aaveOraclePrice: ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)), - linkOraclePrice: ethers.utils.formatEther(linkOraclePrice.mul(10000000000)), - uniOraclePrice: ethers.utils.formatEther(uniOraclePrice.mul(10000000000)), - snxOraclePrice: ethers.utils.formatEther(snxOraclePrice.mul(10000000000)), - maticOraclePrice: ethers.utils.formatEther(maticOraclePrice.mul(10000000000)), - wbtcOraclePrice: ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)), - usdcOraclePrice: ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)), - }); + setLoadingPrices(false); } }; useEffect( () => { - loadPrices(); + if (ethcallProvider) { + loadPrices(); + } }, // eslint-disable-next-line [chainId, ethcallProvider] ); - return oraclePrices; + return [oraclePrices, loadingPrices]; }; diff --git a/src/hooks/useVault.tsx b/src/hooks/useVault.tsx index 865dd4d..591f3ef 100644 --- a/src/hooks/useVault.tsx +++ b/src/hooks/useVault.tsx @@ -27,7 +27,7 @@ export const useVault = ( assetSymbol: string, collateralSymbol: string, isHardVault: boolean -): contractsType => { +): [contractsType, boolean] => { const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); const oracles = useContext(oraclesContext); @@ -35,6 +35,7 @@ export const useVault = ( const vaults = useContext(vaultsContext); const tokens = useContext(tokensContext); + const [loadingVault, setLoadingVault] = useState(true); const [currentAsset, setCurrentAsset] = useState(null); const [currentCollateral, setCurrentCollateral] = useState(null); const [currentVault, setCurrentVault] = useState(null); @@ -167,20 +168,24 @@ export const useVault = ( validHardVaults(currentNetwork.chainId || NETWORKS.mainnet.chainId, hardVaults) ) { await loadContracts(); + setLoadingVault(false); } }; load(); // eslint-disable-next-line }, [signer.signer, collateralSymbol, isHardVault]); - return { - currentAsset, - currentCollateral, - currentVault, - currentAssetRead, - currentCollateralRead, - currentVaultRead, - currentCollateralOracleRead: currentOracleRead, - currentAssetOracleRead, - }; + return [ + { + currentAsset, + currentCollateral, + currentVault, + currentAssetRead, + currentCollateralRead, + currentVaultRead, + currentCollateralOracleRead: currentOracleRead, + currentAssetOracleRead, + }, + loadingVault, + ]; }; diff --git a/src/state/ArbitrumContext.tsx b/src/state/ArbitrumContext.tsx new file mode 100644 index 0000000..462e3bb --- /dev/null +++ b/src/state/ArbitrumContext.tsx @@ -0,0 +1,22 @@ +import React from "react"; +import { Contract } from "ethers-multicall"; + +export interface IArbitrumContext { + jpegzTokenRead?: Contract; + setCurrentJpegzTokenRead: (currentTokenRead: Contract) => void; + jpegzOracleRead?: Contract; + setCurrentJpegzOracleRead: (currentOracle: Contract) => void; + wethOracleRead?: Contract; + setCurrentWethOracleRead: (currentOracle: Contract) => void; + daiOracleRead?: Contract; + setCurrentDaiOracleRead: (currentOracle: Contract) => void; +} + +export const ARBITRUM_DEFAULT_VALUE = { + setCurrentJpegzTokenRead: () => {}, + setCurrentJpegzOracleRead: () => {}, + setCurrentWethOracleRead: () => {}, + setCurrentDaiOracleRead: () => {}, +}; + +export const arbitrumContext = React.createContext(ARBITRUM_DEFAULT_VALUE); diff --git a/src/state/EthereumContext.tsx b/src/state/EthereumContext.tsx new file mode 100644 index 0000000..67f92c7 --- /dev/null +++ b/src/state/EthereumContext.tsx @@ -0,0 +1,40 @@ +import React from "react"; +import { Contract } from "ethers-multicall"; + +export interface IEthereumContext { + tcapTokenRead?: Contract; + setCurrentTcapTokenRead: (currentTokenRead: Contract) => void; + ctxTokenRead?: Contract; + setCurrentCtxTokenRead: (currentCtx: Contract) => void; + ctxPoolTokenRead?: Contract; + setCurrentCtxPoolTokenRead: (currentPoolTokenRead: Contract) => void; + tcapOracleRead?: Contract; + setCurrentTcapOracleRead: (currentOracle: Contract) => void; + wethOracleRead?: Contract; + setCurrentWethOracleRead: (currentOracle: Contract) => void; + daiOracleRead?: Contract; + setCurrentDaiOracleRead: (currentOracle: Contract) => void; + aaveOracleRead?: Contract; + setCurrentAaveOracleRead: (currentOracle: Contract) => void; + linkOracleRead?: Contract; + setCurrentLinkOracleRead: (currentOracle: Contract) => void; + wbtcOracleRead?: Contract; + setCurrentWbtcOracleRead: (currentOracle: Contract) => void; + usdcOracleRead?: Contract; + setCurrentUsdcOracleRead: (currentOracle: Contract) => void; +} + +export const ETHEREUM_DEFAULT_VALUE = { + setCurrentTcapTokenRead: () => {}, + setCurrentCtxTokenRead: () => {}, + setCurrentCtxPoolTokenRead: () => {}, + setCurrentTcapOracleRead: () => {}, + setCurrentWethOracleRead: () => {}, + setCurrentDaiOracleRead: () => {}, + setCurrentAaveOracleRead: () => {}, + setCurrentLinkOracleRead: () => {}, + setCurrentWbtcOracleRead: () => {}, + setCurrentUsdcOracleRead: () => {}, +}; + +export const ethereumContext = React.createContext(ETHEREUM_DEFAULT_VALUE); diff --git a/src/state/OptimismContext.tsx b/src/state/OptimismContext.tsx new file mode 100644 index 0000000..59725c4 --- /dev/null +++ b/src/state/OptimismContext.tsx @@ -0,0 +1,31 @@ +import React from "react"; +import { Contract } from "ethers-multicall"; + +export interface IOptimismContext { + tcapTokenRead?: Contract; + setCurrentTcapTokenRead: (currentTokenRead: Contract) => void; + tcapOracleRead?: Contract; + setCurrentTcapOracleRead: (currentOracleRead: Contract) => void; + wethOracleRead?: Contract; + setCurrentWethOracleRead: (currentOracleRead: Contract) => void; + daiOracleRead?: Contract; + setCurrentDaiOracleRead: (currentOracleRead: Contract) => void; + linkOracleRead?: Contract; + setCurrentLinkOracleRead: (currentOracleRead: Contract) => void; + snxOracleRead?: Contract; + setCurrentSnxOracleRead: (currentOracleRead: Contract) => void; + uniOracleRead?: Contract; + setCurrentUniOracleRead: (currentOracleRead: Contract) => void; +} + +export const OPTIMISM_DEFAULT_VALUE = { + setCurrentTcapTokenRead: () => {}, + setCurrentTcapOracleRead: () => {}, + setCurrentWethOracleRead: () => {}, + setCurrentDaiOracleRead: () => {}, + setCurrentLinkOracleRead: () => {}, + setCurrentSnxOracleRead: () => {}, + setCurrentUniOracleRead: () => {}, +}; + +export const optimismContext = React.createContext(OPTIMISM_DEFAULT_VALUE); diff --git a/src/state/index.tsx b/src/state/index.tsx index 144abcb..c988b2f 100644 --- a/src/state/index.tsx +++ b/src/state/index.tsx @@ -1,13 +1,19 @@ +export * from "./ArbitrumContext"; + export * from "./GovernanceContext"; export * from "./HardVaultsContext"; +export * from "./EthereumContext"; + export * from "./MushroomNftContext"; export * from "./NetworkContext"; export * from "./OraclesContext"; +export * from "./OptimismContext"; + export * from "./RewardsContext"; export * from "./SignerContext"; diff --git a/src/styles/app.scss b/src/styles/app.scss index 0c3467c..ce7ce5f 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -535,6 +535,27 @@ form { .spinner { margin: 5rem 50%; color: $highlight !important; + + &.small { + margin: 0.1rem 0.5rem; + padding: 0.5rem; + } + &.xsmall { + margin: 0.1rem 0.5rem; + padding: 0.4rem; + font-size: 0.4em; + height: 5px; + width: 5px; + } +} +.spinner-green { + color: $green !important; +} +.spinner-orange { + color: $orange !important; +} +.spinner-gray { + color: $light !important; } .info-message { diff --git a/src/styles/summary.scss b/src/styles/summary.scss index baff5bc..5776d36 100644 --- a/src/styles/summary.scss +++ b/src/styles/summary.scss @@ -9,7 +9,10 @@ padding: 3rem 2rem; padding-bottom: 2rem; display: flex; - + + .jpegz-icon { + width: 2.1rem; + } .spinner-container { padding-top: 3rem; width: 100%; @@ -165,8 +168,9 @@ } } - .protocol, .indexes, .balance { + .protocol, .indexes, .balance-container { width: 100%; + .detail { display: grid; grid-template-columns: 50% 50%; @@ -188,7 +192,7 @@ border-radius: 5px; } - .market-cap { + .market-cap, .total-supply { grid-column-start: 1; grid-column-end: 3; } @@ -221,8 +225,9 @@ color: $lighter; } } + svg { - width: 2rem; + width: 2.1rem; } .weth { height: 2.1rem; @@ -242,7 +247,31 @@ } } - .balance { + .balance-container { + .spinner { + margin: 3.7rem 50%; + } + .detail { + grid-template-columns: 100%; + .staked { + .value { + display: flex; + + &-separator { + margin: 0px 15px; + } + } + .number { + margin-bottom: 0rem; + } + } + } + .jpegz-icon { + width: 2.5rem; + } + svg { + width: 2.5rem; + } .warnings { padding: 1.5rem 0rem; &-vaults { diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 64c068d..39cf1db 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -239,7 +239,7 @@ flex-direction: row; align-items: center; justify-content: flex-end; - .tcap { + .tcap, .jpegz-icon { width: 30px; margin-right: 10px; } diff --git a/src/styles/mint2.scss b/src/styles/vault.scss similarity index 97% rename from src/styles/mint2.scss rename to src/styles/vault.scss index 88d000f..91b68ba 100644 --- a/src/styles/mint2.scss +++ b/src/styles/vault.scss @@ -22,6 +22,10 @@ width: 70%; } + .btn-dark { + background-color: $dark; + } + .btn:active { background-color: transparent; } @@ -233,9 +237,15 @@ align-items: center; margin-bottom: 0.6rem; - .choices { + .options-container { display: flex; - flex-direction: row; + flex-direction: column; + + .options-buttons { + display: flex; + flex-direction: row; + margin-top: 0.3rem; + } } .burn-fee { @@ -257,7 +267,7 @@ .dropdown { height: 100%; - width: 140px; + width: 160px; margin-right: 0.5rem; .dropdown-toggle { diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 08181e3..f12995e 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -4,8 +4,8 @@ import { Fragment, JsonFragment } from "@ethersproject/abi"; import { toast } from "react-toastify"; import successImg from "../assets/images/noti-success.png"; import errorImg from "../assets/images/noti-error.png"; -import { FEATURES, NETWORKS } from "./constants"; -import { IHardVaultsContext, IOraclesContext, IVaultsContext } from "../state"; +import { GRAPHQL_ENDPOINT, FEATURES, NETWORKS } from "./constants"; +import { IHardVaultsContext, IVaultsContext } from "../state"; export const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); @@ -122,11 +122,11 @@ export const notifyUser = async (tx: ethers.ContractTransaction, fn: any = () => toast.dismiss(); notificationTitle = "✔️ Transaction Confirmed!"; - notificationBody = "All set, please wait for another confirmation"; + notificationBody = "All set, transaction confirmed"; sendNotification(notificationTitle, notificationBody, 3000, fn, 1000, "success"); // In case the graph isn't updated on the first transaction, try to update on second transaction. - await tx.wait(2); - fn(); + // await tx.wait(2); + // fn(); } catch (error) { // catch error when vault screen changes in the middle of an update } @@ -365,21 +365,56 @@ export const getDefaultProvider = (chainId: number | undefined) => { return provider; }; -export const validOracles = (chainId: number, oracles: IOraclesContext): boolean => { - let valid = !isUndefined(oracles.daiOracleRead) && !isUndefined(oracles.tcapOracleRead); +export const getGraphqlEndPoint = (chainId: number) => { + let endPoint = GRAPHQL_ENDPOINT.mainnet; + switch (chainId) { + case NETWORKS.goerli.chainId: + endPoint = GRAPHQL_ENDPOINT.goerli; + break; + case NETWORKS.arbitrum.chainId: + endPoint = GRAPHQL_ENDPOINT.arbitrum; + break; + case NETWORKS.arbitrum_goerli.chainId: + endPoint = GRAPHQL_ENDPOINT.arbitrum_goerli; + break; + case NETWORKS.optimism.chainId: + endPoint = GRAPHQL_ENDPOINT.optimism; + break; + case NETWORKS.okovan.chainId: + endPoint = GRAPHQL_ENDPOINT.okovan; + break; + case NETWORKS.polygon.chainId: + endPoint = GRAPHQL_ENDPOINT.polygon; + break; + case NETWORKS.mumbai.chainId: + endPoint = GRAPHQL_ENDPOINT.mumbai; + break; + default: + endPoint = GRAPHQL_ENDPOINT.mainnet; + break; + } + + return endPoint; +}; + +export const validOracles = (chainId: number, oracles: any): boolean => { + let valid = !isUndefined(oracles.daiOracleRead); if (isInLayer1(chainId)) { valid = valid && + !isUndefined(oracles.tcapOracleRead) && !isUndefined(oracles.wethOracleRead) && !isUndefined(oracles.aaveOracleRead) && !isUndefined(oracles.linkOracleRead) && !isUndefined(oracles.usdcOracleRead) && !isUndefined(oracles.wbtcOracleRead); } + if (isOptimism(chainId)) { valid = valid && + !isUndefined(oracles.tcapOracleRead) && !isUndefined(oracles.wethOracleRead) && !isUndefined(oracles.linkOracleRead) && !isUndefined(oracles.snxOracleRead) && @@ -389,6 +424,11 @@ export const validOracles = (chainId: number, oracles: IOraclesContext): boolean if (isPolygon(chainId)) { valid = valid && !isUndefined(oracles.maticOracle) && !isUndefined(oracles.maticOracleRead); } + + if (isArbitrum(chainId)) { + valid = valid && !isUndefined(oracles.jpegzOracleRead) && !isUndefined(oracles.wethOracleRead); + } + return valid; }; From 9f34db4db9ee5ce18003abcdedc3dfeaeee4d191 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 11 Jan 2023 23:29:57 -0600 Subject: [PATCH 211/278] vault reset fields when chaging collaterals --- src/components/Vaults/vault/index.tsx | 4 +++- src/styles/app.scss | 5 +++++ src/styles/summary.scss | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index e9334be..927b123 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -1120,6 +1120,8 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const handleRadioBtnChange = async (value: string) => { setVaultMode(value); // setCollaterals(value); + setActiveAction("add"); + resetFields(); setVaultData({ vaultId: "0", assetSymbol: vaultData.assetSymbol, @@ -1136,7 +1138,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ) { keepVaultId = value === TOKENS_SYMBOLS.ETH || value === TOKENS_SYMBOLS.WETH; } - + resetFields(); setVaultData({ vaultId: !keepVaultId ? "0" : vaultData.vaultId, assetSymbol: vaultData.assetSymbol, diff --git a/src/styles/app.scss b/src/styles/app.scss index ce7ce5f..16078a4 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -410,6 +410,11 @@ html, width: 390px; text-align: left; } +.ttip-features > .tooltip-inner { + max-width: 550px; + width: 550px; + text-align: left; +} .univ3-expired-tooltip > .tooltip-inner { min-width: 300px; diff --git a/src/styles/summary.scss b/src/styles/summary.scss index 5776d36..8308a89 100644 --- a/src/styles/summary.scss +++ b/src/styles/summary.scss @@ -17,6 +17,7 @@ padding-top: 3rem; width: 100%; } + h2 { font-size: 1.375rem; margin-bottom: 0rem; From fed27290ee5f48576f3a1ef85614c6ea761465f0 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 12 Jan 2023 15:44:43 -0600 Subject: [PATCH 212/278] fixed loading when wallet not connected --- src/App.tsx | 2 +- src/assets/images/x-symbol.svg | 13 +-- src/components/Governance/Delegators.tsx | 81 ++++++++++-------- src/components/Governance/StakerStats.tsx | 8 +- src/components/Header.tsx | 2 +- src/components/Sidebar.tsx | 85 +++++++++---------- src/components/Warnings/FarmWarning.tsx | 27 ++++++ src/components/Warnings/KeepersWarning.tsx | 30 +++++++ .../Warnings/SewageFruitzWarning.tsx | 30 +++++++ .../VaultsWarning.tsx} | 10 +-- src/components/Warnings/index.tsx | 14 +++ src/hooks/useBalances.tsx | 3 +- src/styles/app.scss | 15 ++++ 13 files changed, 216 insertions(+), 104 deletions(-) create mode 100644 src/components/Warnings/FarmWarning.tsx create mode 100644 src/components/Warnings/KeepersWarning.tsx create mode 100644 src/components/Warnings/SewageFruitzWarning.tsx rename src/components/{Warnings.tsx => Warnings/VaultsWarning.tsx} (71%) create mode 100644 src/components/Warnings/index.tsx diff --git a/src/App.tsx b/src/App.tsx index a52b294..d327069 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -21,7 +21,7 @@ import Delegators from "./components/Governance/Delegators"; import MushroomNft from "./components/MushroomNft"; import Loading from "./components/Loading"; import Farm from "./components/Farm"; -import Warnings from "./components/Warnings"; +import { Warnings } from "./components/Warnings/index"; import * as hooks from "./hooks"; import { governanceContext, diff --git a/src/assets/images/x-symbol.svg b/src/assets/images/x-symbol.svg index 7e08939..e3f22c7 100644 --- a/src/assets/images/x-symbol.svg +++ b/src/assets/images/x-symbol.svg @@ -1,12 +1 @@ - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/components/Governance/Delegators.tsx b/src/components/Governance/Delegators.tsx index acc320e..510edc1 100644 --- a/src/components/Governance/Delegators.tsx +++ b/src/components/Governance/Delegators.tsx @@ -8,9 +8,9 @@ import KeeperForm from "./KeeperForm"; import Delegate from "./Delegate"; import Withdraw from "./Withdraw"; import StakerStats from "./StakerStats"; -import { governanceContext, signerContext } from "../../state"; -import { API_ENDPOINT, FEATURES } from "../../utils/constants"; -// import { delegatorsInfo } from "./data"; +import { governanceContext, networkContext, signerContext } from "../../state"; +import { API_ENDPOINT } from "../../utils/constants"; +import { isInLayer1 } from "../../utils/utils"; type props = { currentSignerAddress: string; @@ -59,6 +59,7 @@ const Delegators = ({ currentSignerAddress }: props) => { const [withdrawTimes, setWithdrawTimes] = useState([]); const [updateData, setUpdateData] = useState(false); const [updateTimes, setUpdateTimes] = useState(false); + const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); const governance = useContext(governanceContext); @@ -127,33 +128,37 @@ const Delegators = ({ currentSignerAddress }: props) => { }; useEffect(() => { - const loadKeepersFromDB = async (currentDelegators: any) => { - await fetch(`${API_ENDPOINT}/cryptkeeper/all`, { - method: "GET", - }) - .then((response) => response.json()) - .then((responseJson) => { - buildKeeperInfo(responseJson, currentDelegators); + const loadData = async () => { + const loadKeepersFromDB = async (currentDelegators: any) => { + await fetch(`${API_ENDPOINT}/cryptkeeper/all`, { + method: "GET", }) - .catch((error) => { - console.error(error); - setKeepersInfo([]); - }); - }; - const loadKeepers = async () => { - if (governance.delegatorFactoryRead) { - if (data) { - const currentDelegators: any[] = []; - await data.delegators.forEach((d: any) => { - currentDelegators.push(d); + .then((response) => response.json()) + .then((responseJson) => { + buildKeeperInfo(responseJson, currentDelegators); + }) + .catch((error) => { + console.error(error); + setKeepersInfo([]); }); - setKeepers(currentDelegators); - loadKeepersFromDB(currentDelegators); + }; + const loadKeepers = async () => { + if (governance.delegatorFactoryRead) { + if (data) { + const currentDelegators: any[] = []; + await data.delegators.forEach((d: any) => { + currentDelegators.push(d); + }); + setKeepers(currentDelegators); + loadKeepersFromDB(currentDelegators); + } } - } + }; + await loadKeepers(); }; - loadKeepers(); - + if (isInLayer1(currentNetwork.chainId)) { + loadData(); + } /* if (FEATURES.KEEPERS_API) { loadKeepersFromDB(); } else { @@ -258,7 +263,12 @@ const Delegators = ({ currentSignerAddress }: props) => {
Sort by:
handleSortingChange(eventKey || "0")}> - +
{currentSorting.name}
@@ -273,13 +283,16 @@ const Delegators = ({ currentSignerAddress }: props) => {
- {signer.signer && FEATURES.KEEPERS_API && ( -
- -
- )} +
+ +
{keepersInfo.map((keeperInfo, index) => { diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 3cc516f..e433845 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -3,8 +3,8 @@ import { Button } from "react-bootstrap"; import { ethers } from "ethers"; import Table from "react-bootstrap/esm/Table"; import NumberFormat from "react-number-format"; -import { governanceContext, signerContext } from "../../state"; -import { errorNotification, notifyUser } from "../../utils/utils"; +import { governanceContext, networkContext, signerContext } from "../../state"; +import { errorNotification, isInLayer1, notifyUser } from "../../utils/utils"; const sixMonthCtxRewardAmount = 12654; const apyShowDate = new Date(1633654800 * 1000); @@ -17,6 +17,7 @@ type props = { }; const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: props) => { + const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); const governance = useContext(governanceContext); const [totalStaked, setTotalStaked] = useState("0.0"); @@ -29,7 +30,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro useEffect(() => { async function load() { let currentWT = waitTime; - if (signer.signer && governance.delegatorFactoryRead) { + if (signer.signer && isInLayer1(currentNetwork.chainId) && governance.delegatorFactoryRead) { const currentSignerAddress = await signer.signer.getAddress(); const totalSupplyCall = await governance.delegatorFactoryRead?.totalSupply(); const currentStakeCall = await governance.delegatorFactoryRead?.balanceOf( @@ -154,6 +155,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro onClick={() => { claimRewards(); }} + disabled={!isInLayer1(currentNetwork.chainId)} > {t("claim")} diff --git a/src/components/Header.tsx b/src/components/Header.tsx index d87cb6e..82833bf 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -276,7 +276,7 @@ const Header = ({ signerAddress, isMobile }: props) => {
- <>{t("debt")} @@ -327,6 +324,7 @@ export const Vaults = ({ > {numberFormatStr(v.debt, 4, 4)} +
diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index e7bf5a6..e1c35d4 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -7,7 +7,6 @@ import { useLazyQuery, gql } from "@apollo/client"; import { useTranslation } from "react-i18next"; import "../../../styles/vault-monitoring.scss"; import { VaultPagination } from "./Pagination"; -import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; import { signerContext, hardVaultsContext, networkContext, vaultsContext } from "../../../state"; import { Vaults } from "./Vaults"; import { usePrices, useRatios } from "../../../hooks"; @@ -663,6 +662,13 @@ const Monitoring = ({ setVaultToUpdate }: props) => { }); }; + const IndexIcon = () => { + if (!isArbitrum(currentNetwork.chainId)) { + return ; + } + return ; + }; + return (
@@ -694,7 +700,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => {
<>{t("debt")}
- +
{numberFormatStr(vaultsTotals.debt, 4, 4)} diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index ee379a0..1ee0e29 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -109,6 +109,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const [removeCollateralUSD, setRemoveCollateralUSD] = useState("0"); const [mintTxt, setMintTxt] = useState("0"); const [mintUSD, setMintUSD] = useState("0"); + const [mintFee, setMintFee] = useState("0"); const [burnTxt, setBurnTxt] = useState("0"); const [burnUSD, setBurnUSD] = useState("0"); const [burnFee, setBurnFee] = useState("0"); @@ -333,8 +334,8 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { }; const isGasAsset = () => - (!isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === "ETH") || - (isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === "MATIC"); + (!isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === TOKENS_SYMBOLS.ETH) || + (isPolygon(currentNetwork.chainId) && vaultData.collateralSymbol === TOKENS_SYMBOLS.MATIC); const refresh = async () => { try { @@ -393,6 +394,27 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { } }; + // Mint, Burn fees + const calculateMintFee = async (amount: string) => { + const currentMintFee = await currentVault?.getMintFee(ethers.utils.parseEther(amount)); + const increasedFee = currentMintFee.add(currentMintFee.div(100)).toString(); + + return increasedFee; + }; + + const calculateBurnFee = async (amount: string) => { + let increasedFee = BigNumber.from("0"); + if (!isArbitrum(currentNetwork.chainId)) { + const currentBurnFee = await currentVault?.getFee(ethers.utils.parseEther(amount)); + increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + } else { + const currentBurnFee = await currentVault?.getBurnFee(ethers.utils.parseEther(amount)); + increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + } + + return increasedFee; + }; + // forms const isMinRequiredTcap = (amount: number, isMint: boolean): boolean => { if (isHardMode()) { @@ -498,6 +520,12 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ); changeVault(r); setMintUSD(usd.toString()); + + if (isArbitrum(currentNetwork.chainId)) { + const increasedFee = await calculateMintFee(event.target.value); + const ethFee = ethers.utils.formatEther(increasedFee); + setMintFee(ethFee.toString()); + } } else { changeVault(0, false); setMintUSD("0"); @@ -535,10 +563,8 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ); changeVault(r); setBurnUSD(usd.toString()); - const currentBurnFee = await currentVault?.getFee( - ethers.utils.parseEther(event.target.value) - ); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + + const increasedFee = await calculateBurnFee(event.target.value); const ethFee = ethers.utils.formatEther(increasedFee); setBurnFee(ethFee.toString()); } else { @@ -691,14 +717,23 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setLoadingMax(false); }; - const mintTCAP = async () => { + const mintIndex = async () => { if (mintTxt && parseFloat(mintTxt) > 0) { if (isMinRequiredTcap(parseFloat(mintTxt), true)) { setBtnDisabled(true); try { const amount = ethers.utils.parseEther(mintTxt); - const tx = await currentVault?.mint(amount); - notifyUser(tx, refresh); + if (!isArbitrum(currentNetwork.chainId)) { + const tx = await currentVault?.mint(amount); + notifyUser(tx, refresh); + } else { + const increasedFee = await calculateBurnFee(mintTxt); + const ethFee = ethers.utils.formatEther(increasedFee); + setMintFee(ethFee.toString()); + console.log("ethFee:", ethFee); + const tx = await currentVault?.mint(amount, { value: BigNumber.from(increasedFee) }); + notifyUser(tx, refresh); + } } catch (error) { console.error(error); if (error.code === 4001) { @@ -718,7 +753,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { } }; - const safeMintTCAP = async (e: React.MouseEvent) => { + const safeMintIndex = async (e: React.MouseEvent) => { e.preventDefault(); setLoadingMax(true); const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); @@ -736,6 +771,13 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { if (!usd) { usd = 0; } + + if (isArbitrum(currentNetwork.chainId)) { + const increasedFee = await calculateMintFee(safeMint.toString()); + const ethFee = ethers.utils.formatEther(increasedFee); + setMintFee(ethFee.toString()); + } + const newDebt = safeMint + parseFloat(vaultDebt); const r = await getRatio(vaultCollateral, currentPrice, newDebt.toString(), currentAssetPrice); changeVault(r); @@ -743,13 +785,12 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setLoadingMax(false); }; - const burnTCAP = async () => { + const burnIndex = async () => { if (burnTxt && parseFloat(burnTxt) > 0) { const amount = ethers.utils.parseEther(burnTxt); setBtnDisabled(true); try { - const currentBurnFee = await currentVault?.getFee(amount); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const increasedFee = await calculateBurnFee(burnTxt); const ethFee = ethers.utils.formatEther(increasedFee); setBurnFee(ethFee.toString()); @@ -772,7 +813,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { } }; - const maxBurnTCAP = async (e: React.MouseEvent) => { + const maxBurnIndex = async (e: React.MouseEvent) => { e.preventDefault(); setLoadingMax(true); const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); @@ -806,8 +847,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setBurnUSD(usd.toString()); if (balanceFormat !== "0") { - const currentBurnFee = await currentVault?.getFee(balance); - const increasedFee = currentBurnFee.add(currentBurnFee.div(100)).toString(); + const increasedFee = await calculateBurnFee(balance); const ethFee = ethers.utils.formatEther(increasedFee); setBurnFee(ethFee.toString()); } else { @@ -897,6 +937,38 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ); + const BurnFeeLabel = (className: string, isBurning: boolean) => ( + + {isBurning ? ( + <> + {t("vault.debt.fee")}: {burnFee} + + ) : ( + <>Mint Fee: {mintFee} + )} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} + + } + > +
+ {isBurning ? <>{t("vault.debt.fee")}: : "Mint Fee: "} + {" "} + {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} +
+
+ ); + const MintAsset = () => ( @@ -909,7 +981,12 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { onFocus={onFocusMint} onBlur={onBlurMint} /> - @@ -923,38 +1000,10 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { decimalScale={2} /> + {BurnFeeLabel("burn-fee2", false)} ); - const BurnFeeLabel = (className: string) => ( - - <> - {t("vault.debt.fee")}: {burnFee} {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} - - - } - > -
- - <>{t("vault.debt.fee")}: - - {" "} - {isPolygon(currentNetwork.chainId) ? "MATIC" : "ETH"} -
-
- ); - const BurnAsset = () => ( @@ -967,7 +1016,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { onFocus={onFocusBurn} onBlur={onBlurBurn} /> - @@ -981,7 +1030,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { decimalScale={2} /> - {BurnFeeLabel("burn-fee2")} + {BurnFeeLabel("burn-fee2", true)} ); @@ -1022,13 +1071,13 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { } if (activeAction === "mint") { return ( - ); } return ( - ); @@ -1313,7 +1362,10 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { - {activeAction === actions[3] && BurnFeeLabel("burn-fee")} + {activeAction === actions[2] && + isArbitrum(currentNetwork.chainId) && + BurnFeeLabel("burn-fee", false)} + {activeAction === actions[3] && BurnFeeLabel("burn-fee", true)}
{ActionControls()}
@@ -1325,7 +1377,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => {

Date: Thu, 19 Jan 2023 16:18:47 -0600 Subject: [PATCH 217/278] added new jpegz contracts --- src/components/Header.tsx | 11 +++++++++++ src/components/Sidebar.tsx | 12 ++++++------ src/contracts/cryptex.json | 12 ++++++------ src/styles/header.scss | 8 ++++++++ 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 923bc3c..49094e3 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -17,6 +17,7 @@ import { isArbitrum, } from "../utils/utils"; import { NETWORKS, FEATURES } from "../utils/constants"; +import { ReactComponent as LogoutIcon } from "../assets/images/welcome/logout.svg"; import { ReactComponent as ETHIcon } from "../assets/images/graph/weth.svg"; import { ReactComponent as OPTIMISMIcon } from "../assets/images/graph/optimism.svg"; import { ReactComponent as POLYGONIcon } from "../assets/images/polygon2.svg"; @@ -297,6 +298,16 @@ const Header = ({ signerAddress, isMobile }: props) => {

+ {/* */}
diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index d130419..fa09b74 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -1,14 +1,14 @@ -import React, { useContext, useEffect, useState } from "react"; +import React, { useEffect, useState } from "react"; import Nav from "react-bootstrap/esm/Nav"; import { GiSpottedMushroom } from "react-icons/gi"; import "../styles/sidebar.scss"; import { Link, useLocation } from "react-router-dom"; -import { Web3ModalContext } from "../state/Web3ModalContext"; +// import { Web3ModalContext } from "../state/Web3ModalContext"; import { ReactComponent as Logo } from "../assets/images/favicon.svg"; import { ReactComponent as MenuLogo } from "../assets/images/menu.svg"; import { ReactComponent as DashboardIcon } from "../assets/images/welcome/dashboard.svg"; import { ReactComponent as VaultIcon } from "../assets/images/welcome/vault.svg"; -import { ReactComponent as LogoutIcon } from "../assets/images/welcome/logout.svg"; +// import { ReactComponent as LogoutIcon } from "../assets/images/welcome/logout.svg"; import { ReactComponent as StakeIcon } from "../assets/images/welcome/stake.svg"; import { ReactComponent as FarmIcon } from "../assets/images/welcome/farm.svg"; @@ -51,7 +51,7 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { break; } const [active, setActive] = useState(activeVal); - const web3Modal = useContext(Web3ModalContext); + // const web3Modal = useContext(Web3ModalContext); useEffect( () => { @@ -143,7 +143,7 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { - + {/* { @@ -155,7 +155,7 @@ const Sidebar = ({ showSidebar, setShowSidebar, isMobile }: props) => { Disconnect - + */} ); diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index ac2a8ce..1c83856 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -85056,7 +85056,7 @@ "chainId": "421613", "contracts": { "DAI": { - "address": "0x630c6B571ba97081215a10690364eF352AA98d20", + "address": "0xe8BFaB95180CAAAB795cdD5c2d5Dd4F35bF3f181", "abi": [ { "inputs": [], @@ -86957,7 +86957,7 @@ ] }, "JPEGZ": { - "address": "0x17582E17C2e06Bf1A7FE0Fd83f3cE6f4AF1DD218", + "address": "0x7E1bb2f2c2773490598b9E9bA592079dD73E788b", "abi": [ { "inputs": [ @@ -87538,7 +87538,7 @@ ] }, "JPEGZOracle": { - "address": "0xc58328b0aaE23449CAC2f6157C2d0FAbF0408047", + "address": "0xDB0d2fd6d01B12c9444FBdf852A80E27966bA9C9", "abi": [ { "inputs": [ @@ -88601,7 +88601,7 @@ ] }, "WETH": { - "address": "0xfe46F29B9fC3d83d09336dDe9195553aDb812A16", + "address": "0x2B5a9D411F631491CE71127B1600b26215C63C14", "abi": [ { "anonymous": false, @@ -88886,7 +88886,7 @@ ] }, "WETHOracle": { - "address": "0xFE1f104F05c9d75005e2972b82817CAA0618a3BF", + "address": "0xaf26aA0F3b19D156499BdC26d3fAA88530024c31", "abi": [ { "inputs": [ @@ -89127,7 +89127,7 @@ ] }, "WETHVaultHandler": { - "address": "0xC5806761dB5Ed00D44709fe1d7e6F4416B9C47f6", + "address": "0x6c913fa678C81c567A11EdF19E06bE758DBeFe2D", "abi": [ { "inputs": [ diff --git a/src/styles/header.scss b/src/styles/header.scss index b032cc1..c2e65a5 100644 --- a/src/styles/header.scss +++ b/src/styles/header.scss @@ -156,6 +156,14 @@ margin-top:-5px; } + .logout { + border: 0.5px solid $highlight; + width: auto; + height: 2.7rem; + border-radius: 5px; + margin-left: 10px; + } + @media (max-width: 769px) { .address { font-size: 1rem; From 51b5ae707b9ad27e1c6852a17bfdf3464ab8a224 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 19 Jan 2023 18:59:08 -0600 Subject: [PATCH 218/278] added jpegz and fixed loading jpegz vaults --- src/components/Vaults/monitoring/index.tsx | 13 +- src/components/Vaults/vault/index.tsx | 184 +++++++++++++-------- src/styles/app.scss | 5 + src/styles/vault.scss | 4 + 4 files changed, 131 insertions(+), 75 deletions(-) diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index e1c35d4..9fae6c2 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -322,19 +322,16 @@ const Monitoring = ({ setVaultToUpdate }: props) => { isHardVault: boolean, decimals: number ) => { + const indexPrice = !isArbitrum(currentNetwork.chainId) + ? prices.tcapOraclePrice + : prices.jpegzOraclePrice; const collateralText = ethers.utils.formatUnits(collateralWei, decimals); const debtText = ethers.utils.formatEther(debtWei); const collateralPrice = getCollateralPrice(prices, symbol); const collateralUSD = toUSD(collateralText, collateralPrice); - const debtUSD = toUSD(debtText, prices.tcapOraclePrice || "0"); + const debtUSD = toUSD(debtText, indexPrice || "0"); const minRatio = getMinRatio(ratios, symbol, isHardVault); - - const ratio = getRatio2( - collateralText, - collateralPrice, - debtText, - prices.tcapOraclePrice || "1" - ); + const ratio = getRatio2(collateralText, collateralPrice, debtText, indexPrice || "1"); let status = VAULT_STATUS.liquidation; if (parseFloat(collateralText) < 0.0000000001) { diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 1ee0e29..e2301b9 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -79,7 +79,6 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const [activeAction, setActiveAction] = useState("add"); const [refreshVault, setRefreshVault] = useState(false); - // Vault Data // Vault Data const [assetOptions, setAssetOptions] = useState>([]); const [collateralOptions, setCollateralOptions] = useState>([]); @@ -87,9 +86,9 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const [currentVaultId, setCurrentVaultId] = useState("0"); const [isApproved, setIsApproved] = useState(false); const [vaultDebt, setVaultDebt] = useState("0"); - // const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); + const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); const [vaultCollateral, setVaultCollateral] = useState("0"); - // const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); + const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); const [vaultRatio, setVaultRatio] = useState("0"); const [tempRatio, setTempRatio] = useState(""); const [minRatio, setMinRatio] = useState("0"); @@ -97,9 +96,10 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { // General Data const isHardMode = () => vaultMode === "hard"; - const [assetBalance, setAssetBalance] = useState("0"); - // const [tokenBalanceUSD, setTokenBalanceUSD] = useState("0"); - const [tokenBalance, setTokenBalance] = useState("0"); + const [indexBalance, setIndexBalance] = useState("0"); + const [indexBalanceUSD, setIndexBalanceUSD] = useState("0"); + const [collateralBalance, setCollateralBalance] = useState("0"); + const [collateralBalanceUSD, setCollateralBalanceUSD] = useState("0"); const [tokenBalanceDecimals, setTokenBalanceDecimals] = useState(2); // Inputs @@ -163,7 +163,10 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { async function loadVault() { setIsLoading(true); - let balance; + let cBalance; + let iBalance; + let currentIndexPrice = "0"; + let currentCollateralPrice = "0"; const provider = getDefaultProvider(currentNetwork.chainId || NETWORKS.mainnet.chainId); let currentVaultData: any; // @ts-ignore @@ -181,9 +184,9 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { if (vaultData.collateralSymbol !== TOKENS_SYMBOLS.ETH) { // @ts-ignore - balance = await currentCollateral.balanceOf(currentAddress); + cBalance = await currentCollateral.balanceOf(currentAddress); } else { - balance = await provider.getBalance(currentAddress); + cBalance = await provider.getBalance(currentAddress); } let decimals = 18; @@ -206,29 +209,37 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const currentRatioCall = await currentVaultRead.getVaultRatio(currentVaultData.vaultId); // @ts-ignore - // const currentAssetPriceCall = await currentAssetOracleRead?.getLatestAnswer(); + const currentIndexPriceCall = await currentAssetOracleRead?.getLatestAnswer(); // @ts-ignore // const decimalsCall = await currentCollateralRead.decimals(); // @ts-ignore - // const currentCollateralPriceCall = await currentCollateralOracleRead.getLatestAnswer(); + const currentCollateralPriceCall = await currentCollateralOracleRead.getLatestAnswer(); // @ts-ignore const currentMinRatioCall = await currentVaultRead.ratio(); // @ts-ignore - const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); + const currentIndexBalanceCall = await currentAssetRead?.balanceOf(currentAddress); // @ts-ignore - const [allowance, currentRatio, currentMinRatio, currentAssetBalance] = - await signer.ethcallProvider?.all([ - allowanceCall, - currentRatioCall, - // currentAssetPriceCall, - currentMinRatioCall, - currentAssetBalanceCall, - ]); - // currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + const [ + allowance, + currentRatio, + currentMinRatio, + currentIndexBalance, + currentIndexPriceVal, + currentCollateralPriceVal, + ] = await signer.ethcallProvider?.all([ + allowanceCall, + currentRatioCall, + currentMinRatioCall, + currentIndexBalanceCall, + currentIndexPriceCall, + currentCollateralPriceCall, + ]); + currentIndexPrice = ethers.utils.formatEther(currentIndexPriceVal); + currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); - const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); - setAssetBalance(cBalance); + iBalance = ethers.utils.formatUnits(currentIndexBalance, 18); + setIndexBalance(iBalance); if (!allowance.isZero() || vaultData.collateralSymbol === TOKENS_SYMBOLS.ETH) { const safeValue = isHardMode() ? 20 : 50; @@ -249,14 +260,13 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); setVaultCollateral(parsedCollateral); - // const usdCollateral = toUSD(currentCollateralPrice, parsedCollateral); - // setVaultCollateralUSD(usdCollateral.toString()); + const usdCollateral = toUSD(currentCollateralPrice, parsedCollateral); + setVaultCollateralUSD(usdCollateral.toString()); - // const currentAssetPriceFormat = ethers.utils.formatEther(currentAssetPrice); const parsedDebt = ethers.utils.formatEther(debt); setVaultDebt(parsedDebt); - // const usdAsset = toUSD(currentAssetPriceFormat, parsedDebt); - // setVaultDebtUSD(usdAsset.toString()); + const usdIndex = toUSD(currentIndexPrice, parsedDebt); + setVaultDebtUSD(usdIndex.toString()); } else { setText(t("vault.approve-text", { asset: "Index" })); setTitle(t("vault.approve")); @@ -266,19 +276,23 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { // @ts-ignore // const decimalsCall = await currentCollateralRead.decimals(); // @ts-ignore - // const currentPriceCall = await currentCollateralOracleRead.getLatestAnswer(); + const currentPriceCall = await currentCollateralOracleRead.getLatestAnswer(); // @ts-ignore - const currentAssetBalanceCall = await currentAssetRead?.balanceOf(currentAddress); - + const currentIndexBalanceCall = await currentAssetRead?.balanceOf(currentAddress); // @ts-ignore - const [currentAssetBalance] = await signer.ethcallProvider?.all([ - // currentPriceCall, - currentAssetBalanceCall, - ]); - // currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + const currentIndexPriceCall = await currentAssetOracleRead?.getLatestAnswer(); - const cBalance = ethers.utils.formatUnits(currentAssetBalance, 18); - setAssetBalance(cBalance); + // @ts-ignore + const [currentCollateralPriceVal, currentIndexBalance, currentIndexPriceVal] = + await signer.ethcallProvider?.all([ + currentPriceCall, + currentIndexBalanceCall, + currentIndexPriceCall, + ]); + currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); + currentIndexPrice = ethers.utils.formatEther(currentIndexPriceVal); + iBalance = ethers.utils.formatUnits(currentIndexBalance, 18); + setIndexBalance(iBalance); setText(t("vault.create-text", { asset: "Index" })); setTitle(t("vault.create")); @@ -286,16 +300,18 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { } setSelectedVaultDecimals(decimals); - const currentBalance = ethers.utils.formatUnits(balance, decimals); + const currentBalance = ethers.utils.formatUnits(cBalance, decimals); if (parseFloat(currentBalance) < 0.09) { setTokenBalanceDecimals(4); } else { setTokenBalanceDecimals(2); } - setTokenBalance(currentBalance); + setCollateralBalance(currentBalance); setIsLoading(false); - // const usdBalance = toUSD(currentCollateralPrice, currentBalance); - // setTokenBalanceUSD(usdBalance.toString()); + const iUsdBalance = toUSD(currentIndexPrice, iBalance); + const cUsdBalance = toUSD(currentCollateralPrice, currentBalance); + setIndexBalanceUSD(iUsdBalance.toString()); + setCollateralBalanceUSD(cUsdBalance.toString()); } useEffect( @@ -1083,8 +1099,9 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ); }; - const AssetBalance = (isCollateral: boolean) => { - const aBalance = isCollateral ? tokenBalance : assetBalance; + const RenderIndexBalance = (isCollateral: boolean) => { + const aBalance = isCollateral ? collateralBalance : indexBalance; + const aBalanceUSD = isCollateral ? collateralBalanceUSD : indexBalanceUSD; return (
@@ -1093,13 +1110,24 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { {isLoading ? ( ) : ( - + + ${parseFloat(aBalanceUSD).toFixed(2)} + + } + > + + )}
@@ -1113,13 +1141,24 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { {isLoading ? ( ) : ( - + + ${parseFloat(vaultCollateralUSD).toFixed(2)} + + } + > + + )} @@ -1132,13 +1171,24 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { {isLoading ? ( ) : ( - + + ${parseFloat(vaultDebtUSD).toFixed(2)} + + } + > + + )} @@ -1330,7 +1380,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { {!isLoading && ( <> - {AssetBalance(false)} + {RenderIndexBalance(false)} {isApproved && } )} @@ -1339,7 +1389,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { {!isLoading && ( <> - {AssetBalance(true)} + {RenderIndexBalance(true)} {isApproved && } )} diff --git a/src/styles/app.scss b/src/styles/app.scss index 1a83970..da1c4bb 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -430,6 +430,11 @@ html, width: 550px; text-align: left; } +.ttip-balance >.tooltip-inner { + max-width: 200px; + width: 200px; + text-align: left; +} .univ3-expired-tooltip > .tooltip-inner { min-width: 300px; diff --git a/src/styles/vault.scss b/src/styles/vault.scss index 9281759..99eba65 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -535,6 +535,10 @@ color: $white; text-shadow: 0px 4px 13px rgba(223, 33, 254, 0.8); } + + &-value:hover { + cursor: pointer; + } } } From 432938e22475b5ccd80632608be239ab1ba2154c Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 19 Jan 2023 19:10:25 -0600 Subject: [PATCH 219/278] fixed vault warning on summary --- .../Summary/warnings/VaultsWarning.tsx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/components/Summary/warnings/VaultsWarning.tsx b/src/components/Summary/warnings/VaultsWarning.tsx index b6d7f0d..f7bf08a 100644 --- a/src/components/Summary/warnings/VaultsWarning.tsx +++ b/src/components/Summary/warnings/VaultsWarning.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useContext, useState } from "react"; import { Button, Spinner } from "react-bootstrap/esm/"; import { FaArrowRight } from "react-icons/fa"; import { ethers } from "ethers"; @@ -6,8 +6,9 @@ import { useHistory } from "react-router-dom"; import { useQuery, gql } from "@apollo/client"; import { useRatios } from "../../../hooks"; import { OraclePricesType } from "../../../hooks/types"; +import { networkContext } from "../../../state"; import { getCollateralPrice, getMinRatio } from "../../Vaults/common"; -import { getRatio2, isUndefined } from "../../../utils/utils"; +import { getRatio2, isArbitrum, isUndefined } from "../../../utils/utils"; type props = { ownerAddress: string; @@ -17,6 +18,7 @@ type props = { export const VaultsWarning = ({ ownerAddress, prices }: props) => { const history = useHistory(); const ratios = useRatios(); + const currentNetwork = useContext(networkContext); const [loadingVaults, setLoadingVaults] = useState(false); const [liquidableVaults, setLiquidableVaults] = useState(0); @@ -52,13 +54,10 @@ export const VaultsWarning = ({ ownerAddress, prices }: props) => { const debtText = ethers.utils.formatEther(debtWei); const collateralPrice = getCollateralPrice(prices, symbol); const minRatio = getMinRatio(ratios, symbol, isHardVault); - - const ratio = getRatio2( - collateralText, - collateralPrice, - debtText, - prices.tcapOraclePrice || "1" - ); + const indexPrice = !isArbitrum(currentNetwork.chainId) + ? prices.tcapOraclePrice + : prices.jpegzOraclePrice; + const ratio = getRatio2(collateralText, collateralPrice, debtText, indexPrice || "1"); return ratio < minRatio; }; @@ -77,7 +76,6 @@ export const VaultsWarning = ({ ownerAddress, prices }: props) => { v.hardVault, cVaultDecimals ); - console.log("isLiquidable: ", isLiquidable); if (isLiquidable) { liqVaults += 1; } From aacdc9c89ffa156d02f6a21e424d2cfdf4575b02 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 20 Jan 2023 11:03:18 -0600 Subject: [PATCH 220/278] fixe max burn index --- src/components/Summary/warnings/VaultsWarning.tsx | 1 - src/components/Vaults/vault/index.tsx | 7 ++----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/components/Summary/warnings/VaultsWarning.tsx b/src/components/Summary/warnings/VaultsWarning.tsx index f7bf08a..3a4dfac 100644 --- a/src/components/Summary/warnings/VaultsWarning.tsx +++ b/src/components/Summary/warnings/VaultsWarning.tsx @@ -65,7 +65,6 @@ export const VaultsWarning = ({ ownerAddress, prices }: props) => { const loadVaults = async (vaultsData: any) => { setLoadingVaults(true); let liqVaults = 0; - console.log("vaultsData: ", vaultsData); // @ts-ignore vaultsData.vaults.forEach((v) => { const cVaultDecimals = v.underlyingProtocol.underlyingToken.decimals; diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index e2301b9..69c4045 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -743,7 +743,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const tx = await currentVault?.mint(amount); notifyUser(tx, refresh); } else { - const increasedFee = await calculateBurnFee(mintTxt); + const increasedFee = await calculateMintFee(mintTxt); const ethFee = ethers.utils.formatEther(increasedFee); setMintFee(ethFee.toString()); console.log("ethFee:", ethFee); @@ -844,13 +844,10 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ]); let balanceFormat = "0"; - let balance; if (currentBalance.lt(cVault.Debt)) { balanceFormat = ethers.utils.formatEther(currentBalance); - balance = currentBalance; } else { balanceFormat = vaultDebt; - balance = cVault.Debt; } setBurnTxt(balanceFormat); let usd = toUSD(currentAssetPrice, balanceFormat); @@ -863,7 +860,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setBurnUSD(usd.toString()); if (balanceFormat !== "0") { - const increasedFee = await calculateBurnFee(balance); + const increasedFee = await calculateBurnFee(balanceFormat); const ethFee = ethers.utils.formatEther(increasedFee); setBurnFee(ethFee.toString()); } else { From 9521a571d0230ca1e1187348d9810cf0932ea47e Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 20 Jan 2023 14:26:27 -0600 Subject: [PATCH 221/278] fixes --- src/components/Vaults/vault/index.tsx | 2 +- src/styles/vault.scss | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 69c4045..d613bd6 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -746,12 +746,12 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const increasedFee = await calculateMintFee(mintTxt); const ethFee = ethers.utils.formatEther(increasedFee); setMintFee(ethFee.toString()); - console.log("ethFee:", ethFee); const tx = await currentVault?.mint(amount, { value: BigNumber.from(increasedFee) }); notifyUser(tx, refresh); } } catch (error) { console.error(error); + console.error("Code: ", error.code); if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); } else { diff --git a/src/styles/vault.scss b/src/styles/vault.scss index 99eba65..383a5d1 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -207,14 +207,12 @@ margin-left: 5px; margin-right: 15px; } - .dai { + .dai, .usdc, .wbtc { width: 25px; } - .usdc { - width: 25px; - } - .wbtc { - width: 25px; + .jpegz { + width: 30px; + margin-right: 10px; } } } From 06b91f9110c4833fd72f0386cfa73dafce5466b8 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sat, 21 Jan 2023 21:36:04 -0600 Subject: [PATCH 222/278] vault box design --- src/components/Vaults/index.tsx | 14 +- .../Vaults/monitoring/VaultsMobile.tsx | 159 +++++++++++++++++ src/components/Vaults/monitoring/index.tsx | 1 + src/styles/app.scss | 36 +++- src/styles/vault-monitoring.scss | 167 ++++++++++++++++-- 5 files changed, 352 insertions(+), 25 deletions(-) create mode 100644 src/components/Vaults/monitoring/VaultsMobile.tsx diff --git a/src/components/Vaults/index.tsx b/src/components/Vaults/index.tsx index 967db10..ee1c1b8 100644 --- a/src/components/Vaults/index.tsx +++ b/src/components/Vaults/index.tsx @@ -1,6 +1,7 @@ import React, { useContext, useEffect, useState } from "react"; import Monitoring from "./monitoring"; import Vault from "./vault"; +import { VaultsMobile } from "./monitoring/VaultsMobile"; import { signerContext } from "../../state"; import { VaultToUpdateType } from "./types"; @@ -41,11 +42,14 @@ const Vaults = () => { if (isMinting) { return ( - setMinting(false)} - /> + <> + + {/* setMinting(false)} + /> */} + ); } diff --git a/src/components/Vaults/monitoring/VaultsMobile.tsx b/src/components/Vaults/monitoring/VaultsMobile.tsx new file mode 100644 index 0000000..aa1196c --- /dev/null +++ b/src/components/Vaults/monitoring/VaultsMobile.tsx @@ -0,0 +1,159 @@ +import React, { useContext, useState } from "react"; +import { Button, Card } from "react-bootstrap/esm"; +import NumberFormat from "react-number-format"; +import { networkContext } from "../../../state"; +import { + capitalize, + TokenIcon, + getMinRatio, + getCollateralPrice, + findNewArbitrumVaultCollateral, + findNewMainnetVaultCollateral, + findNewOptimismVaultCollateral, + VAULT_STATUS, +} from "../common"; +import { PaginationType, VaultsType, VaultToUpdateType } from "../types"; +import { TOKENS_SYMBOLS } from "../../../utils/constants"; +import { isArbitrum, isInLayer1, numberFormatStr } from "../../../utils/utils"; + +export const VaultsMobile = () => { + const currentNetwork = useContext(networkContext); + + return ( +
+ + +
+
+
Index
+
+ +
TCAP
+
+
+
+
Collateral
+
+ +
WETH
+
+
+
+
+
+
Collateral:
+
+
+
+ +
+
+ +
+
+
+
+
+
Debt:
+
+
+
+ +
+
+ +
+
+
+
+
+
Ratio:
+
+
+
+ +
+ Empty +
+
+
+ + + +
+ + +
+
+
Index
+
+ +
TCAP
+
+
+
+
Collateral
+
+ +
WETH
+
+
+
+
+
+
Collateral:
+
+
+
+ +
+
+ +
+
+
+
+
+
Debt:
+
+
+
+ +
+
+ +
+
+
+
+
+
Ratio:
+
+
+
+ +
+ In Liquidation +
+
+
+ + + + +
+
+ ); +}; diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index e1c35d4..7883d95 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -9,6 +9,7 @@ import "../../../styles/vault-monitoring.scss"; import { VaultPagination } from "./Pagination"; import { signerContext, hardVaultsContext, networkContext, vaultsContext } from "../../../state"; import { Vaults } from "./Vaults"; +// import { VaultsMobile } from "./VaultsMobile"; import { usePrices, useRatios } from "../../../hooks"; import { getRatio2, diff --git a/src/styles/app.scss b/src/styles/app.scss index 1a83970..6d7c137 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -350,6 +350,22 @@ textarea.neon-green:focus { .card { background-color: $darker; + + /* &.box-empty { + box-shadow: 0 0 10px 1px #f28040; + } + &.box-ready { + box-shadow: 0 0 10px 1px #167226; + } + &.box-active { + box-shadow: 0 0 10px 1px #e440f2; + } + &.box-liquidation { + box-shadow: 0 0 10px 1px #c33; + } + &.box-liquidated { + box-shadow: 0 0 4px #7940f2, 0 0 1px #fcdf49, 0 0 2px #f28040, 0 0px 4px #c33; + } */ } .custom-file { label { @@ -369,10 +385,7 @@ textarea.neon-green:focus { overflow: overlay; } .wrapper::before { - background-image: url("../assets/images/liquid.png"); - // background-color: black; - background-repeat: no-repeat; - background-size: cover; + background-color: black; opacity: 0.3; position: absolute; z-index: -1; @@ -492,6 +505,21 @@ form { } } +.btn { + &.empty { + border: 1px solid #f28040; + } + &.ready { + border: 1px solid #167226; + } + &.active { + border: 1px solid #e440f2; + } + &.liquidation { + border: 1px solid #c33; + } +} + .btn:active { background-color: transparent; } diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 2341d86..76735b3 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -1,6 +1,32 @@ @import "./colors"; @import "./fonts"; +span { + &.empty, &.ready, &.active, &.liquidation, &.liquidated { + font-family: "Nineteen Ninety Seven"; + font-size: 15px; + -webkit-animation: fire 2s infinite alternate; + animation: fire 2s infinite alternate; + color: #fff !important; + } +} + +.empty { + text-shadow: 0 0 4px #7940f2, 0 0 10px #fcdf49, 0 0 20px #f28040, 0 -10px 40px #c33; +} +.ready { + text-shadow: 0 0 4px #167226, 0 0 10px #61c4b3, 0 0 20px #167226, 0 -10px 40px #167226; +} +.active { + text-shadow: 0 0 4px #e440f2, 0 0 10px #e98ff1, 0 0 20px #e440f2, 0 -10px 40px #b626c4; +} +.liquidation { + text-shadow: 0 0 4px #c33, 0 0 10px rgb(236, 97, 97), 0 0 20px #c33, 0 -10px 40px #c33; +} +.liquidated { + text-shadow: 0 0 4px #7940f2, 0 0 10px #fcdf49, 0 0 20px #f28040, 0 -10px 40px #c33; +} + .vault-monitoring { margin-left: 1.5rem; padding: 1rem 2rem; @@ -333,22 +359,7 @@ a { color: $white; } - } - .empty { - text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; - } - .ready { - text-shadow: 0 0 4px #167226,0 0 10px #61c4b3,0 0 20px #167226,0 -10px 40px #167226; - } - .active { - text-shadow: 0 0 4px #e440f2,0 0 10px #e98ff1,0 0 20px #e440f2,0 -10px 40px #b626c4; - } - .liquidation { - text-shadow: 0 0 4px #c33,0 0 10px rgb(236, 97, 97),0 0 20px #c33,0 -10px 40px #c33; - } - .liquidated { - text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; - } + } } } .pag-container{ @@ -451,4 +462,128 @@ } } } +} + +.vaults-mobile { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin: 2rem 0rem; + padding: 1rem; + .status { + font-size: 1.2rem; + } + .vault { + width: 100%; + background-color: $darker; + padding: 1rem 0.3rem; + margin: 1rem 0rem; + h5 { + font-size: 1rem; + margin-bottom: 0rem; + } + + svg, .tcap { + height: 30px; + margin-right: 10px; + } + .jpegz { + height: 30px; + width: 30px; + } + + &-assets { + display: flex; + flex-direction: row; + justify-content: space-between; + .asset-box { + display: flex; + flex-direction: column; + width: 100%; + } + .asset { + display: flex; + flex-direction: row; + align-items: center; + padding: 0.5rem; + margin-top: 0.5rem; + background-color: $darkest; + border-radius: 5px; + border: 1px solid $light; + + &.index { + margin-right: 0.8rem; + } + &.collateral { + margin-left: 0.8rem; + } + } + } + + &-values { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin: 1rem 0rem; + border: 0.5px solid $off-white; + border-radius: 5px; + .title { + display: flex; + align-items: center; + background-color: $darkest; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + padding-left: 0.6rem; + height: 3.5rem; + width: 40%; + } + .values { + display: flex; + flex-direction: column; + padding: 0.5rem; + } + .status { + font-size: 1rem; + } + .number { + font-size: 0.85rem; + text-align: right; + } + .neon-green { + margin-bottom: 0.5rem; + } + } + + &-actions { + display: grid; + grid-template-columns: 100%; + &.two { + grid-template-columns: 50% 50%; + gap: 1rem; + padding-right: 2.5rem; + } + .btn { + height: 2.7rem; + width: 100%; + } + .liquidation { + border: 1px solid rgb(236, 97, 97); + } + } + /* .ratio { + .values { + display: flex; + flex-direction: row; + align-items: center; + .empty { + font-size: 0.9rem; + } + .separator { + margin: 0px 8px; + } + } + } */ + } } \ No newline at end of file From c3e1425a9fa8685a3f5344817804d6724fa7d64c Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 25 Jan 2023 18:01:56 -0600 Subject: [PATCH 223/278] added collapsables --- package.json | 1 + src/components/Vaults/index.tsx | 6 +- src/components/Vaults/monitoring/Vaults.tsx | 24 +- .../Vaults/monitoring/VaultsMobile.tsx | 319 ++++++----- src/components/Vaults/monitoring/index.tsx | 500 +++++++++--------- src/components/Vaults/types.tsx | 19 + src/styles/app.scss | 40 +- src/styles/vault-monitoring.scss | 304 +++++++---- yarn.lock | 34 +- 9 files changed, 717 insertions(+), 530 deletions(-) diff --git a/package.json b/package.json index e0d03b9..6730a34 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "react-i18next": "^11.15.3", "react-icons": "^4.3.1", "react-number-format": "^4.4.1", + "react-responsive": "^9.0.2", "react-router-dom": "^5.2.0", "react-scripts": "4.0.0", "react-swipeable": "^6.1.0", diff --git a/src/components/Vaults/index.tsx b/src/components/Vaults/index.tsx index ee1c1b8..b116fa5 100644 --- a/src/components/Vaults/index.tsx +++ b/src/components/Vaults/index.tsx @@ -1,7 +1,6 @@ import React, { useContext, useEffect, useState } from "react"; import Monitoring from "./monitoring"; import Vault from "./vault"; -import { VaultsMobile } from "./monitoring/VaultsMobile"; import { signerContext } from "../../state"; import { VaultToUpdateType } from "./types"; @@ -43,12 +42,11 @@ const Vaults = () => { if (isMinting) { return ( <> - - {/* setMinting(false)} - /> */} + /> ); } diff --git a/src/components/Vaults/monitoring/Vaults.tsx b/src/components/Vaults/monitoring/Vaults.tsx index 080cbe4..938828f 100644 --- a/src/components/Vaults/monitoring/Vaults.tsx +++ b/src/components/Vaults/monitoring/Vaults.tsx @@ -10,7 +10,7 @@ import { ReactComponent as SortUpIcon } from "../../../assets/images/sort-up.svg import { ReactComponent as SortDownIcon } from "../../../assets/images/sort-down.svg"; import Liquidate from "./Liquidate"; import { networkContext } from "../../../state"; -import { PaginationType, VaultsType, VaultToUpdateType } from "../types"; +import { PaginationType, VaultsPropsType, VaultsType, VaultToUpdateType } from "../types"; import { isArbitrum, isInLayer1, numberFormatStr } from "../../../utils/utils"; import { capitalize, @@ -25,26 +25,10 @@ import { sortRatioAsc, sortRewardDesc, sortRewardAsc, + VAULT_STATUS, } from "../common"; import { TOKENS_SYMBOLS } from "../../../utils/constants"; -type dataType = { - currentAddress: string; - vaults: Array; - setVaults: (v: Array) => void; - currentStatus: string; - pagination: PaginationType; - refresh: ( - index: number, - symbol: string, - vaultId: string, - collateral: ethers.BigNumberish, - debt: ethers.BigNumberish - ) => void; - setVaultToUpdate: (initData: VaultToUpdateType) => void; - myVaults: boolean; -}; - export const Vaults = ({ currentAddress, vaults, @@ -54,7 +38,7 @@ export const Vaults = ({ refresh, setVaultToUpdate, myVaults, -}: dataType) => { +}: VaultsPropsType) => { const { t } = useTranslation(); const currentNetwork = useContext(networkContext); const [showLiquidate, setShowLiquidate] = useState(false); @@ -351,7 +335,7 @@ export const Vaults = ({
${v.netReward.toFixed(2)} diff --git a/src/components/Vaults/monitoring/VaultsMobile.tsx b/src/components/Vaults/monitoring/VaultsMobile.tsx index aa1196c..b44e005 100644 --- a/src/components/Vaults/monitoring/VaultsMobile.tsx +++ b/src/components/Vaults/monitoring/VaultsMobile.tsx @@ -1,7 +1,9 @@ import React, { useContext, useState } from "react"; import { Button, Card } from "react-bootstrap/esm"; +import { ethers } from "ethers"; import NumberFormat from "react-number-format"; import { networkContext } from "../../../state"; +import Liquidate from "./Liquidate"; import { capitalize, TokenIcon, @@ -12,148 +14,203 @@ import { findNewOptimismVaultCollateral, VAULT_STATUS, } from "../common"; -import { PaginationType, VaultsType, VaultToUpdateType } from "../types"; +import { PaginationType, VaultsPropsType, VaultsType, VaultToUpdateType } from "../types"; import { TOKENS_SYMBOLS } from "../../../utils/constants"; import { isArbitrum, isInLayer1, numberFormatStr } from "../../../utils/utils"; -export const VaultsMobile = () => { +export const VaultsMobile = ({ + currentAddress, + vaults, + setVaults, + currentStatus, + pagination, + refresh, + setVaultToUpdate, + myVaults, +}: VaultsPropsType) => { const currentNetwork = useContext(networkContext); + const [showLiquidate, setShowLiquidate] = useState(false); + const [vaultIndex, setVaultIndex] = useState(-1); + const [liqVault, setLiqVault] = useState(null); + + const liquidateVault = (index: number, lVault: VaultsType) => { + setVaultIndex(index); + setLiqVault(lVault); + setShowLiquidate(true); + }; + + const updateLiqVault = (collateral: ethers.BigNumberish, debt: ethers.BigNumberish) => { + if (liqVault !== null) { + refresh(vaultIndex, liqVault.collateralSymbol, liqVault.id, collateral, debt); + } + }; + + const vaultButtonLink = (v: VaultsType) => { + const vtu = { + vaultId: v.id, + assetSymbol: isArbitrum(currentNetwork.chainId) ? TOKENS_SYMBOLS.JPEGz : TOKENS_SYMBOLS.TCAP, + collateralSymbol: v.collateralSymbol !== "WETH" ? v.collateralSymbol : "ETH", + isHardVault: v.isHardVault, + }; + return ( + + ); + }; + + const newVault = () => { + const initData = { + vaultId: "0", + assetSymbol: !isArbitrum(currentNetwork.chainId) ? TOKENS_SYMBOLS.TCAP : TOKENS_SYMBOLS.JPEGz, + collateralSymbol: TOKENS_SYMBOLS.ETH, + isHardVault: isInLayer1(currentNetwork.chainId), + }; + setVaultToUpdate(initData); + }; + + const IndexIcon = () => { + if (!isArbitrum(currentNetwork.chainId)) { + return ; + } + return ; + }; return (
- - -
-
-
Index
-
- -
TCAP
+ {vaults.map((v, index) => { + const itemPage = Math.ceil((index + 1) / pagination.itemsPerPage); + return ( + + +
+
+
Index
+
+ +
+ {isArbitrum(currentNetwork.chainId) + ? TOKENS_SYMBOLS.JPEGz + : TOKENS_SYMBOLS.TCAP} +
+
+
+
+
Collateral
+
+ +
{v.collateralSymbol}
+
+
-
-
-
Collateral
-
- -
WETH
+
+
+
Collateral:
+
+
+
+ +
+
+ +
+
-
-
-
-
-
Collateral:
-
-
-
- -
-
- -
-
-
-
-
-
Debt:
-
-
-
- -
-
- -
-
-
-
-
-
Ratio:
-
-
-
- -
- Empty -
-
- - - - - - - -
-
-
Index
-
- -
TCAP
+
+
+
Debt:
+
+
+
+ +
+
+ +
+
-
-
-
Collateral
-
- -
WETH
+
+
+
Ratio:
+
+
+
+ +
+ {capitalize(v.status)} +
-
-
-
-
-
Collateral:
-
-
-
- -
-
- -
-
-
-
-
-
Debt:
-
-
-
- -
-
- -
-
-
-
-
-
Ratio:
-
-
-
- -
- In Liquidation -
-
- - - - - - + + {(v.status === VAULT_STATUS.liquidation || v.url !== "") && ( + + {v.status === VAULT_STATUS.liquidation && ( + + )} + {v.url !== "" && vaultButtonLink(v)} + + )} + + ); + })} + {vaults.length === 0 && currentAddress !== "" && myVaults && currentStatus === "all" && ( +
+

+ No Vaults yet. Please + + your first vault. +

+
+ )} + {vaults.length === 0 && !myVaults && ( +
+

No vaults found.

+
+ )} + { + setLiqVault(null); + setVaultIndex(-1); + setShowLiquidate(false); + }} + refresh={updateLiqVault} + />
); }; diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index 7883d95..527b367 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -1,15 +1,16 @@ import React, { useContext, useEffect, useRef, useState } from "react"; -import { Button, Card, Col, Dropdown, Form, Row } from "react-bootstrap/esm"; +import { Accordion, Button, Card, Col, Dropdown, Form } from "react-bootstrap/esm"; import Spinner from "react-bootstrap/Spinner"; import { FaArrowsAltH } from "react-icons/fa"; import { ethers, BigNumber } from "ethers"; +import { useMediaQuery } from "react-responsive"; import { useLazyQuery, gql } from "@apollo/client"; import { useTranslation } from "react-i18next"; import "../../../styles/vault-monitoring.scss"; import { VaultPagination } from "./Pagination"; import { signerContext, hardVaultsContext, networkContext, vaultsContext } from "../../../state"; import { Vaults } from "./Vaults"; -// import { VaultsMobile } from "./VaultsMobile"; +import { VaultsMobile } from "./VaultsMobile"; import { usePrices, useRatios } from "../../../hooks"; import { getRatio2, @@ -73,6 +74,7 @@ const showAllVaults = true; const Monitoring = ({ setVaultToUpdate }: props) => { const { t } = useTranslation(); + const isMobile = useMediaQuery({ query: "(max-width: 800px)" }); const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); const vaults = useContext(vaultsContext); @@ -670,257 +672,263 @@ const Monitoring = ({ setVaultToUpdate }: props) => { return ; }; + const RenderFilters = () => ( + <> +
+
+
+ <>{t("view")}: +
+ handleItemsViewChange(eventKey || "15")}> + +
+ {pagination.itemsPerPage} +
+
+ + {viewsList.map((item) => ( + + {item.name} + + ))} + +
+
+
+
+
+
+ <>{t("collateral")} +
+ handleTokenChange(eventKey || "ALL")} + > + +
+ + {tokenSymbol.toUpperCase()} +
+
+ + {tokensSymbols().map((item) => ( + + {item.name} + + ))} + +
+
+
+
Status
+ handleStatusChange(eventKey || "ALL")}> + +
+ {capitalize(currentStatus)} +
+
+ + {statusList.map((item) => ( + + {item.name} + + ))} + +
+
+ {isInLayer1(currentNetwork.chainId) && ( +
+
+ <>{t("mode")} +
+ handleModeChange(eventKey || "ALL")} + > + +
+ {capitalize(vaultMode)} +
+
+ + {modeList.map((item) => ( + + {item.name} + + ))} + +
+
+ )} +
+
Ratio Range
+ + +
+ + {currentMinRatio} {currentMaxRatio} + +
+
+ +
+ + + +
+ +
+
+
+
+
Vaults
+ handleVaultOwnerFilterChange(eventKey || "1")}> + +
+ {capitalize(currentOwnerFilter.name)} +
+
+ + + {vaultsOwnerFilter[0].name} + + + {vaultsOwnerFilter[1].name} + + +
+
+
+ +
+
+ + ); + return (
- - - - -
- <>{t("totals")} -
-
- -
- - - - - {" "} - - - - - - - - - - - - - - - - - - - {" "} - - -
- DescriptionCurrent Mint -
-
Current Reward
-
- - Early adopters rewards are issued over 14 days for a total of 500,000 CTX. - Assuming approximately 6500 Ethereum blocks per day over 14 days (91,000 - Ethereum blocks), the per block reward would be 5.4945 CTX split across the - debtors at that point in time. 100% of the reward is immediately available. - - } - > - - -
-
-
APY -
- - - ETH Vault - - {" "} - TCAP - - {" "} - CTX - - Inactive - - {address === "" ? ( - <> - - - - ) : ( - <> - - - - )} -
- - - DAI Vault - - {" "} - TCAP - - {" "} - CTX - - Inactive - - {address === "" ? ( - <> - - - - ) : ( - <> - - - - )} -
- - ); -}; - -export default Rewards; diff --git a/src/components/Farm/MintingRewards/index.tsx b/src/components/Farm/MintingRewards/index.tsx deleted file mode 100644 index abcbf05..0000000 --- a/src/components/Farm/MintingRewards/index.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import React, { useContext, useEffect, useState } from "react"; -import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; -import { networkContext } from "../../../state"; -import { GRAPHQL_ENDPOINT, NETWORKS } from "../../../utils/constants"; -import Rewards from "./Rewards"; - -const clientOracle = (graphqlEndpoint: string) => - new ApolloClient({ - uri: graphqlEndpoint, - cache: new InMemoryCache(), - }); - -type props = { - address: string; - ethRewards: string; - daiRewards: string; - claimRewards: (vaultType: string) => {}; -}; - -const MintingRerwards = ({ address, ethRewards, daiRewards, claimRewards }: props) => { - const currentNetwork = useContext(networkContext); - const [apolloClient, setApolloClient] = useState( - clientOracle( - process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.rinkeby - ) - ); - - useEffect(() => { - switch (currentNetwork.chainId) { - case NETWORKS.mainnet.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); - break; - case NETWORKS.rinkeby.chainId: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.rinkeby)); - break; - default: - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); - break; - } - }, [currentNetwork.chainId]); - - return ( - - - - ); -}; - -export default MintingRerwards; diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index d5e33cc..bfa4f20 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -5,6 +5,7 @@ import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Table from "react-bootstrap/esm/Table"; import Tooltip from "react-bootstrap/esm/Tooltip"; import Spinner from "react-bootstrap/Spinner"; +import { useMediaQuery } from "react-responsive"; import { useTranslation } from "react-i18next"; import { BigNumber, ethers } from "ethers"; import NumberFormat from "react-number-format"; @@ -58,6 +59,7 @@ const Rewards = ({ const tokens = useContext(tokensContext); const currentNetwork = useContext(networkContext); const disableActions = isOptimism(currentNetwork.chainId); + const isMobile = useMediaQuery({ query: "(max-width: 450px)" }); const [ethTcapIncentive, setEthTcapIncentive] = useState>([]); const [ethTcapPositions, setEthTcapPositions] = useState>([]); const [cumulativePrice, setCumulativePrice] = useState(0); @@ -541,6 +543,72 @@ const Rewards = ({ ); + const RenderRewardsMobile = () => ( +
+ {ethTcapPositions.sort(sortPositions).map((position, index) => ( + + +
+
+ + +
+
+ TCAP/WETH Pool + Uniswap +
+
+
+
Position
+
+
+
+ Min: {numberFormatStr(position.tickUpperPrice1.toString(), 4, 4)} +
+ +
+ Max: {numberFormatStr(position.tickLowerPrice1.toString(), 4, 4)} +
+
+
+
+
Status:
+
+
{RenderStatusLabel(position)}
+
+
+
+
Reward:
+
+
+ +
+
+
+ + refresh()} + /> + + +
+ ))} +
+ ); + const RenderEmptyLP = () => (
@@ -576,41 +644,50 @@ const Rewards = ({ return ( - -

Uniswap V3 Liquidity Rewards

- {availableReward > 0.001 && ethTcapPositions.length === 0 && ( -
-
Unclaimed Reward:
-
- - -
-
- -
-
- )} -
- - {ownerAddress !== "" ? ( - <> - {loading && firstLoad ? ( - + {!isMobile ? ( + <> + +

Uniswap V3 Liquidity Rewards

+ {availableReward > 0.001 && ethTcapPositions.length === 0 && ( +
+
Unclaimed Reward:
+
+ + +
+
+ +
+
+ )} +
+ + {ownerAddress !== "" ? ( + <> + {loading && firstLoad ? ( + + ) : ( + <>{ethTcapPositions.length === 0 ? RenderEmptyLP() : RenderRewards()} + )} + ) : ( - <>{ethTcapPositions.length === 0 ? RenderEmptyLP() : RenderRewards()} + )} - - ) : ( - - )} - +
+ + ) : ( + <> + + + + )} { const { t } = useTranslation(); + const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); + const tokens = useContext(tokensContext); + const oracles = useContext(oraclesContext); + const governance = useContext(governanceContext); + const rewards = useContext(rewardsContext); const [address, setAddress] = useState(""); const [isLoading, setIsLoading] = useState(true); /* const [ethRewards, setEthRewards] = useState("0"); @@ -42,11 +50,6 @@ const Farm = () => { const [ethVestAmount, setEthVestAmount] = useState(ethers.BigNumber.from(0)); const [ctxVestAmount, setCtxVestAmount] = useState(ethers.BigNumber.from(0)); const [updateData, setUpdateData] = useState(false); - const signer = useContext(signerContext); - const tokens = useContext(tokensContext); - const oracles = useContext(oraclesContext); - const governance = useContext(governanceContext); - const rewards = useContext(rewardsContext); // APY const [, setEthVaultAPY] = useState("0"); @@ -398,9 +401,9 @@ const Farm = () => { <>{t("farming.farming")} {" "} - - - + + {currentNetwork.chainId === NETWORKS.mainnet.chainId && ( +

<>{t("farming.liquidity")}

@@ -705,7 +708,7 @@ const Farm = () => {
-
+ )}
{/* { className="btn-create-vault" onClick={() => newVault()} disabled={currentAddress === ""} + variant="secondary" > New Vault diff --git a/src/styles/app.scss b/src/styles/app.scss index 80f0636..697b8b2 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -29,6 +29,10 @@ h6 { color: $white; } +span { + color: $white; +} + h6, p { margin-bottom: 0rem; color: $off-white @@ -350,6 +354,7 @@ textarea.neon-green:focus { .card, .accordion { background-color: $darker; } + .accordion { border-radius: 5px; diff --git a/src/styles/farm.scss b/src/styles/farm.scss index ddf8a70..15d0694 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -337,7 +337,7 @@ .btn.small { width: 5rem; @media (max-width: 1550px) { - width: 7rem !important; + width: 7rem; } } .btn.claim { @@ -431,15 +431,7 @@ .tokens { font-size: 0.9rem; color: $purple ; - } - .status { - font-size: 0.6rem; - font-family: "Space Mono"; - background-color: #281e31; - padding: 0.2rem; - border-radius: 5px; - border: 1px solid #38d6b2; - } + } .ranges { display: flex; width: 100%; @@ -660,4 +652,102 @@ } } } + + @media (max-width: 450px) { + margin-top: 2rem; + padding: 1rem; + background-color: transparent; + .card-wrapper { + margin: 0rem; + .card { + background-color: transparent; + padding: 0rem; + overflow-x: unset; + } + } + + .liquidity { + display: none; + } + + .rewards { + display: flex; + flex-direction: column; + padding: 0.5rem; + background-color: $darker; + } + + .positions-mobile { + svg { + color: white; + } + .position { + padding: 1rem !important; + background-color: $darker; + .description { + display: flex; + flex-direction: row; + margin-bottom: 1rem; + } + .icons { + display: flex; + flex-direction: row; + align-items: center; + margin-right: 1rem; + svg { + margin-top: 0rem; + } + .weth { + margin-right: 0.5rem; + } + } + .title { + display: flex; + } + + .ranges { + padding: 0.5rem; + border: 0.5px solid $highlight; + border-radius: 5px; + } + .box { + display: flex; + justify-content: space-between; + margin: 0.5rem 0rem; + border: 0.5px solid $highlight; + border-radius: 5px; + .title { + width: 45%; + padding: 0.5rem; + background-color: $darkest; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + } + .value { + display: flex; + justify-content: flex-end; + width: 55%; + padding: 0.5rem; + } + } + .status { + display: flex; + } + + &-actions { + display: grid; + grid-template-columns: 50% 50%; + gap: 0.5rem; + padding: 0rem; + .btn { + height: 3rem; + width: 95% !important; + margin: 0rem !important; + } + } + } + } + } + + } From c10dee975d9ed5b4e18cef2aef4315b18bbe6554 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sat, 28 Jan 2023 15:08:30 -0600 Subject: [PATCH 226/278] almos finished univ3 rewards for mobile --- src/components/Farm/UniV3Rewards/Rewards.tsx | 220 ++++++++++++------- src/components/Farm/index.tsx | 23 +- src/styles/_colors.scss | 1 + src/styles/app.scss | 17 ++ src/styles/farm.scss | 199 ++++++++++++----- src/styles/faucet.scss | 112 ---------- src/styles/modal.scss | 11 + 7 files changed, 328 insertions(+), 255 deletions(-) delete mode 100644 src/styles/faucet.scss diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index bfa4f20..8b3f2ba 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -306,41 +306,100 @@ const Rewards = ({ const sortPositions = (p1: PositionType, p2: PositionType) => p1.lpTokenId - p2.lpTokenId; + const AprOverlayTrigger = (): React.ReactElement => ( + + Incentive ends on {incentiveEndDate()} + + } + > + + + ); + + const StatusToolTip = (): React.ReactElement => ( + <> + Pending: LP token needs to be approved in + order to be staked.
+ Unstaked: LP token hasn't been staked or deposited.{" "} +
+ Deposited: LP token needs to be stake to earn + rewards.
+ Staked: LP token is staked and earning rewards.{" "} +
+ Out of range: You aren't earning rewards + because the price is out of your position range.
+ Expired: LP token is staked on an incentive + that already ended. + + ); + + const CurrentRewardToolTip = (): React.ReactElement => ( + <> + Amount of CTX that it's been earn while the LP token is staked. You must unstake the LP token + in order to claim the reward.s + + ); + const RenderHeader = (): React.ReactElement => (
-
-
Fee tier:
- +
+
+
Fee tier:
+
+
+ +
-
-
TCAP/WETH Price:
- +
+
+
TCAP/WETH Price:
+
+
+ +
-
-
APR:
- +
+
+
APR:
+ {isMobile && } +
+
+ + {!isMobile && } +
+
+
+
+
+
Available to Claim
- Incentive ends on {incentiveEndDate()} + In order to claim rewards, you need to unstake your token. } > @@ -348,37 +407,23 @@ const Rewards = ({ ? +
:
-
-
-
Available to Claim
- - In order to claim rewards, you need to unstake your token. - - } - > - - -
:
-
- - -
-
- +
+
+ + +
+
+ +
@@ -411,18 +456,7 @@ const Rewards = ({ trigger={["hover", "click"]} overlay={ - Pending: LP token needs to be - approved in order to be staked.
- Unstaked: LP token hasn't been staked or - deposited.
- Deposited: LP token needs to be stake - to earn rewards.
- Staked: LP token is staked and earning - rewards.
- Out of range: You aren't earning - rewards because the price is out of your position range.
- Expired: LP token is staked on an - incentive that already ended. +
} > @@ -439,8 +473,7 @@ const Rewards = ({ trigger={["hover", "click"]} overlay={ - Amount of CTX that it's been earn while the LP token is staked. You must unstake - the LP token in order to claim the reward. + } > @@ -547,19 +580,20 @@ const Rewards = ({
{ethTcapPositions.sort(sortPositions).map((position, index) => ( - +
- TCAP/WETH Pool - Uniswap + TCAP/WETH Position
+
+
-
Position
+
Range
@@ -573,12 +607,40 @@ const Rewards = ({
Status:
+ + + + } + > + +
{RenderStatusLabel(position)}
Reward:
+ + + + } + > + +
+ {!isMobile ? ( <> - +

Uniswap V3 Liquidity Rewards

{availableReward > 0.001 && ethTcapPositions.length === 0 && (
@@ -668,7 +730,7 @@ const Rewards = ({
)}
- + {ownerAddress !== "" ? ( <> {loading && firstLoad ? ( @@ -684,7 +746,11 @@ const Rewards = ({ ) : ( <> - + + + + + )} diff --git a/src/components/Farm/index.tsx b/src/components/Farm/index.tsx index 4f203cf..cfff94b 100644 --- a/src/components/Farm/index.tsx +++ b/src/components/Farm/index.tsx @@ -8,6 +8,7 @@ import Tooltip from "react-bootstrap/esm/Tooltip"; import { ethers } from "ethers"; import { useTranslation } from "react-i18next"; import NumberFormat from "react-number-format"; +import { useMediaQuery } from "react-responsive"; import { governanceContext, networkContext, @@ -29,6 +30,7 @@ const ctxClaimVestShowDate = new Date(1634511235 * 1000); const Farm = () => { const { t } = useTranslation(); + const isMobile = useMediaQuery({ query: "(max-width: 450px)" }); const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); const tokens = useContext(tokensContext); @@ -397,13 +399,17 @@ const Farm = () => { return (
-

- <>{t("farming.farming")} -

{" "} + {!isMobile ? ( +

+ <>{t("farming.farming")} +

+ ) : ( +
Uniswap V3 Liquidity Rewards
+ )} {currentNetwork.chainId === NETWORKS.mainnet.chainId && ( - +

<>{t("farming.liquidity")}

@@ -711,15 +717,6 @@ const Farm = () => { )}
- {/* setStakeShow(false)} - refresh={() => refresh()} - /> */}
); }; diff --git a/src/styles/_colors.scss b/src/styles/_colors.scss index 9f94a53..40a12c1 100644 --- a/src/styles/_colors.scss +++ b/src/styles/_colors.scss @@ -15,3 +15,4 @@ $blue: #0fd9ff; $dark-blue: #2620fb; $green: #38d6b2; $yellow: rgb(252, 223, 73); +$background: #141429; diff --git a/src/styles/app.scss b/src/styles/app.scss index 697b8b2..0a7724e 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -421,6 +421,9 @@ html, height: 100%; } +.tooltip > .tooltip-inner { + text-align: left; +} .farm-tooltip > .tooltip-inner { max-width: 300px; @@ -446,16 +449,19 @@ html, text-shadow: 0 0 4px #c33,0 0 10px rgb(236, 97, 97),0 0 20px #c33,0 -10px 40px #c33; } } + .vaults-tooltip > .tooltip-inner { width: auto; text-align: right; padding: 0.9rem; } + .ttip-hard-vault > .tooltip-inner { max-width: 390px; width: 390px; text-align: left; } + .ttip-features > .tooltip-inner { max-width: 550px; width: 550px; @@ -489,6 +495,11 @@ html, .out_range { text-shadow: 0 0 4px rgb(233, 42, 42),0 0 10px rgb(236, 97, 97),0 0 20px rgb(233, 42, 42),0 -10px 40px #c33; } + + @media (max-width: 450px) { + width: 360px; + min-width: 360px; + } } form { @@ -690,3 +701,9 @@ form { } } +@media (max-width: 400px) { + .number { + font-size: 0.9rem; + } +} + diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 15d0694..b1bb108 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -4,6 +4,7 @@ .farm { padding: 3rem 3rem; padding-bottom: 2rem; + background-color: $background; // Small devices (landscape phones, 576px and up) @media (min-width: 576px) { @@ -207,7 +208,7 @@ } } } - &.diamond { + &.univ3, &.liquidity { padding-bottom: 1rem; width: 100%; p { @@ -297,16 +298,16 @@ } } } - &.univ3 { - .card-header { - display: flex; - justify-content: space-between; - align-items: baseline; - padding-left: 0rem; - } - .card-body { - padding: 1rem 0rem; - } + + .univ3-header { + display: flex; + justify-content: space-between; + align-items: baseline; + padding-left: 0rem; + } + + .univ3-body { + padding: 1rem 0rem; thead { .btn { margin-top: 0rem; @@ -405,6 +406,16 @@ display: flex; flex-direction: row; align-items: center; + &-heading { + display: flex; + flex-direction: row; + align-items: center; + } + &-claim { + display: flex; + flex-direction: row; + align-items: center; + } .btn { margin-left: 0rem; } @@ -454,22 +465,7 @@ } } } - } - .unstaked { - text-shadow: 0 0 4px #7940f2,0 0 10px #fcdf49,0 0 20px #f28040,0 -10px 40px #c33; - } - .deposited { - text-shadow: 0 0 4px #167226,0 0 10px #61c4b3,0 0 20px #167226,0 -10px 40px #167226; - } - .staked { - text-shadow: 0 0 4px #e440f2,0 0 10px #e98ff1,0 0 20px #e440f2,0 -10px 40px #b626c4; - } - .not_approved { - text-shadow: 0 0 4px #eeb173,0 0 10px rgb(236, 97, 97),0 0 20px #eeb173,0 -10px 40px #c33; - } - .out_range { - text-shadow: 0 0 4px rgb(233, 42, 42),0 0 10px rgb(236, 97, 97),0 0 20px rgb(233, 42, 42),0 -10px 40px #c33; - } + } .empty-lp{ display: flex; flex-direction: column; @@ -545,6 +541,26 @@ } } } + + .unstaked { + text-shadow: 0 0 4px #7940f2, 0 0 10px #fcdf49, 0 0 20px #f28040, 0 -10px 40px #c33; + } + + .deposited { + text-shadow: 0 0 4px #167226, 0 0 10px #61c4b3, 0 0 20px #167226, 0 -10px 40px #167226; + } + + .staked { + text-shadow: 0 0 4px #e440f2, 0 0 10px #e98ff1, 0 0 20px #e440f2, 0 -10px 40px #b626c4; + } + + .not_approved { + text-shadow: 0 0 4px #eeb173, 0 0 10px rgb(236, 97, 97), 0 0 20px #eeb173, 0 -10px 40px #c33; + } + + .out_range { + text-shadow: 0 0 4px rgb(233, 42, 42), 0 0 10px rgb(236, 97, 97), 0 0 20px rgb(233, 42, 42), 0 -10px 40px #c33; + } } th { vertical-align: middle; @@ -656,13 +672,19 @@ @media (max-width: 450px) { margin-top: 2rem; padding: 1rem; - background-color: transparent; + .card-wrapper { margin: 0rem; .card { background-color: transparent; padding: 0rem; overflow-x: unset; + + &-header { + h3 { + font-size: 1.2rem; + } + } } } @@ -670,12 +692,90 @@ display: none; } + .rewards-mobile { + margin-top: 1.5rem; + margin-bottom: 1rem; + background-color: $darker !important; + } + + .box { + display: flex; + justify-content: space-between; + margin: 0.75rem 0rem; + border: 0.5px solid $highlight; + border-radius: 5px; + + .title { + display: flex; + width: 45%; + padding: 0.5rem; + background-color: $darkest; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + + &-price { + font-size: 0.85rem; + } + } + + .value { + display: flex; + justify-content: flex-end; + width: 55%; + padding: 0.5rem; + } + } + .rewards { display: flex; flex-direction: column; - padding: 0.5rem; - background-color: $darker; - } + + &-tier { + flex-direction: column; + align-items: flex-start; + } + &-item { + .title { + width: 55%; + } + .value { + width: 45%; + } + } + + &-total { + margin-top: 1.5rem; + &-heading { + display: flex; + flex-direction: row; + } + &-claim { + display: flex; + flex-direction: row; + align-items: center; + margin-top: 0.5rem; + border: 0.5px solid $highlight; + border-radius: 5px; + .amount { + display: flex; + align-items: center; + width: 55%; + height: 100%; + padding-left: 0.7rem; + } + .claim-button { + width: 45%; + .btn { + height: 3rem; + width: 100% !important; + margin: 0rem !important; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + } + } + } + } + } .positions-mobile { svg { @@ -684,6 +784,14 @@ .position { padding: 1rem !important; background-color: $darker; + + .card-header { + padding: 0rem; + } + .card-body { + padding: 0rem; + padding-top: 1rem; + } .description { display: flex; flex-direction: row; @@ -703,36 +811,21 @@ } .title { display: flex; + align-items: center; } .ranges { + align-items: center; padding: 0.5rem; border: 0.5px solid $highlight; - border-radius: 5px; - } - .box { - display: flex; - justify-content: space-between; - margin: 0.5rem 0rem; - border: 0.5px solid $highlight; - border-radius: 5px; - .title { - width: 45%; - padding: 0.5rem; - background-color: $darkest; - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; - } - .value { + border-radius: 5px; + } + .status { + .value { display: flex; - justify-content: flex-end; - width: 55%; - padding: 0.5rem; + font-family: "Nineteen Ninety Seven"; } } - .status { - display: flex; - } &-actions { display: grid; diff --git a/src/styles/faucet.scss b/src/styles/faucet.scss deleted file mode 100644 index 14cb596..0000000 --- a/src/styles/faucet.scss +++ /dev/null @@ -1,112 +0,0 @@ -@import "./colors"; -@import "./fonts"; - -div.faucet { - padding: 1rem 3rem; - padding-bottom: 0px; - - .btn { - width: 13.4375rem; - height: 3.875rem; - border-radius: 1px; - margin-top: 2rem; - } - - .info { - border-bottom: 1px solid $dark; - - h4 { - padding: 2rem; - padding-bottom: 0; - } - p { - padding: 2rem; - padding-top: 0; - padding-bottom: 0; - } - } - - form { - padding: 2rem; - - label { - font-family: "Nineteen Ninety Seven"; - color: $white; - } - - .text-muted { - text-align: right; - font-size: 1rem; - } - - input[type="text"] { - border-radius: 1px; - background: no-repeat; - border-color: $dark; - color: $white; - height: 3.375rem; - } - - .btn { - margin-top: 2rem; - border-radius: 1px; - width: 100%; - box-shadow: 0px 6px 25px -6px rgba(241, 36, 255, 0.4); - } - } - - // Small devices (landscape phones, 576px and up) - @media (min-width: 576px) { - .actions { - margin-top: 2.5rem; - display: grid; - grid-template-columns: auto; - margin-bottom: 4rem; - } - .card { - margin-bottom: 2rem; - } - } - - // Large devices (desktops, 992px and up) - @media (min-width: 992px) { - .actions { - margin-top: 2.5rem; - display: grid; - grid-template-columns: 33% auto 33%; - margin-bottom: 0rem; - column-gap: 1rem; - } - - .card { - margin-bottom: 0rem; - } - - @media (max-width: 1100px) { - .card { - .info { - h4 { - font-size: 1.4rem; - } - } - } - - @media (max-height: 780px) { - .actions { - margin-top: 2rem; - } - form { - padding: 1rem 2rem; - } - } - } - } - - @media (max-width: 600px) { - padding: 4rem 1.4rem; - - .card { - margin-top: 2rem; - } - } -} diff --git a/src/styles/modal.scss b/src/styles/modal.scss index 78c42a9..ef22e3f 100644 --- a/src/styles/modal.scss +++ b/src/styles/modal.scss @@ -284,4 +284,15 @@ overflow-x: scroll; } } + + @media (max-width: 1000px) { + padding: 0.5rem; + + .modal-body { + padding: 0rem 0.5rem; + } + .modal-footer { + padding: 0.5rem; + } + } } \ No newline at end of file From 08eb26890fc5eb7549698aa0e9f9220c5bca5141 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sat, 28 Jan 2023 18:16:38 -0600 Subject: [PATCH 227/278] sushi liquidity rewards mobile support --- .../Farm/LiquidityRewards/index.tsx | 838 ++++++++++++++++++ src/components/Farm/UniV3Rewards/Rewards.tsx | 31 +- src/components/Farm/index.tsx | 696 +-------------- src/styles/farm.scss | 206 +++-- src/styles/graph.scss | 219 ----- 5 files changed, 1002 insertions(+), 988 deletions(-) create mode 100644 src/components/Farm/LiquidityRewards/index.tsx delete mode 100644 src/styles/graph.scss diff --git a/src/components/Farm/LiquidityRewards/index.tsx b/src/components/Farm/LiquidityRewards/index.tsx new file mode 100644 index 0000000..8406388 --- /dev/null +++ b/src/components/Farm/LiquidityRewards/index.tsx @@ -0,0 +1,838 @@ +import React, { useContext, useEffect, useState } from "react"; +import { Button, Card, Table, OverlayTrigger, Tooltip } from "react-bootstrap/esm"; +import { ethers } from "ethers"; +import NumberFormat from "react-number-format"; +import { useTranslation } from "react-i18next"; +import { useMediaQuery } from "react-responsive"; +import { + governanceContext, + oraclesContext, + rewardsContext, + signerContext, + tokensContext, +} from "../../../state"; +import { ReactComponent as CtxIcon } from "../../../assets/images/ctx-coin.svg"; +import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; +import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; +import Loading from "../../Loading"; +import { notifyUser, errorNotification, getPriceInUSDFromPair } from "../../../utils/utils"; + +const ctxClaimVestShowDate = new Date(1634511235 * 1000); + +const LiquidityRewards = () => { + const { t } = useTranslation(); + const isMobile = useMediaQuery({ query: "(max-width: 450px)" }); + const signer = useContext(signerContext); + const tokens = useContext(tokensContext); + const oracles = useContext(oraclesContext); + const governance = useContext(governanceContext); + const rewards = useContext(rewardsContext); + const [address, setAddress] = useState(""); + const [isLoading, setIsLoading] = useState(true); + const [ethPoolRewards, setEthPoolRewards] = useState("0.0"); + const [ctxPoolRewards, setCtxPoolRewards] = useState("0.0"); + const [vethPoolRewards, setVEthPoolRewards] = useState("0.0"); + const [vctxPoolRewards, setVCtxPoolRewards] = useState("0.0"); + const [ethPoolStake, setEthPoolStake] = useState("0.0"); + const [ctxPoolStake, setCtxPoolStake] = useState("0.0"); + const [ethPoolBalance, setEthPoolBalance] = useState("0.0"); + const [ctxPoolBalance, setCtxPoolBalance] = useState("0.0"); + const [ethVestAmount, setEthVestAmount] = useState(ethers.BigNumber.from(0)); + const [ctxVestAmount, setCtxVestAmount] = useState(ethers.BigNumber.from(0)); + const [updateData, setUpdateData] = useState(false); + + // APY + const [, setEthVaultAPY] = useState("0"); + const [, setDaiVaultAPY] = useState("0"); + + const oneYear = 60 * 60 * 24 * 365; + + const lpURL = "https://app.sushi.com"; + const phase = process.env.REACT_APP_PHASE ? parseInt(process.env.REACT_APP_PHASE) : 0; + + async function getAPYFromVaultRewards( + totalTcapDebt: number, + rate: number, + ctxPrice: number, + tcapPrice: number + ) { + const apy = ((rate * oneYear * ctxPrice) / (tcapPrice * totalTcapDebt)) * 100; + return apy.toString(); + } + + const refresh = async () => { + try { + setUpdateData(!updateData); + } catch (error) { + // catch error in case the vault screen is changed + } + }; + + useEffect(() => { + const loadAddress = async () => { + if ( + tokens.tcapToken && + tokens.wethPoolToken && + oracles.tcapOracle && + tokens.ctxToken && + oracles.wethOracle && + governance.governorAlpha && + governance.timelock && + rewards.wethReward && + rewards.daiReward && + rewards.wethPoolReward + ) { + // Batch Calls + const wethOracleCall = oracles.wethOracleRead?.getLatestAnswer(); + const tcapOracleCall = oracles.tcapOracleRead?.getLatestAnswer(); + const totalTcapDebtWethCall = await rewards.wethRewardRead?.totalSupply(); + const rateWethCall = await rewards.wethRewardRead?.rewardRate(); + const totalTcapDebtDaihCall = await rewards.daiRewardRead?.totalSupply(); + const rateDaiCall = await rewards.daiRewardRead?.rewardRate(); + const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); + const wethPoolVestingRatioCall = await rewards.wethPoolRewardRead?.vestingRatio(); + const ctxVestingRatioCall = await rewards.ctxPoolRewardRead?.vestingRatio(); + + // @ts-ignore + const [ + wethOraclePrice, + tcapPrice, + totalTcapDebtWeth, + rateWeth, + totalTcapDebtDai, + rateDai, + reservesCtxPool, + wethPoolVestingRatio, + ctxVestingRatio, + ] = await signer.ethcallProvider?.all([ + wethOracleCall, + tcapOracleCall, + totalTcapDebtWethCall, + rateWethCall, + totalTcapDebtDaihCall, + rateDaiCall, + reservesCtxPoolCall, + wethPoolVestingRatioCall, + ctxVestingRatioCall, + ]); + + const currentPriceTCAP = ethers.utils.formatEther(tcapPrice); + const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); + + // REACT_APP_POOL_CTX + const currentPriceCTX = await getPriceInUSDFromPair( + reservesCtxPool[0], + reservesCtxPool[1], + parseFloat(currentPriceETH) + ); + // ETH VAULT APY + setEthVaultAPY( + await getAPYFromVaultRewards( + totalTcapDebtWeth, + rateWeth, + currentPriceCTX, + parseFloat(currentPriceTCAP) + ) + ); + + // DAI VAULT APY + setDaiVaultAPY( + await getAPYFromVaultRewards( + totalTcapDebtDai, + rateDai, + currentPriceCTX, + parseFloat(currentPriceTCAP) + ) + ); + + if (signer.signer) { + const currentAddress = await signer.signer.getAddress(); + setAddress(currentAddress); + + const currentEthPoolRewardCall = await rewards.wethPoolRewardRead?.earned(currentAddress); + const currentVEthPoolRewardCall = await rewards.wethPoolRewardRead?.vestingAmounts( + currentAddress + ); + const currentEthPoolStakeCall = await rewards.wethPoolRewardRead?.balanceOf( + currentAddress + ); + const currentEthPoolBalanceCall = await tokens.wethPoolTokenRead?.balanceOf( + currentAddress + ); + const currentCtxPoolRewardCall = await rewards.ctxPoolRewardRead?.earned(currentAddress); + const currentVCtxPoolRewardCall = await rewards.ctxPoolRewardRead?.vestingAmounts( + currentAddress + ); + const currentCtxPoolStakeCall = await rewards.ctxPoolRewardRead?.balanceOf( + currentAddress + ); + const currentCtxPoolBalanceCall = await tokens.ctxPoolTokenRead?.balanceOf( + currentAddress + ); + + // @ts-ignore + const [ + currentEthPoolReward, + currentVEthPoolReward, + currentEthPoolStake, + currentEthPoolBalance, + currentCtxPoolReward, + currentVCtxPoolReward, + currentCtxPoolStake, + currentCtxPoolBalance, + ] = await signer.ethcallProvider?.all([ + currentEthPoolRewardCall, + currentVEthPoolRewardCall, + currentEthPoolStakeCall, + currentEthPoolBalanceCall, + currentCtxPoolRewardCall, + currentVCtxPoolRewardCall, + currentCtxPoolStakeCall, + currentCtxPoolBalanceCall, + ]); + + setEthVestAmount(currentVEthPoolReward); + setCtxVestAmount(currentVCtxPoolReward); + if (phase > 1) { + setEthPoolRewards( + ethers.utils.formatEther( + currentEthPoolReward.mul(100 - wethPoolVestingRatio).div(100) + ) + ); + setVEthPoolRewards( + ethers.utils.formatEther( + currentVEthPoolReward.add(currentEthPoolReward.mul(wethPoolVestingRatio).div(100)) + ) + ); + setEthPoolStake(ethers.utils.formatEther(currentEthPoolStake)); + setEthPoolBalance(ethers.utils.formatEther(currentEthPoolBalance)); + setCtxPoolRewards( + ethers.utils.formatEther(currentCtxPoolReward.mul(100 - ctxVestingRatio).div(100)) + ); + setVCtxPoolRewards( + ethers.utils.formatEther( + currentVCtxPoolReward.add(currentCtxPoolReward.mul(ctxVestingRatio).div(100)) + ) + ); + setCtxPoolStake(ethers.utils.formatEther(currentCtxPoolStake)); + setCtxPoolBalance(ethers.utils.formatEther(currentCtxPoolBalance)); + } + } + } + setIsLoading(false); + }; + + loadAddress(); + // eslint-disable-next-line + }, [updateData]); + + if (isLoading) { + return ; + } + + const showCtxClaimVest = (): boolean => { + const today = new Date(); + return today > ctxClaimVestShowDate; + }; + + const claimRewards = async (vaultType: string) => { + try { + let tx: ethers.ContractTransaction; + switch (vaultType) { + case "ETH": + tx = await rewards?.wethReward?.getReward(); + break; + case "WBTC": + tx = await rewards?.wbtcReward?.getReward(); + break; + case "DAI": + tx = await rewards?.daiReward?.getReward(); + break; + case "ETHPOOL": + tx = await rewards?.wethPoolReward?.getReward(); + break; + case "WBTCPOOL": + tx = await rewards?.wbtcPoolReward?.getReward(); + break; + case "DAIPOOL": + tx = await rewards?.daiPoolReward?.getReward(); + break; + case "CTXPOOL": + tx = await rewards?.ctxPoolReward?.getReward(); + break; + default: + tx = await rewards?.wethReward?.getReward(); + break; + } + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001) { + errorNotification(t("errors.tran-rejected")); + } else { + errorNotification(t("errors.no-funds")); + } + } + }; + + const claimVest = async (vaultType: string) => { + try { + let tx: ethers.ContractTransaction; + switch (vaultType) { + case "ETH": + tx = await rewards?.wethReward?.claimVest(); + break; + case "WBTC": + tx = await rewards?.wbtcReward?.claimVest(); + break; + case "DAI": + tx = await rewards?.daiReward?.claimVest(); + break; + case "ETHPOOL": + tx = await rewards?.wethPoolReward?.claimVest(); + break; + case "WBTCPOOL": + tx = await rewards?.wbtcPoolReward?.claimVest(); + break; + case "DAIPOOL": + tx = await rewards?.daiPoolReward?.claimVest(); + break; + case "CTXPOOL": + tx = await rewards?.ctxPoolReward?.claimVest(); + break; + default: + tx = await rewards?.wethReward?.claimVest(); + break; + } + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification("Transaction rejected"); + } else { + errorNotification("Error claiming vest"); + } + } + }; + + const exitRewards = async (vaultType: string) => { + try { + let tx: ethers.ContractTransaction; + switch (vaultType) { + case "ETHPOOL": + tx = await rewards?.wethPoolReward?.exit(); + break; + case "WBTCPOOL": + tx = await rewards?.wbtcPoolReward?.exit(); + break; + case "DAIPOOL": + tx = await rewards?.daiPoolReward?.exit(); + break; + case "CTXPOOL": + tx = await rewards?.ctxPoolReward?.exit(); + break; + default: + tx = await rewards?.wethPoolReward?.exit(); + break; + } + notifyUser(tx, refresh); + } catch (error) { + if (error.code === 4001 || error.code === -32603) { + errorNotification("Transaction rejected"); + } else { + errorNotification("Insufficient funds to exit"); + } + } + }; + + const RenderEthTcapBtnActions = () => ( + <> + {ethVestAmount.eq(0) ? ( + + ) : ( + + )} + + + ); + + const RenderEthCtxBtnActions = () => ( + <> + {ctxVestAmount.gt(0) && showCtxClaimVest() ? ( + + ) : ( + + )} + + + ); + + const RenderMobile = () => ( +
+ + +
+ + +
+ +
+ +
+
+
+ <>{t("balance")}: +
+
+
+ +
+
+
+
+
+ <>{t("stake")}: +
+
+
+ +
+
+
+
+
+ <>{t("farming.unlocked")}: +
+
+
+ +
+
+
+
+
+ <>{t("farming.locked")}: +
+
+
+ +
+
+
+
+
APR:
+
+
+ Expired +
+
+
+ + + +
+ + +
+ + +
+ +
+ +
+
+
+ <>{t("balance")}: +
+
+
+ +
+
+
+
+
+ <>{t("stake")}: +
+
+
+ +
+
+
+
+
+ <>{t("farming.unlocked")}: +
+
+
+ +
+
+
+
+
+ <>{t("farming.locked")}: +
+
+
+ +
+
+
+
+
APR:
+
+
+ Expired +
+
+
+ + + +
+
+ ); + + return ( + +

+ <>{t("farming.liquidity")} +

+ {!isMobile ? ( + + + + + + + + {" "} + + + + + + + + + + + + + + + + + + {" "} + + {" "} + + + + + +
+ + <>{t("description")} + + <>{t("balance")} + + <>{t("stake")} + +
+
+ <>{t("farming.unlocked")} +
+
+ + <>{t("farming.unlocked-info")} + + } + > + + +
+
+
+
+
+ <>{t("farming.locked")} +
+
+ + <>{t("farming.locked-info")} + + } + > + + +
+
+
APR +
+ + + + + <> + {t("farming.eth-tcap-pool")}
SushiSwap + +
+
+ {" "} + + {" "} + + {" "} + CTX + +
+ {" "} + CTX +
+
+ Expired + + +
+ + + + + <> + {t("farming.eth-ctx-pool")}
SushiSwap + +
+
+ {" "} + + {" "} + + {" "} + CTX + +
+ {" "} + CTX +
+
+ + Expired + + + +
+ ) : ( + + )} +
+ ); +}; + +export default LiquidityRewards; diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 8b3f2ba..ced1684 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -594,6 +594,9 @@ const Rewards = ({
@@ -704,6 +707,17 @@ const Rewards = ({
); + const RenderMobile = () => ( + <> + + + + + + + + ); + return ( {!isMobile ? ( @@ -746,12 +760,17 @@ const Rewards = ({ ) : ( <> - - - - - - + {ownerAddress !== "" ? ( + <> + {loading && firstLoad ? ( + + ) : ( + <>{ethTcapPositions.length === 0 ? RenderEmptyLP() : RenderMobile()} + )} + + ) : ( + + )} )} { const { t } = useTranslation(); const isMobile = useMediaQuery({ query: "(max-width: 450px)" }); const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); - const tokens = useContext(tokensContext); - const oracles = useContext(oraclesContext); - const governance = useContext(governanceContext); - const rewards = useContext(rewardsContext); - const [address, setAddress] = useState(""); - const [isLoading, setIsLoading] = useState(true); - /* const [ethRewards, setEthRewards] = useState("0"); - const [daiRewards, setDaiRewards] = useState("0"); */ - const [ethPoolRewards, setEthPoolRewards] = useState("0.0"); - const [ctxPoolRewards, setCtxPoolRewards] = useState("0.0"); - const [vethPoolRewards, setVEthPoolRewards] = useState("0.0"); - const [vctxPoolRewards, setVCtxPoolRewards] = useState("0.0"); - const [ethPoolStake, setEthPoolStake] = useState("0.0"); - const [ctxPoolStake, setCtxPoolStake] = useState("0.0"); - const [ethPoolBalance, setEthPoolBalance] = useState("0.0"); - const [ctxPoolBalance, setCtxPoolBalance] = useState("0.0"); - const [ethVestAmount, setEthVestAmount] = useState(ethers.BigNumber.from(0)); - const [ctxVestAmount, setCtxVestAmount] = useState(ethers.BigNumber.from(0)); - const [updateData, setUpdateData] = useState(false); - - // APY - const [, setEthVaultAPY] = useState("0"); - const [, setDaiVaultAPY] = useState("0"); - // const [ethPoolAPY, setEthPoolAPY] = useState("0"); - // const [ctxPoolAPY, setCtxPoolAPY] = useState("0"); - - const oneYear = 60 * 60 * 24 * 365; - - const lpURL = "https://app.sushi.com"; - const phase = process.env.REACT_APP_PHASE ? parseInt(process.env.REACT_APP_PHASE) : 0; - - async function getAPYFromVaultRewards( - totalTcapDebt: number, - rate: number, - ctxPrice: number, - tcapPrice: number - ) { - const apy = ((rate * oneYear * ctxPrice) / (tcapPrice * totalTcapDebt)) * 100; - return apy.toString(); - } - - /* async function getAPYFromLPRewards( - rate: number, - LPsStaked: number, - reserves: any, - totalSupplyPool: number, - ctxPrice: number, - ethPrice: number - ) { - const token0Price = await getPriceInUSDFromPair(reserves[0], reserves[1], ethPrice); - const valuePerLPToken = (token0Price * reserves[0] + ethPrice * reserves[1]) / totalSupplyPool; - const apy = ((rate * oneYear * ctxPrice) / (valuePerLPToken * LPsStaked)) * 100; - - if (Number.isNaN(apy)) { - return "0"; - } - - return apy.toString(); - } */ - - const refresh = async () => { - try { - setUpdateData(!updateData); - } catch (error) { - // catch error in case the vault screen is changed - } - }; - - useEffect(() => { - const loadAddress = async () => { - if ( - tokens.tcapToken && - tokens.wethPoolToken && - oracles.tcapOracle && - tokens.ctxToken && - oracles.wethOracle && - governance.governorAlpha && - governance.timelock && - rewards.wethReward && - rewards.daiReward && - rewards.wethPoolReward - ) { - // Batch Calls - const wethOracleCall = oracles.wethOracleRead?.getLatestAnswer(); - const tcapOracleCall = oracles.tcapOracleRead?.getLatestAnswer(); - const totalTcapDebtWethCall = await rewards.wethRewardRead?.totalSupply(); - const rateWethCall = await rewards.wethRewardRead?.rewardRate(); - const totalTcapDebtDaihCall = await rewards.daiRewardRead?.totalSupply(); - const rateDaiCall = await rewards.daiRewardRead?.rewardRate(); - const reservesCtxPoolCall = await tokens.ctxPoolTokenRead?.getReserves(); - // const totalSupplyCtxPoolCall = await tokens.ctxPoolTokenRead?.totalSupply(); - // const rateCtxPoolCall = await rewards.ctxPoolRewardRead?.rewardRate(); - // const ctxLPsStakedCall = await rewards.ctxPoolRewardRead?.totalSupply(); - const wethPoolVestingRatioCall = await rewards.wethPoolRewardRead?.vestingRatio(); - const ctxVestingRatioCall = await rewards.ctxPoolRewardRead?.vestingRatio(); - - // @ts-ignore - const [ - wethOraclePrice, - tcapPrice, - totalTcapDebtWeth, - rateWeth, - totalTcapDebtDai, - rateDai, - reservesCtxPool, - wethPoolVestingRatio, - ctxVestingRatio, - ] = await signer.ethcallProvider?.all([ - wethOracleCall, - tcapOracleCall, - totalTcapDebtWethCall, - rateWethCall, - totalTcapDebtDaihCall, - rateDaiCall, - reservesCtxPoolCall, - wethPoolVestingRatioCall, - ctxVestingRatioCall, - ]); - - const currentPriceTCAP = ethers.utils.formatEther(tcapPrice); - const currentPriceETH = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); - - // REACT_APP_POOL_CTX - const currentPriceCTX = await getPriceInUSDFromPair( - reservesCtxPool[0], - reservesCtxPool[1], - parseFloat(currentPriceETH) - ); - // ETH VAULT APY - setEthVaultAPY( - await getAPYFromVaultRewards( - totalTcapDebtWeth, - rateWeth, - currentPriceCTX, - parseFloat(currentPriceTCAP) - ) - ); - - // DAI VAULT APY - setDaiVaultAPY( - await getAPYFromVaultRewards( - totalTcapDebtDai, - rateDai, - currentPriceCTX, - parseFloat(currentPriceTCAP) - ) - ); - - // CTX Pool APY - /* setCtxPoolAPY( - await getAPYFromLPRewards( - rateCtxPool, - ctxLPsStaked, - reservesCtxPool, - totalSupplyCtxPool, - currentPriceCTX, - parseFloat(currentPriceETH) - ) - ); */ - - if (signer.signer) { - const currentAddress = await signer.signer.getAddress(); - setAddress(currentAddress); - - /* const currentEthRewardCall = await rewards?.wethRewardRead?.earned(currentAddress); - const currentDaiRewardCall = await rewards?.daiRewardRead?.earned(currentAddress); */ - const currentEthPoolRewardCall = await rewards.wethPoolRewardRead?.earned(currentAddress); - const currentVEthPoolRewardCall = await rewards.wethPoolRewardRead?.vestingAmounts( - currentAddress - ); - const currentEthPoolStakeCall = await rewards.wethPoolRewardRead?.balanceOf( - currentAddress - ); - const currentEthPoolBalanceCall = await tokens.wethPoolTokenRead?.balanceOf( - currentAddress - ); - const currentCtxPoolRewardCall = await rewards.ctxPoolRewardRead?.earned(currentAddress); - const currentVCtxPoolRewardCall = await rewards.ctxPoolRewardRead?.vestingAmounts( - currentAddress - ); - const currentCtxPoolStakeCall = await rewards.ctxPoolRewardRead?.balanceOf( - currentAddress - ); - const currentCtxPoolBalanceCall = await tokens.ctxPoolTokenRead?.balanceOf( - currentAddress - ); - - // @ts-ignore - const [ - currentEthPoolReward, - currentVEthPoolReward, - currentEthPoolStake, - currentEthPoolBalance, - currentCtxPoolReward, - currentVCtxPoolReward, - currentCtxPoolStake, - currentCtxPoolBalance, - ] = await signer.ethcallProvider?.all([ - currentEthPoolRewardCall, - currentVEthPoolRewardCall, - currentEthPoolStakeCall, - currentEthPoolBalanceCall, - currentCtxPoolRewardCall, - currentVCtxPoolRewardCall, - currentCtxPoolStakeCall, - currentCtxPoolBalanceCall, - ]); - - /* setEthRewards(ethers.utils.formatEther(currentEthReward)); - setDaiRewards(ethers.utils.formatEther(currentDaiReward)); */ - - setEthVestAmount(currentVEthPoolReward); - setCtxVestAmount(currentVCtxPoolReward); - if (phase > 1) { - setEthPoolRewards( - ethers.utils.formatEther( - currentEthPoolReward.mul(100 - wethPoolVestingRatio).div(100) - ) - ); - setVEthPoolRewards( - ethers.utils.formatEther( - currentVEthPoolReward.add(currentEthPoolReward.mul(wethPoolVestingRatio).div(100)) - ) - ); - setEthPoolStake(ethers.utils.formatEther(currentEthPoolStake)); - setEthPoolBalance(ethers.utils.formatEther(currentEthPoolBalance)); - setCtxPoolRewards( - ethers.utils.formatEther(currentCtxPoolReward.mul(100 - ctxVestingRatio).div(100)) - ); - setVCtxPoolRewards( - ethers.utils.formatEther( - currentVCtxPoolReward.add(currentCtxPoolReward.mul(ctxVestingRatio).div(100)) - ) - ); - setCtxPoolStake(ethers.utils.formatEther(currentCtxPoolStake)); - setCtxPoolBalance(ethers.utils.formatEther(currentCtxPoolBalance)); - } - } - } - setIsLoading(false); - }; - - loadAddress(); - // eslint-disable-next-line - }, [updateData]); - - if (isLoading) { - return ; - } - - const showCtxClaimVest = (): boolean => { - const today = new Date(); - return today > ctxClaimVestShowDate; - }; - - const claimRewards = async (vaultType: string) => { - try { - let tx: ethers.ContractTransaction; - switch (vaultType) { - case "ETH": - tx = await rewards?.wethReward?.getReward(); - break; - case "WBTC": - tx = await rewards?.wbtcReward?.getReward(); - break; - case "DAI": - tx = await rewards?.daiReward?.getReward(); - break; - case "ETHPOOL": - tx = await rewards?.wethPoolReward?.getReward(); - break; - case "WBTCPOOL": - tx = await rewards?.wbtcPoolReward?.getReward(); - break; - case "DAIPOOL": - tx = await rewards?.daiPoolReward?.getReward(); - break; - case "CTXPOOL": - tx = await rewards?.ctxPoolReward?.getReward(); - break; - default: - tx = await rewards?.wethReward?.getReward(); - break; - } - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001) { - errorNotification(t("errors.tran-rejected")); - } else { - errorNotification(t("errors.no-funds")); - } - } - }; - - const claimVest = async (vaultType: string) => { - try { - let tx: ethers.ContractTransaction; - switch (vaultType) { - case "ETH": - tx = await rewards?.wethReward?.claimVest(); - break; - case "WBTC": - tx = await rewards?.wbtcReward?.claimVest(); - break; - case "DAI": - tx = await rewards?.daiReward?.claimVest(); - break; - case "ETHPOOL": - tx = await rewards?.wethPoolReward?.claimVest(); - break; - case "WBTCPOOL": - tx = await rewards?.wbtcPoolReward?.claimVest(); - break; - case "DAIPOOL": - tx = await rewards?.daiPoolReward?.claimVest(); - break; - case "CTXPOOL": - tx = await rewards?.ctxPoolReward?.claimVest(); - break; - default: - tx = await rewards?.wethReward?.claimVest(); - break; - } - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification("Transaction rejected"); - } else { - errorNotification("Error claiming vest"); - } - } - }; - - const exitRewards = async (vaultType: string) => { - try { - let tx: ethers.ContractTransaction; - switch (vaultType) { - case "ETHPOOL": - tx = await rewards?.wethPoolReward?.exit(); - break; - case "WBTCPOOL": - tx = await rewards?.wbtcPoolReward?.exit(); - break; - case "DAIPOOL": - tx = await rewards?.daiPoolReward?.exit(); - break; - case "CTXPOOL": - tx = await rewards?.ctxPoolReward?.exit(); - break; - default: - tx = await rewards?.wethPoolReward?.exit(); - break; - } - notifyUser(tx, refresh); - } catch (error) { - if (error.code === 4001 || error.code === -32603) { - errorNotification("Transaction rejected"); - } else { - errorNotification("Insufficient funds to exit"); - } - } - }; return (
@@ -408,313 +26,7 @@ const Farm = () => { )} - {currentNetwork.chainId === NETWORKS.mainnet.chainId && ( - -

- <>{t("farming.liquidity")} -

- - - - - - - - {" "} - - - - - - - - - - - - - - - - - - {" "} - - {" "} - - - - - -
- - <>{t("description")} - - <>{t("balance")} - - <>{t("stake")} - -
-
- <>{t("farming.unlocked")} -
-
- - <>{t("farming.unlocked-info")} - - } - > - - -
-
-
-
-
- <>{t("farming.locked")} -
-
- - <>{t("farming.locked-info")} - - } - > - - -
-
-
APR -
- - - - - <> - {t("farming.eth-tcap-pool")}
SushiSwap - -
-
- {" "} - - {" "} - - {" "} - CTX - -
- {" "} - CTX -
-
- Expired - - {address === "" ? ( - <> - - - - ) : ( - <> - {ethVestAmount.eq(0) ? ( - - ) : ( - - )} - - - )} -
- - - - - <> - {t("farming.eth-ctx-pool")}
SushiSwap - -
-
- {" "} - - {" "} - - {" "} - CTX - -
- {" "} - CTX -
-
- - Expired - - - {address === "" ? ( - <> - - - - - ) : ( - <> - {/* */} - {ctxVestAmount.gt(0) && showCtxClaimVest() ? ( - - ) : ( - - )} - - - )} -
-
- )} + {currentNetwork.chainId === NETWORKS.mainnet.chainId && }
diff --git a/src/styles/farm.scss b/src/styles/farm.scss index b1bb108..2a6c496 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -466,80 +466,95 @@ } } } - .empty-lp{ + } + + .empty-lp { + display: flex; + flex-direction: column; + align-items: center; + + .lp-box { + border: 1px solid $light; + border-radius: 5px; + background-color: #281e31a3; + } + + .lp-info { display: flex; flex-direction: column; - align-items: center; - .lp-box { - border: 1px solid $light; - border-radius: 5px; - background-color: #281e31a3; - } - .lp-info { + padding: 15px; + + .row1 { display: flex; - flex-direction: column; - padding: 15px; - .row1 { - display: flex; - flex-direction: row; - } - .row2 { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - margin-top: 0.6rem; - h6 { - font-size: 0.9rem; - margin: 0rem; - } - .number { - font-size: 0.85rem; - margin-left: 0.3rem; - } - .neon-pink { - margin-left: 0.3rem; - font-size: 0.9rem; - text-shadow: 0 0 4px #f195f9, 0 0 10px #fff, 0 0 20px #e440f2, 0 -10px 40px #b626c4; - } - } + flex-direction: row; } - .icons { + + .row2 { display: flex; + flex-direction: row; + justify-content: center; align-items: center; - padding: 5px; - padding-top: 0px; - } - .description { - margin-left: 10px; - padding: 5px; - } - .uni { - margin-left: -10px; - filter: drop-shadow(0 0 5px #a440f2); - } - .btn-box { - width: 100%; - } - .btn { - font-size: 0.9rem; - height: 2.5rem; - width: 100%; - border: 0px; - border-top: 0.8px solid $light; - background-color: #281e31; - margin: 0px; - padding-top: 8px; - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; - } - .btn:hover { - color: $white; - } - small { - margin-left: -10px; + margin-top: 0.6rem; + + h6 { + font-size: 0.9rem; + margin: 0rem; + } + + .number { + font-size: 0.85rem; + margin-left: 0.3rem; + } + + .neon-pink { + margin-left: 0.3rem; + font-size: 0.9rem; + text-shadow: 0 0 4px #f195f9, 0 0 10px #fff, 0 0 20px #e440f2, 0 -10px 40px #b626c4; + } } } + + .icons { + display: flex; + align-items: center; + padding: 5px; + padding-top: 0px; + } + + .description { + margin-left: 10px; + padding: 5px; + } + + .uni { + margin-left: -10px; + filter: drop-shadow(0 0 5px #a440f2); + } + + .btn-box { + width: 100%; + } + + .btn { + font-size: 0.9rem; + height: 2.5rem; + width: 100%; + border: 0px; + border-top: 0.8px solid $light; + background-color: #281e31; + margin: 0px; + padding-top: 8px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + } + + .btn:hover { + color: $white; + } + + small { + margin-left: -10px; + } } .unstaked { @@ -688,10 +703,6 @@ } } - .liquidity { - display: none; - } - .rewards-mobile { margin-top: 1.5rem; margin-bottom: 1rem; @@ -721,6 +732,7 @@ .value { display: flex; justify-content: flex-end; + align-items: center; width: 55%; padding: 0.5rem; } @@ -777,6 +789,23 @@ } } + .empty-lp { + margin-top: 2rem; + + .lp-box { + width: 95%; + } + .lp-info { + padding-bottom: 1.6rem !important; + } + .btn { + display: flex; + align-items: center; + justify-content: center; + height: 3rem !important; + } + } + .positions-mobile { svg { color: white; @@ -792,6 +821,13 @@ padding: 0rem; padding-top: 1rem; } + &-title { + display: flex; + align-items: center; + } + &-link { + margin-left: 0.5rem; + } .description { display: flex; flex-direction: row; @@ -831,7 +867,7 @@ display: grid; grid-template-columns: 50% 50%; gap: 0.5rem; - padding: 0rem; + padding: 1rem 0rem; .btn { height: 3rem; width: 95% !important; @@ -840,6 +876,34 @@ } } } + + .liquidity { + margin-top: 4rem !important; + + &-reward { + background-color: $darker !important; + margin-bottom: 1.5rem; + + &-header { + display: flex; + align-items: center; + .icons { + margin-right: 1rem; + } + } + &-actions { + display: grid; + grid-template-columns: 50% 50%; + gap: 0.5rem; + + .btn { + height: 3rem !important; + width: 95% !important; + margin: 0rem !important; + } + } + } + } } diff --git a/src/styles/graph.scss b/src/styles/graph.scss deleted file mode 100644 index 47dd2bc..0000000 --- a/src/styles/graph.scss +++ /dev/null @@ -1,219 +0,0 @@ -.graph { - padding-bottom: 0px; - - // Small devices (landscape phones, 576px and up) - @media (min-width: 300px) { - padding: 1rem 1rem; - padding-bottom: 0px; - - .grid { - display: grid; - grid-template-columns: auto; - grid-template-rows: auto auto auto; - gap: 2rem; - margin-bottom: 4rem; - } - - h4 { - font-size: 1rem; - margin-top: 2rem; - margin-bottom: 0; - } - - h5 { - margin-top: 0.75rem; - font-size: 1rem; - margin-bottom: 0; - } - - .card { - padding: 2rem; - } - } - - // Small devices (landscape phones, 576px and up) - @media (min-width: 576px) { - padding: 5rem 3rem; - - .grid { - display: grid; - grid-template-columns: auto auto; - grid-template-rows: auto auto auto; - gap: 2rem; - margin-bottom: 4rem; - } - - h4 { - font-size: 1rem; - margin-top: 2rem; - margin-bottom: 0; - } - - h5 { - margin-top: 0.75rem; - font-size: 1rem; - margin-bottom: 0; - } - .card { - padding: 2.2rem; - - @media (max-width: 750px) { - padding: 1.8rem; - h4 { - font-size: 0.9rem; - } - h5 { - font-size: 0.9rem; - } - } - @media (max-width: 680px) { - padding: 1.5rem; - h4 { - font-size: 0.8rem; - } - h5 { - font-size: 0.8rem; - margin-top: 0.5rem; - } - } - } - } - - // Medium devices (tablets, 768px and up) - @media (min-width: 768px) { - padding: 5rem 2rem; - - .card { - h4 { - font-size: 1.25rem; - margin-top: 1.5rem; - margin-bottom: 0; - } - - h5 { - margin-top: 0.75rem; - font-size: 1.3rem; - margin-bottom: 0; - } - - @media (max-width: 935px) { - h4 { - font-size: 1.2rem; - margin-top: 1.7rem; - } - h5 { - font-size: 1.25rem; - } - } - @media (max-width: 830px) { - padding: 2rem; - h4 { - font-size: 1.15rem; - } - h5 { - font-size: 1.2rem; - } - } - } - } - - // Large devices (desktops, 992px and up) - @media (min-width: 992px) { - padding: 3rem 3rem; - .grid { - display: grid; - grid-template-columns: auto auto auto; - grid-template-rows: auto auto; - gap: 2rem; - margin-bottom: 0rem; - } - @media (max-height: 820px) { - padding: 1rem 3rem; - } - @media (max-height: 680px) { - padding: 2rem 3rem; - .grid { - gap: 1.5rem; - } - } - - .card { - @media (max-width: 1340px) { - h4 { - font-size: 1.2rem; - } - h5 { - font-size: 1.25rem; - } - } - @media (max-width: 1310px) { - h4 { - font-size: 1.1rem; - } - h5 { - font-size: 1.23rem; - } - } - @media (max-width: 1250px) { - padding: 2.2rem; - h4 { - font-size: 1rem; - } - h5 { - font-size: 1.2rem; - } - } - @media (max-width: 1180px) { - padding: 1.8rem; - } - @media (max-width: 1110px) { - padding: 1.6rem; - h4 { - font-size: 0.9rem; - } - h5 { - font-size: 1.1rem; - } - } - } - } - - .card { - height: 14rem; - @media (max-height: 870px) { - height: 13rem; - } - - svg { - height: 16.25rem; - } - - svg.stake { - filter: drop-shadow(0px 0px 5px rgba(191, 245, 225, 0.7)); - } - - svg.h24 { - filter: drop-shadow(0px 0px 5px rgba(6, 180, 255, 0.53)); - } - - svg.tcap { - width: 3rem; - } - - svg.weth { - filter: drop-shadow(0px 0px 5px rgba(111, 19, 202, 0.53)); - } - - svg.wbtc { - filter: drop-shadow(0px 0px 5px rgba(249, 252, 73, 0.42)); - } - - svg.dai { - filter: drop-shadow(0px 0px 5px rgba(242, 128, 64, 0.42)); - } - - svg.ctx { - width: 3rem; - } - } -} From 8fb16dd4e316eb691982b05bc4078bbe6af0f5ad Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sun, 29 Jan 2023 17:57:12 -0600 Subject: [PATCH 228/278] finished farm mobile support --- .../Farm/LiquidityRewards/index.tsx | 2 +- src/components/Farm/UniV3Rewards/Rewards.tsx | 10 ++++---- src/components/Farm/index.tsx | 2 +- .../Vaults/monitoring/VaultsMobile.tsx | 18 +++------------ src/components/Vaults/monitoring/index.tsx | 2 +- src/styles/app.scss | 4 ++-- src/styles/farm.scss | 23 ++++++++++++------- src/styles/vault-monitoring.scss | 22 ++++++++++-------- src/styles/vault.scss | 5 +--- src/utils/univ3.tsx | 7 ++++++ 10 files changed, 48 insertions(+), 47 deletions(-) diff --git a/src/components/Farm/LiquidityRewards/index.tsx b/src/components/Farm/LiquidityRewards/index.tsx index 8406388..9679de3 100644 --- a/src/components/Farm/LiquidityRewards/index.tsx +++ b/src/components/Farm/LiquidityRewards/index.tsx @@ -21,7 +21,7 @@ const ctxClaimVestShowDate = new Date(1634511235 * 1000); const LiquidityRewards = () => { const { t } = useTranslation(); - const isMobile = useMediaQuery({ query: "(max-width: 450px)" }); + const isMobile = useMediaQuery({ query: "(max-width: 600px)" }); const signer = useContext(signerContext); const tokens = useContext(tokensContext); const oracles = useContext(oraclesContext); diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index ced1684..ddf9db1 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -11,7 +11,7 @@ import { BigNumber, ethers } from "ethers"; import NumberFormat from "react-number-format"; import { Contract } from "ethers-multicall"; import { useQuery, gql } from "@apollo/client"; -import { FaArrowsAltH } from "react-icons/fa"; +import { FaArrowsAltH, FaExternalLinkAlt } from "react-icons/fa"; import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; import { ReactComponent as CtxIcon } from "../../../assets/images/ctx-coin.svg"; import { ReactComponent as WETHIcon } from "../../../assets/images/graph/weth.svg"; @@ -59,7 +59,7 @@ const Rewards = ({ const tokens = useContext(tokensContext); const currentNetwork = useContext(networkContext); const disableActions = isOptimism(currentNetwork.chainId); - const isMobile = useMediaQuery({ query: "(max-width: 450px)" }); + const isMobile = useMediaQuery({ query: "(max-width: 600px)" }); const [ethTcapIncentive, setEthTcapIncentive] = useState>([]); const [ethTcapPositions, setEthTcapPositions] = useState>([]); const [cumulativePrice, setCumulativePrice] = useState(0); @@ -588,15 +588,15 @@ const Rewards = ({
TCAP/WETH Position + + Uniswap +
diff --git a/src/components/Farm/index.tsx b/src/components/Farm/index.tsx index 29a4cd2..4ef81bf 100644 --- a/src/components/Farm/index.tsx +++ b/src/components/Farm/index.tsx @@ -10,7 +10,7 @@ import { NETWORKS } from "../../utils/constants"; const Farm = () => { const { t } = useTranslation(); - const isMobile = useMediaQuery({ query: "(max-width: 450px)" }); + const isMobile = useMediaQuery({ query: "(max-width: 600px)" }); const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); diff --git a/src/components/Vaults/monitoring/VaultsMobile.tsx b/src/components/Vaults/monitoring/VaultsMobile.tsx index b3665c4..54e4945 100644 --- a/src/components/Vaults/monitoring/VaultsMobile.tsx +++ b/src/components/Vaults/monitoring/VaultsMobile.tsx @@ -7,7 +7,7 @@ import Liquidate from "./Liquidate"; import { capitalize, TokenIcon, VAULT_STATUS } from "../common"; import { VaultsPropsType, VaultsType } from "../types"; import { TOKENS_SYMBOLS } from "../../../utils/constants"; -import { isArbitrum, isInLayer1 } from "../../../utils/utils"; +import { isArbitrum } from "../../../utils/utils"; export const VaultsMobile = ({ currentAddress, @@ -40,6 +40,7 @@ export const VaultsMobile = ({ isHardVault: v.isHardVault, }; const vStatus = v.status === VAULT_STATUS.liquidation ? "active" : v.status; + console.log(setVaults); return ( + {" CREATE "} your first vault.

diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index 96fce62..df5bc37 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -74,7 +74,7 @@ const showAllVaults = true; const Monitoring = ({ setVaultToUpdate }: props) => { const { t } = useTranslation(); - const isMobile = useMediaQuery({ query: "(max-width: 450px)" }); + const isMobile = useMediaQuery({ query: "(max-width: 600px)" }); const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); const vaults = useContext(vaultsContext); diff --git a/src/styles/app.scss b/src/styles/app.scss index 0a7724e..d75473a 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -39,7 +39,7 @@ h6, p { } body { - background-color: $primary; + background-color: $background; } .avatar { @@ -403,7 +403,7 @@ textarea.neon-green:focus { overflow: overlay; } .wrapper::before { - background-color: black; + background-color: $background; opacity: 0.3; position: absolute; z-index: -1; diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 2a6c496..679a0f9 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -684,7 +684,7 @@ } } - @media (max-width: 450px) { + @media (max-width: 600px) { margin-top: 2rem; padding: 1rem; @@ -825,31 +825,38 @@ display: flex; align-items: center; } - &-link { - margin-left: 0.5rem; + + .title { + display: flex; + align-items: center; } .description { display: flex; flex-direction: row; margin-bottom: 1rem; + svg { + color: $highlight; + } + .title { + flex-direction: column; + align-items: flex-start; + justify-content: center; + } } .icons { display: flex; flex-direction: row; align-items: center; margin-right: 1rem; + svg { margin-top: 0rem; } + .weth { margin-right: 0.5rem; } } - .title { - display: flex; - align-items: center; - } - .ranges { align-items: center; padding: 0.5rem; diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 604b17c..4107aef 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -461,7 +461,7 @@ span { } } - @media (min-width: 451px) { + @media (min-width: 601px) { .accordion { &-button:after { display: none; @@ -469,7 +469,9 @@ span { } } - @media (max-width: 450px) { + + + @media (max-width: 600px) { margin-top: 1rem; margin-left: 0rem; padding: 1rem; @@ -500,14 +502,7 @@ span { } } } - .no-vaults-box { - padding: 2rem; - border: 1px solid $neon-highlight; - border-radius: 5px; - .btn-create-vault { - padding-left: 0rem; - } - } + .btn-create-vault { background-color: $highlight; margin-top: 3rem; @@ -684,5 +679,12 @@ span { } } */ } + + .no-vaults-box { + padding: 2rem; + border: 1px solid $neon-highlight; + border-radius: 5px; + margin-top: 1.8rem; + } } } \ No newline at end of file diff --git a/src/styles/vault.scss b/src/styles/vault.scss index 9281759..b267f9d 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -1,10 +1,7 @@ @import "./colors"; @import "./fonts"; -.wrapper::before { - background-image: none; - background-color: black; -} + .vault { display: flex; diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx index eb32f6c..f3d3fb1 100644 --- a/src/utils/univ3.tsx +++ b/src/utils/univ3.tsx @@ -8,6 +8,13 @@ export const UNIV3 = { id: "0x11456b3750E991383bB8943118ed79C1afdEE192", feeTier: 3000, incentives: [ + { + rewardToken: "0x321C2fE4446C7c963dc41Dd58879AF648838f98D", + pool: "0x11456b3750E991383bB8943118ed79C1afdEE192", + startTime: 1668805867, + endTime: 1676754667, + refundee: "0xa70b638B70154EdfCbb8DbbBd04900F328F32c35", + }, { rewardToken: "0x321C2fE4446C7c963dc41Dd58879AF648838f98D", pool: "0x11456b3750E991383bB8943118ed79C1afdEE192", From da7d872c8d2daa4235c0e62b195134c8b782591d Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 2 Feb 2023 18:27:23 -0600 Subject: [PATCH 229/278] added api endpoints --- package.json | 1 + src/api/constants.tsx | 9 ++++ src/api/index.tsx | 3 ++ src/api/oauth.tsx | 37 +++++++++++++ src/components/Governance/Delegators.tsx | 4 +- src/components/Governance/KeeperForm.tsx | 66 +++++++++++++---------- src/components/Governance/ProfileCard.tsx | 5 +- yarn.lock | 2 +- 8 files changed, 95 insertions(+), 32 deletions(-) create mode 100644 src/api/constants.tsx create mode 100644 src/api/index.tsx create mode 100644 src/api/oauth.tsx diff --git a/package.json b/package.json index 6730a34..bbe86ad 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "keccak256": "^1.0.6", "merkletreejs": "^0.2.32", "node-sass": "^4.14.1", + "qs": "^6.11.0", "react": "^18.0.0", "react-bootstrap": "^2.5.0", "react-dom": "^18.0.0", diff --git a/src/api/constants.tsx b/src/api/constants.tsx new file mode 100644 index 0000000..31d1bed --- /dev/null +++ b/src/api/constants.tsx @@ -0,0 +1,9 @@ +export const API_ENDPOINT = process.env.REACT_APP_API_URL || "https://api.cryptex.finance"; + +export const OAUTH_TOKEN_ENDPOINT = API_ENDPOINT.concat("o/token/"); + +export const KEEPER_ALL_ENDPOINT = API_ENDPOINT.concat("cryptkeeper/all/"); + +export const KEEPER_CREATE_ENDPOINT = API_ENDPOINT.concat("cryptkeeper/create/"); + +export const KEEPER_UPDATE_ENDPOINT = API_ENDPOINT.concat("cryptkeeper/update/"); diff --git a/src/api/index.tsx b/src/api/index.tsx new file mode 100644 index 0000000..191d8b7 --- /dev/null +++ b/src/api/index.tsx @@ -0,0 +1,3 @@ +export * from "./constants"; + +export * from "./oauth"; diff --git a/src/api/oauth.tsx b/src/api/oauth.tsx new file mode 100644 index 0000000..df1e3db --- /dev/null +++ b/src/api/oauth.tsx @@ -0,0 +1,37 @@ +import { OAUTH_TOKEN_ENDPOINT } from "./constants"; + +const qs = require("qs"); + +const OAUTH_HEADER = { + Accept: "application/json", + "Content-Type": "application/x-www-form-urlencoded;", +}; + +export const getAccessToken = async () => { + let returnData = { success: false, accessToken: "" }; + const params = qs.stringify({ + grant_type: "client_credentials", + client_id: process.env.REACT_APP_API_CLIENT_ID, + client_secret: process.env.REACT_APP_API_CLIENT_SECRET, + }); + + await fetch(OAUTH_TOKEN_ENDPOINT, { + method: "POST", + headers: OAUTH_HEADER, + body: params, + }) + .then((response) => response.json()) + .then((responseJson) => { + if (!responseJson.error) { + returnData = { + success: true, + accessToken: responseJson.access_token, + }; + } + }) + .catch((error) => { + console.error(error); + }); + + return returnData; +}; diff --git a/src/components/Governance/Delegators.tsx b/src/components/Governance/Delegators.tsx index e31c17d..ea410d7 100644 --- a/src/components/Governance/Delegators.tsx +++ b/src/components/Governance/Delegators.tsx @@ -9,7 +9,7 @@ import Delegate from "./Delegate"; import Withdraw from "./Withdraw"; import StakerStats from "./StakerStats"; import { governanceContext, networkContext, signerContext } from "../../state"; -import { API_ENDPOINT } from "../../utils/constants"; +import { KEEPER_ALL_ENDPOINT } from "../../api"; import { isInLayer1 } from "../../utils/utils"; type props = { @@ -130,7 +130,7 @@ const Delegators = ({ currentSignerAddress }: props) => { useEffect(() => { const loadData = async () => { const loadKeepersFromDB = async (currentDelegators: any) => { - await fetch(`${API_ENDPOINT}/cryptkeeper/all`, { + await fetch(KEEPER_ALL_ENDPOINT, { method: "GET", }) .then((response) => response.json()) diff --git a/src/components/Governance/KeeperForm.tsx b/src/components/Governance/KeeperForm.tsx index 5d498a0..1ea42f3 100644 --- a/src/components/Governance/KeeperForm.tsx +++ b/src/components/Governance/KeeperForm.tsx @@ -6,7 +6,12 @@ import { ethers } from "ethers"; import Modal from "react-bootstrap/esm/Modal"; import { ProfileImage } from "./common"; import "../../styles/modal.scss"; -import { API_ENDPOINT } from "../../utils/constants"; +import { + API_ENDPOINT, + KEEPER_CREATE_ENDPOINT, + KEEPER_UPDATE_ENDPOINT, + getAccessToken, +} from "../../api"; import { errorNotification, getAddressFromENS, @@ -76,7 +81,7 @@ const KeeperForm = ({ setDiscord(keeperInfo.discord); setExpertise(keeperInfo.expertise); setWhy(keeperInfo.why); - setImageUrl(`${API_ENDPOINT}/${keeperInfo.image}`); + setImageUrl(`${API_ENDPOINT}${keeperInfo.image}`); } else { setDelegatee(""); setAddress(""); @@ -290,7 +295,7 @@ const KeeperForm = ({ formData.append("twitter", twitter); // @ts-ignore formData.append("file", image); - await fetch(`${API_ENDPOINT}/cryptkeeper/create`, { + await fetch(KEEPER_CREATE_ENDPOINT, { method: "POST", body: formData, }) @@ -342,31 +347,38 @@ const KeeperForm = ({ formData.append("twitter", twitter); // @ts-ignore formData.append("file", image); - - await fetch(`${API_ENDPOINT}/cryptkeeper/update`, { - method: "POST", - body: formData, - }) - .then((response) => response.json()) - .then((responseJson) => { - if (responseJson.status === "success") { - refresh(); - sendNotification( - t("governance.success.title"), - t("governance.success.message"), - 3000, - onHide(), - 1000, - "success" - ); - } else { - console.log(responseJson.errors); - } + const accessTokenResp = await getAccessToken(); + if (accessTokenResp.success) { + await fetch(KEEPER_UPDATE_ENDPOINT, { + method: "POST", + headers: { + Authorization: "Bearer ".concat(accessTokenResp.accessToken), + }, + body: formData, }) - .catch((error) => { - errorNotification(t("errors.unexpected")); - console.error(error); - }); + .then((response) => response.json()) + .then((responseJson) => { + if (responseJson.status === "success") { + refresh(); + sendNotification( + t("governance.success.title"), + t("governance.success.message"), + 3000, + onHide(), + 1000, + "success" + ); + } else { + console.log(responseJson.errors); + } + }) + .catch((error) => { + errorNotification(t("errors.unexpected")); + console.error(error); + }); + } else { + errorNotification("Couldn't retrieve API access token."); + } } setSaving(false); }; diff --git a/src/components/Governance/ProfileCard.tsx b/src/components/Governance/ProfileCard.tsx index c034214..a8113b2 100644 --- a/src/components/Governance/ProfileCard.tsx +++ b/src/components/Governance/ProfileCard.tsx @@ -16,7 +16,8 @@ import { governanceContext, signerContext } from "../../state"; import { VoteBadge, ProfileImage } from "./common"; import { ReactComponent as CtxIcon } from "../../assets/images/ctx-coin.svg"; import { infoType } from "./data"; -import { API_ENDPOINT, FEATURES } from "../../utils/constants"; +import { API_ENDPOINT } from "../../api/constants"; +import { FEATURES } from "../../utils/constants"; type props = { delegator: { @@ -164,7 +165,7 @@ const ProfileCard = ({ diff --git a/yarn.lock b/yarn.lock index e2088d1..3806c3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12851,7 +12851,7 @@ qrcode@1.4.4: pngjs "^3.3.0" yargs "^13.2.4" -qs@6.11.0: +qs@6.11.0, qs@^6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== From fcf18dee74ce370930c2d32cd4b9d3010dd09f5a Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 3 Feb 2023 14:05:19 -0600 Subject: [PATCH 230/278] show vaults usd balances --- src/components/Governance/Delegate.tsx | 2 +- src/components/Governance/Withdraw.tsx | 2 +- src/components/Vaults/index.tsx | 2 +- src/components/Vaults/vault/index.tsx | 90 ++++++++++++++------------ src/components/modals/Delegate.tsx | 2 +- src/styles/_colors.scss | 1 + src/styles/app.scss | 30 +++++++-- src/styles/farm.scss | 3 +- src/styles/modal.scss | 13 +++- src/styles/vault-monitoring.scss | 4 +- src/styles/vault.scss | 45 +++++++++++-- 11 files changed, 133 insertions(+), 61 deletions(-) diff --git a/src/components/Governance/Delegate.tsx b/src/components/Governance/Delegate.tsx index c048311..9bf23b4 100644 --- a/src/components/Governance/Delegate.tsx +++ b/src/components/Governance/Delegate.tsx @@ -135,7 +135,7 @@ const Delegate = ({ {isApproved ? ( <> -

{t("governance.stake-info")}

+

{t("governance.stake-info")}

{t("governance.amount-stake")} diff --git a/src/components/Governance/Withdraw.tsx b/src/components/Governance/Withdraw.tsx index 87c7fa0..ec7222f 100644 --- a/src/components/Governance/Withdraw.tsx +++ b/src/components/Governance/Withdraw.tsx @@ -88,7 +88,7 @@ const Withdraw = ({
-

{t("governance.withdraw-info")}

+

{t("governance.withdraw-info")}

{t("governance.amount-remove")}
diff --git a/src/components/Vaults/index.tsx b/src/components/Vaults/index.tsx index b116fa5..ecc4f08 100644 --- a/src/components/Vaults/index.tsx +++ b/src/components/Vaults/index.tsx @@ -1,6 +1,6 @@ import React, { useContext, useEffect, useState } from "react"; import Monitoring from "./monitoring"; -import Vault from "./vault"; +import Vault from "./vault/index"; import { signerContext } from "../../state"; import { VaultToUpdateType } from "./types"; diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 053d2ee..707973e 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -1099,7 +1099,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const RenderIndexBalance = (isCollateral: boolean) => { const aBalance = isCollateral ? collateralBalance : indexBalance; const aBalanceUSD = isCollateral ? collateralBalanceUSD : indexBalanceUSD; - + const iconSymbol = isCollateral ? vaultData.collateralSymbol : vaultData.assetSymbol; return (
Wallet Balance: @@ -1107,24 +1107,26 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { {isLoading ? ( ) : ( - - ${parseFloat(aBalanceUSD).toFixed(2)} - - } - > + <> +
+ + +
-
+ )}
@@ -1138,24 +1140,26 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { {isLoading ? ( ) : ( - - ${parseFloat(vaultCollateralUSD).toFixed(2)} - - } - > + <> +
+ + +
-
+ )}
@@ -1168,24 +1172,26 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { {isLoading ? ( ) : ( - - ${parseFloat(vaultDebtUSD).toFixed(2)} - - } - > + <> +
+ + +
-
+ )}
@@ -1429,11 +1435,11 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { displayType="text" thousandSeparator decimalScale={tokenBalanceDecimals} - suffix="% -" + suffix="%" />
- - + -

{vaultStatus.toLocaleUpperCase()} diff --git a/src/components/modals/Delegate.tsx b/src/components/modals/Delegate.tsx index f38781f..fd00a0e 100644 --- a/src/components/modals/Delegate.tsx +++ b/src/components/modals/Delegate.tsx @@ -55,7 +55,7 @@ export const Delegate = ({ show, onHide, refresh }: props) => { Delegate CTX -

Delegate your CTX tokens to an Adress so it can vote for you.

+

Delegate your CTX tokens to an Adress so it can vote for you.

Address diff --git a/src/styles/_colors.scss b/src/styles/_colors.scss index 40a12c1..49a3bd9 100644 --- a/src/styles/_colors.scss +++ b/src/styles/_colors.scss @@ -14,5 +14,6 @@ $orange: #f28040; $blue: #0fd9ff; $dark-blue: #2620fb; $green: #38d6b2; +$bright-green: #4dd70c; $yellow: rgb(252, 223, 73); $background: #141429; diff --git a/src/styles/app.scss b/src/styles/app.scss index 9921b51..14f35c0 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -127,6 +127,10 @@ body { background-color: $pink; } +.btn-success { + border-color: $bright-green; +} + .input-group .btn.neon-orange { border: 1px solid $orange; box-sizing: border-box; @@ -140,18 +144,36 @@ body { } .btn.neon-green { - border: 1px solid $green; + border: 1px solid $bright-green; border-radius: 2px; box-sizing: border-box; box-shadow: 0px 0px 4px rgba(63, 217, 180, 0.3), 0px 4px 14px rgba(112, 235, 183, 0.2); } +/* .btn.neon-green { + border: 1px solid $green; + border-radius: 2px; + box-sizing: border-box; + box-shadow: 0px 0px 4px rgba(63, 217, 180, 0.3), 0px 4px 14px rgba(112, 235, 183, 0.2); +} */ + .btn.neon-pink { border: 1px solid $pink; box-sizing: border-box; box-shadow: 0px 6px 39px -6px rgba(241, 36, 255, 0.4); } +.btn.neon-brightgreen { + border: 1.5px solid $bright-green; + box-sizing: border-box; + box-shadow: 0px 6px 39px -6px #4cd70c77; +} + +.btn.neon-brightgreen { + background-color: $bright-green; +} + + .dropdown { border-radius: 5px; .dropdown-toggle { @@ -236,7 +258,7 @@ body { } .number.neon-green { - text-shadow: 0px 4px 13px $green; + text-shadow: 0px 4px 13px $bright-green; } .number.neon-yellow, @@ -306,8 +328,8 @@ input[type="file"] { input[type="text"].neon-green:focus, input[type="number"].neon-green:focus { - border-color: $green !important; - box-shadow: -1px 0px 15px -6px $green; + border-color: $bright-green !important; + box-shadow: -1px 0px 15px -6px $bright-green; background: no-repeat; color: $white; } diff --git a/src/styles/farm.scss b/src/styles/farm.scss index 679a0f9..dac1181 100644 --- a/src/styles/farm.scss +++ b/src/styles/farm.scss @@ -356,8 +356,7 @@ } .btn.position-url { border-width: 1px; - border-color: $green; - word-wrap: wrap; + border-color: $bright-green; } .number { font-size: 1rem; diff --git a/src/styles/modal.scss b/src/styles/modal.scss index ef22e3f..d83804f 100644 --- a/src/styles/modal.scss +++ b/src/styles/modal.scss @@ -62,6 +62,7 @@ color: $white; opacity: 1; } + ul { list-style-type: none; padding: 0; @@ -69,6 +70,11 @@ color: $light; } } + + .delegate-description { + margin-bottom: 3rem; + } + form { // padding: 2rem 2rem 0rem 2rem; margin-top: 1rem; @@ -80,7 +86,7 @@ &.max { float: right; a { - color: $green; + color: $bright-green; &.orange { color: $orange; @@ -133,7 +139,7 @@ } input[type="text"].neon-green { - border-color: $green !important; + border-color: $bright-green !important; border-radius: 1px; background: no-repeat; border-color: $dark; @@ -150,6 +156,7 @@ height: 87%; width: 80%; } + input[type="file"] { background-color: transparent; border: none; @@ -171,7 +178,7 @@ } textarea.neon-green { - border-color: $green; + border-color: $bright-green; border-radius: 1px; background: no-repeat; color: $white; diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index 4107aef..d7fbe5d 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -15,7 +15,7 @@ span { text-shadow: 0 0 4px #7940f2, 0 0 10px #fcdf49, 0 0 20px #f28040, 0 -10px 40px #c33; } .ready { - text-shadow: 0 0 4px #167226, 0 0 10px #167226, 0 0 20px #167226, 0 -10px 40px #167226; + text-shadow: 0 0 4px $bright-green, 0 0 10px $bright-green, 0 0 20px $bright-green, 0 -10px 40px #4cd70cc7; } .active { text-shadow: 0 0 4px #b626c4, 0 0 10px #e440f2, 0 0 20px #e440f2, 0 -10px 40px #b626c4; @@ -339,7 +339,7 @@ span { filter: brightness(1118%) drop-shadow(0px 0px 5px #f28040); } &.ready { - filter: brightness(1118%) drop-shadow(0px 0px 5px #167226); + filter: brightness(1118%) drop-shadow(0px 0px 5px $bright-green); } &.active { filter: brightness(1118%) drop-shadow(0px 0px 5px #e440f2); diff --git a/src/styles/vault.scss b/src/styles/vault.scss index 75ccc2a..af421c6 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -221,11 +221,11 @@ .btn-max { display: flex; padding: 0.4rem 0.8rem; - border: 1px solid $green; + border: 1px solid $bright-green; border-radius: 5px; background-color: $darkest; font-size: 0.9rem; - color: $green; + color: $bright-green; &.orange { border: 1px solid $orange; @@ -440,16 +440,19 @@ justify-content: space-between; padding: 0rem 1rem; } + .asset-box { width: 100%; &.right { align-items: flex-end; } } + .vault-form { margin-top: 3.5rem; padding: 0rem 1rem; } + .assets-balance { display: flex; flex-direction: row; @@ -516,19 +519,50 @@ .asset-box-balance { display: flex; justify-content: space-between; + align-items: center; width: 94%; - padding: 0.2rem 0.2rem; + border: 0.5px solid $dark; + border-radius: 5px; + margin-bottom: 0.7rem; &-title { + padding: 0.5rem; + width: 50%; color: $lighter; font-size: 0.8rem; margin-right: 0.5rem; + // background-color: $darkest; + // border-top-left-radius: 5px; + // border-bottom-left-radius: 5px; + } + + .token-value { + display: flex; + flex-direction: row; + align-items: center; + margin-bottom: 0.2rem; + svg { + width: 17px; + height: 17px; + margin-right: 5px; + } + } &-value { + display: flex; + flex-direction: column; + align-items: flex-end; + justify-content: space-around; + padding: 0.2rem 0.5rem; + width: 50%; font-size: 0.75rem; color: $white; - text-shadow: 0px 4px 13px rgba(223, 33, 254, 0.8); + text-shadow: 0px 4px 13px rgba(225, 33, 254, 0.661); + } + + .usd-balance { + font-size: 0.6rem; } &-value:hover { @@ -568,6 +602,9 @@ font-size: 0.95rem; margin-bottom: 0rem; } + .separator { + margin: 0rem 0.5rem; + } .ratio-status { font-size: 0.95rem; } From e45fb90ee0f2175631515ccec89729ff0a3c7435 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 3 Feb 2023 15:12:22 -0600 Subject: [PATCH 231/278] jpegz icon fixed --- src/styles/vault.scss | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/styles/vault.scss b/src/styles/vault.scss index af421c6..7658c02 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -531,9 +531,6 @@ color: $lighter; font-size: 0.8rem; margin-right: 0.5rem; - // background-color: $darkest; - // border-top-left-radius: 5px; - // border-bottom-left-radius: 5px; } .token-value { @@ -541,7 +538,7 @@ flex-direction: row; align-items: center; margin-bottom: 0.2rem; - svg { + svg, .jpegz { width: 17px; height: 17px; margin-right: 5px; From 0bed28fe519cde84455e97e4d23051450618c68a Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sat, 4 Feb 2023 12:13:06 -0600 Subject: [PATCH 232/278] increaded image max size --- src/components/Governance/KeeperForm.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/Governance/KeeperForm.tsx b/src/components/Governance/KeeperForm.tsx index 1ea42f3..dba958a 100644 --- a/src/components/Governance/KeeperForm.tsx +++ b/src/components/Governance/KeeperForm.tsx @@ -223,8 +223,9 @@ const KeeperForm = ({ setImageError(t("errors.invalid-file-type")); return false; } - if (value.size > 180000) { - setImageError(t("errors.invalid-image-size", { size: Math.round(value.size / 1000) })); + const maxSize = 250000; + if (value.size > maxSize) { + setImageError(t("errors.invalid-image-size", { size: Math.round(maxSize / 1000) })); setImageUrl(""); return false; } From eee2718512d6346d715fb130a349c6238da6e3c3 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sun, 5 Feb 2023 22:19:27 -0600 Subject: [PATCH 233/278] fixing design on mobile --- public/locales/en/translation.json | 10 +- .../Farm/LiquidityRewards/index.tsx | 16 +- src/components/Farm/UniV3Rewards/Rewards.tsx | 2 +- src/components/Farm/index.tsx | 2 +- .../Vaults/monitoring/Liquidate.tsx | 101 ++- src/components/Vaults/monitoring/Vaults.tsx | 9 +- src/components/Vaults/monitoring/index.tsx | 2 +- src/styles/app.scss | 15 + src/styles/farm.scss | 36 +- src/styles/mint.scss | 819 ------------------ src/styles/mintindex.scss | 546 ------------ src/styles/modal.scss | 41 + src/styles/summary.scss | 5 +- src/styles/vault-monitoring.scss | 97 ++- src/styles/vault.scss | 9 +- 15 files changed, 271 insertions(+), 1439 deletions(-) delete mode 100644 src/styles/mint.scss delete mode 100644 src/styles/mintindex.scss diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index b32903a..bfa4a76 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -40,7 +40,7 @@ "status": "Status", "ready": "Ready", "remove": "Remove", - "required-tcap": "Required TCAP", + "required-tcap": "Required {{indexName}} ", "token": "Token", "tokens": "Tokens", "totals": "Totals", @@ -160,19 +160,19 @@ } }, "monitoring": { - "active-info": "Vault is minting TCAP.", + "active-info": "Vault is minting {{indexName}}.", "empty-info": "There is not collateral on the vault.", "liquidation-info": "Ratio is less than min required.", "liquidate-vault": "Liquidate Vault", "liquidating": "Liquidating", "ratio": "Ratio", - "ready-info": "Vault has collateral and it is ready to mint TCAP.", + "ready-info": "Vault has collateral and it is ready to mint {{indexName}}.", "reward": "Reward", "reward-info": "Collateral amount in USD you are getting for liquidating the vault.", - "tcap-amount-info": "Amount of TCAP in USD you need to provide to liquidate vault.", + "tcap-amount-info": "Amount of {{indexName}} in USD you need to provide to liquidate vault.", "net-reward": "Net Reward", "net-reward-info1": "Actual profit in USD you earn after liquidation", - "net-reward-info2": "Net Reward = Reward - TCAP Amount - Burn Fee." + "net-reward-info2": "Net Reward = Reward - {{indexName}} Amount - Burn Fee." }, "governance": { "amount-stake": "Amount to Stake", diff --git a/src/components/Farm/LiquidityRewards/index.tsx b/src/components/Farm/LiquidityRewards/index.tsx index 9679de3..bdec7e4 100644 --- a/src/components/Farm/LiquidityRewards/index.tsx +++ b/src/components/Farm/LiquidityRewards/index.tsx @@ -21,7 +21,7 @@ const ctxClaimVestShowDate = new Date(1634511235 * 1000); const LiquidityRewards = () => { const { t } = useTranslation(); - const isMobile = useMediaQuery({ query: "(max-width: 600px)" }); + const isMobile = useMediaQuery({ query: "(max-width: 850px)" }); const signer = useContext(signerContext); const tokens = useContext(tokensContext); const oracles = useContext(oraclesContext); @@ -224,11 +224,7 @@ const LiquidityRewards = () => { loadAddress(); // eslint-disable-next-line - }, [updateData]); - - if (isLoading) { - return ; - } + }, [updateData]); const showCtxClaimVest = (): boolean => { const today = new Date(); @@ -624,6 +620,14 @@ const LiquidityRewards = () => {
); + if (isLoading) { + return ( + + + + ); + } + return (

diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index ddf9db1..6e5a664 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -59,7 +59,7 @@ const Rewards = ({ const tokens = useContext(tokensContext); const currentNetwork = useContext(networkContext); const disableActions = isOptimism(currentNetwork.chainId); - const isMobile = useMediaQuery({ query: "(max-width: 600px)" }); + const isMobile = useMediaQuery({ query: "(max-width: 850px)" }); const [ethTcapIncentive, setEthTcapIncentive] = useState>([]); const [ethTcapPositions, setEthTcapPositions] = useState>([]); const [cumulativePrice, setCumulativePrice] = useState(0); diff --git a/src/components/Farm/index.tsx b/src/components/Farm/index.tsx index 4ef81bf..370fcd6 100644 --- a/src/components/Farm/index.tsx +++ b/src/components/Farm/index.tsx @@ -10,7 +10,7 @@ import { NETWORKS } from "../../utils/constants"; const Farm = () => { const { t } = useTranslation(); - const isMobile = useMediaQuery({ query: "(max-width: 600px)" }); + const isMobile = useMediaQuery({ query: "(max-width: 850px)" }); const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); diff --git a/src/components/Vaults/monitoring/Liquidate.tsx b/src/components/Vaults/monitoring/Liquidate.tsx index 2649756..d595a53 100644 --- a/src/components/Vaults/monitoring/Liquidate.tsx +++ b/src/components/Vaults/monitoring/Liquidate.tsx @@ -7,6 +7,7 @@ import Modal from "react-bootstrap/esm/Modal"; import NumberFormat from "react-number-format"; import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; import Tooltip from "react-bootstrap/esm/Tooltip"; +import { useMediaQuery } from "react-responsive"; import { useTranslation } from "react-i18next"; import "../../../styles/modal.scss"; import { networkContext, oraclesContext, signerContext } from "../../../state"; @@ -15,6 +16,7 @@ import { useVault } from "../../../hooks"; import { TOKENS_SYMBOLS } from "../../../utils/constants"; import { errorNotification, + isArbitrum, isPolygon, notifyUser, numberFormatStr, @@ -31,9 +33,11 @@ type props = { const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) => { const { t } = useTranslation(); + const isMobile = useMediaQuery({ query: "(max-width: 850px)" }); const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); const oracles = useContext(oraclesContext); + const indexName = isArbitrum(currentNetwork.chainId) ? TOKENS_SYMBOLS.JPEGz : TOKENS_SYMBOLS.TCAP; const [ { currentVault, @@ -43,7 +47,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = currentAssetOracleRead, }, ] = useVault( - "TCAP", + indexName, liqVault ? liqVault?.collateralSymbol : TOKENS_SYMBOLS.WETH, liqVault ? liqVault.isHardVault : true ); @@ -189,8 +193,8 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = const getTokeSymbol = () => { if (liqVault !== null) { - if (liqVault.collateralSymbol === "WETH") { - return "ETH"; + if (liqVault.collateralSymbol === TOKENS_SYMBOLS.WETH) { + return TOKENS_SYMBOLS.ETH; } return liqVault.collateralSymbol; } @@ -205,7 +209,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = const tcapAmountHelp = () => ( - <>{t("monitoring.tcap-amount-info")} + <>{t("monitoring.tcap-amount-info", { indexName })} ); @@ -213,12 +217,13 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = <> {t("monitoring.net-reward-info1")}:
- {t("monitoring.net-reward-info2")} + {t("monitoring.net-reward-info2", { indexName })}
); const helpToolTip = (column: number) => { + const className = isMobile ? "question-small" : ""; let help = rewardHelp(); if (column === 1) { help = tcapAmountHelp(); @@ -227,7 +232,9 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = } return ( - + ); }; @@ -254,9 +261,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = <> - - <>{t("amount-tcap")} - + {isMobile ? "Amount" : <>{t("amount-tcap")}}
MIN REQUIRED @@ -312,29 +317,61 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = - - - - - - - - - - - - - -
- <>{t("monitoring.reward")} - {helpToolTip(0)} - - <>{t("required-tcap")} - {helpToolTip(1)} - Burn Fee - <>{t("monitoring.net-reward")} - {helpToolTip(3)} -
${numberFormatStr(rewardUSD, 2, 2)}${numberFormatStr(maxTcapUSD, 2, 2)}${numberFormatStr(burnFeeUsd, 2, 2)}${numberFormatStr(netReward.toFixed(2), 2, 2)}
+ {!isMobile ? ( + + + + + + + + + + + + + +
+ <>{t("monitoring.reward")} + {helpToolTip(0)} + + <>{t("required-tcap", { indexName })} + {helpToolTip(1)} + Burn Fee + <>{t("monitoring.net-reward", { indexName })} + {helpToolTip(3)} +
${numberFormatStr(rewardUSD, 2, 2)}${numberFormatStr(maxTcapUSD, 2, 2)}${numberFormatStr(burnFeeUsd, 2, 2)}${numberFormatStr(netReward.toFixed(2), 2, 2)}
+ ) : ( +
+
+
+ <>{t("monitoring.reward")} + {helpToolTip(0)} +
+
${numberFormatStr(rewardUSD, 2, 2)}
+
+
+
+ <>{t("required-tcap", { indexName })} + {helpToolTip(1)} +
+
${numberFormatStr(maxTcapUSD, 2, 2)}
+
+
+
Burn Fee
+
${numberFormatStr(burnFeeUsd, 2, 2)}
+
+
+
+ <>{t("monitoring.net-reward")} + {helpToolTip(3)} +
+
+ ${numberFormatStr(netReward.toFixed(2), 2, 2)} +
+
+
+ )}

-
- -
-
{currentIndexName} Market Price
-
- -
+ {!isArbitrum(currentChainId) && ( +
+ +
+
{currentIndexName} Market Price
+
+ +
+
-
+ )}
diff --git a/src/components/Summary/Summary.tsx b/src/components/Summary/Summary.tsx index 914198b..616e5a9 100644 --- a/src/components/Summary/Summary.tsx +++ b/src/components/Summary/Summary.tsx @@ -4,7 +4,7 @@ import { Provider } from "ethers-multicall"; import { Card, Dropdown } from "react-bootstrap/esm"; import "../../styles/summary.scss"; import SummaryOptions from "./SummaryOptions"; -import { NETWORKS } from "../../utils/constants"; +import { NETWORKS, TOKENS_SYMBOLS } from "../../utils/constants"; import { getDefaultProvider, isArbitrum } from "../../utils/utils"; type props = { @@ -13,7 +13,7 @@ type props = { }; const Summary = ({ signerAddress, signerChainId }: props) => { - const indexName = isArbitrum(signerChainId) ? "JPEGz" : "TCAP"; + const indexName = isArbitrum(signerChainId) ? TOKENS_SYMBOLS.JPEGz : TOKENS_SYMBOLS.TCAP; const [options, setOptions] = useState([ { id: "0", name: "My Balance" }, { id: "1", name: indexName.concat(" Summary") }, @@ -59,13 +59,16 @@ const Summary = ({ signerAddress, signerChainId }: props) => { const [currentEthProvider, setCurrentEthProvider] = useState(); useEffect(() => { - setUpdatingChain(true); - const provider = getDefaultProvider(currentChain.id); - const randomSigner = ethers.Wallet.createRandom().connect(provider); - const ethcallProvider = new Provider(randomSigner.provider); - ethcallProvider.init(); - setCurrentEthProvider(ethcallProvider); - setUpdatingChain(false); + const loadProvider = async () => { + setUpdatingChain(true); + const provider = getDefaultProvider(currentChain.id); + const randomSigner = ethers.Wallet.createRandom().connect(provider); + const ethcallProvider = new Provider(randomSigner.provider); + await ethcallProvider.init(); + setCurrentEthProvider(ethcallProvider); + setUpdatingChain(false); + }; + loadProvider(); }, [currentChain.id]); const handleOptionChange = (eventKey: string) => { @@ -80,11 +83,7 @@ const Summary = ({ signerAddress, signerChainId }: props) => { const ops = [...options]; if (c) { - if (!isArbitrum(c.id)) { - ops[1].name = "TCAP Summary"; - } else { - ops[1].name = "JPEGz Summary"; - } + ops[1].name = indexName.concat(" Summary"); } if (currentOption.id === "1") { const cOpt = currentOption; diff --git a/src/components/Topbar.tsx b/src/components/Topbar.tsx index c16d75a..eb70992 100644 --- a/src/components/Topbar.tsx +++ b/src/components/Topbar.tsx @@ -1,10 +1,8 @@ import React, { useState } from "react"; -// import { Button, OverlayTrigger, Tooltip } from "react-bootstrap/esm"; import Nav from "react-bootstrap/esm/Nav"; import { AiOutlineSetting } from "react-icons/ai"; // import Davatar from "@davatar/react"; import "../styles/topbar.scss"; -// import { ReactComponent as LogoutIcon } from "../assets/images/welcome/logout.svg"; import { ReactComponent as Logo } from "../assets/images/logo.svg"; import { ReactComponent as MenuLogo } from "../assets/images/menu.svg"; diff --git a/src/components/Vault/Monitoring/index.tsx b/src/components/Vault/Monitoring/index.tsx deleted file mode 100644 index 308dcec..0000000 --- a/src/components/Vault/Monitoring/index.tsx +++ /dev/null @@ -1,1166 +0,0 @@ -import React, { useContext, useEffect, useRef, useState } from "react"; -import { ethers, BigNumber } from "ethers"; -import Button from "react-bootstrap/esm/Button"; -import ButtonGroup from "react-bootstrap/esm/ButtonGroup"; -import Card from "react-bootstrap/esm/Card"; -import Col from "react-bootstrap/Col"; -import Dropdown from "react-bootstrap/Dropdown"; -import { FaArrowsAltH } from "react-icons/fa"; -import Form from "react-bootstrap/Form"; -import Row from "react-bootstrap/esm/Row"; -import Spinner from "react-bootstrap/Spinner"; -import { useTranslation } from "react-i18next"; -import ToggleButton from "react-bootstrap/esm/ToggleButton"; -import "../../../styles/vault-monitoring.scss"; -import { useQuery, gql } from "@apollo/client"; -import { useLocation } from "react-router-dom"; -import NetworkContext from "../../../state/NetworkContext"; -import OraclesContext from "../../../state/OraclesContext"; -import SignerContext from "../../../state/SignerContext"; -import vaultsContext from "../../../state/VaultsContext"; -import hardVaultsContext from "../../../state/HardVaultsContext"; -import { ReactComponent as TcapIcon } from "../../../assets/images/tcap-coin.svg"; -import { - getRatio2, - isInLayer1, - isOptimism, - isPolygon, - isUndefined, - numberFormatStr, - toUSD, - validOracles, - validVaults, - validHardVaults, -} from "../../../utils/utils"; -import { Vaults } from "./Vaults"; -import { VaultPagination } from "./Pagination"; -import { - DropdownItemType, - OraclePricesType, - PaginationType, - VaultsRatioType, - VaultsType, - VaultsTotalsType, -} from "./types"; -import { capitalize, CollateralIcon, VAULT_STATUS } from "./common"; - -const pagDefault = { - previous: 0, - current: 0, - next: 0, - pages: 0, - lastDataPage: 0, - itemsPerPage: 10, - itemsCount: 0, - lastId: "0", -}; - -const totalsDefault = { - vaults: 0, - collateral: "0", - collateralUSD: "0", - debt: "0", - debtUSD: "0", -}; - -type liqVaultsTempType = { - vaultId: string; - vaultType: string; - decimals: number; - hardVault: boolean; -}; - -const showAllVaults = true; - -export const Monitoring = () => { - const { t } = useTranslation(); - const currentNetwork = useContext(NetworkContext); - const oracles = useContext(OraclesContext); - const vaults = useContext(vaultsContext); - const hardVaults = useContext(hardVaultsContext); - const signer = useContext(SignerContext); - const { state } = useLocation(); - const [skipQuery, setSkipQuery] = useState(false); - const [currentAddress, setCurrentAddress] = useState(""); - const [oraclePrices, setOraclePrices] = useState(); - const [vaultsRatio, setVaultsRatio] = useState(); - const [vaultsTotals, setVaultsTotals] = useState(totalsDefault); - const [vaultList, setVaultList] = useState>([]); - const [vaultGraphList, setVaultGraphList] = useState>([]); - const [pagination, setPagination] = useState(pagDefault); - const [loadMore, setLoadMore] = useState(false); - const [pricesUpdated, setPricesUpdated] = useState(false); - const [filteringRatios, setFilteringRatios] = useState(false); - // @ts-ignore - const [ownerAddress, setOwnerAddress] = useState(state && state.address ? state.address : ""); - // @ts-ignore - const [radioValue, setRadioValue] = useState(state && state.address ? "2" : "1"); - const [tokenSymbol, setTokenSymbol] = useState("all"); - const [currentStatus, setCurrentStatus] = useState("all"); - const [vaultMode, setVaultMode] = useState("all"); - const [currentMinRatio, setCurrentMinRatio] = useState("0%"); - const [currentMaxRatio, setCurrentMaxRatio] = useState("2500%"); - const [renderTable, setRenderTable] = useState(false); - const ratioRangeDropdown = useRef(null); - const minRatioInput = useRef(null); - const maxRatioInput = useRef(null); - const radios = [ - { name: t("all-vaults"), value: "1" }, - { name: t("my-vaults"), value: "2" }, - ]; - const viewsList = [ - { key: "5", name: "5" }, - { key: "10", name: "10" }, - { key: "15", name: "15" }, - { key: "20", name: "20" }, - { key: "25", name: "25" }, - { key: "30", name: "30" }, - ]; - const statusList = [ - { key: "all", name: "All" }, - { key: VAULT_STATUS.empty, name: "Empty" }, - { key: VAULT_STATUS.ready, name: "Ready" }, - { key: VAULT_STATUS.active, name: "Active" }, - { key: VAULT_STATUS.liquidation, name: "Liquidation" }, - ]; - const modeList = [ - { key: "all", name: "All" }, - { key: "regular", name: "Regular" }, - { key: "hard", name: "Hard" }, - ]; - - const buildFilters = () => { - const weiLimit = "100000000"; - let filter = ""; - let ownerFilter = ""; - let vaultFilter = ""; - let statusFilter = ""; - let modeFilter = ""; - if (radioValue === "2" && ownerAddress !== "") { - ownerFilter = `, owner: "${ownerAddress}"`; - } - if (tokenSymbol !== "all") { - vaultFilter = `tokenSymbol: "${tokenSymbol.toUpperCase()}"`; - } - if (currentStatus !== "all") { - if (currentStatus === "empty") { - statusFilter = `collateral_lt: "${weiLimit}"`; - } - if (currentStatus === "ready") { - statusFilter = `collateral_gte: "${weiLimit}", debt_lt: "${weiLimit}"`; - } - } - if (vaultMode !== "all") { - const isHard = vaultMode === "hard" ? "true" : "false"; - modeFilter = "hardVault: ".concat(isHard); - } - - filter = ownerFilter; - if (vaultFilter !== "") { - filter = filter.concat(`, ${vaultFilter}`); - } - if (statusFilter !== "") { - filter = filter.concat(`, ${statusFilter}`); - } - if (modeFilter !== "") { - filter = filter.concat(`, ${modeFilter}`); - } - if (filter !== "") { - if (loadMore) { - filter = `, where: { blockTS_gt: "${pagination.lastId}" ${filter} }`; - } else { - filter = `, where: { blockTS_gt: "0" ${filter} }`; - } - } - return filter; - }; - - const str = - "query allVaults {" + - `vaults(first: 1000, orderBy: blockTS ${buildFilters()}) {` + - "id " + - "vaultId " + - "owner " + - "collateral " + - "debt " + - "currentRatio " + - "tokenSymbol " + - "hardVault " + - "blockTS " + - "underlyingProtocol { " + - "underlyingToken { " + - "decimals " + - "} " + - "}" + - "} " + - "}"; - - const vaultsQuery = gql` - ${str} - `; - - const loadPrices = async () => { - if (signer && oracles && validOracles(currentNetwork.chainId || 1, oracles)) { - if (signer.signer) { - const address = await signer.signer.getAddress(); - setCurrentAddress(address); - } - const tcapPriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); - - const ethcalls = [tcapPriceCall, daiOraclePriceCall]; - if (isInLayer1(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(aaveOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(usdcOraclePriceCall); - ethcalls.push(wbtcOraclePriceCall); - } - if (isOptimism(currentNetwork.chainId)) { - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); - const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(snxOraclePriceCall); - ethcalls.push(uniOraclePriceCall); - } - if (isPolygon(currentNetwork.chainId)) { - const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - ethcalls.push(maticOraclePriceCall); - ethcalls.push(wbtcOraclePriceCall); - } - let tcapOraclePrice = BigNumber.from(0); - let wethOraclePrice = BigNumber.from(0); - let daiOraclePrice = BigNumber.from(0); - let aaveOraclePrice = BigNumber.from(0); - let linkOraclePrice = BigNumber.from(0); - let snxOraclePrice = BigNumber.from(0); - let uniOraclePrice = BigNumber.from(0); - let maticOraclePrice = BigNumber.from(0); - let wbtcOraclePrice = BigNumber.from(0); - let usdcOraclePrice = BigNumber.from(0); - - if (isInLayer1(currentNetwork.chainId)) { - // @ts-ignore - [ - tcapOraclePrice, - daiOraclePrice, - wethOraclePrice, - aaveOraclePrice, - linkOraclePrice, - usdcOraclePrice, - wbtcOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); - } else if (isOptimism(currentNetwork.chainId)) { - // @ts-ignore - [ - tcapOraclePrice, - daiOraclePrice, - wethOraclePrice, - linkOraclePrice, - snxOraclePrice, - uniOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); - } else if (isPolygon(currentNetwork.chainId)) { - // @ts-ignore - [tcapOraclePrice, daiOraclePrice, maticOraclePrice, wbtcOraclePrice] = - await signer.ethcallProvider?.all(ethcalls); - } - - setOraclePrices({ - tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), - wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), - daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), - aaveOraclePrice: ethers.utils.formatEther(aaveOraclePrice.mul(10000000000)), - linkOraclePrice: ethers.utils.formatEther(linkOraclePrice.mul(10000000000)), - uniOraclePrice: ethers.utils.formatEther(uniOraclePrice.mul(10000000000)), - snxOraclePrice: ethers.utils.formatEther(snxOraclePrice.mul(10000000000)), - maticOraclePrice: ethers.utils.formatEther(maticOraclePrice.mul(10000000000)), - wbtcOraclePrice: ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)), - usdcOraclePrice: ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)), - }); - setPricesUpdated(true); - } - }; - - const loadRatios = async () => { - if ( - signer && - vaults && - hardVaults && - validVaults(currentNetwork.chainId || 1, vaults) && - validHardVaults(currentNetwork.chainId || 1, hardVaults) - ) { - const daiRatioCall = await vaults.daiVaultRead?.ratio(); - const ethcalls = [daiRatioCall]; - - if (isInLayer1(currentNetwork.chainId)) { - const wethRatioCall = await vaults.wethVaultRead?.ratio(); - const aaveRatioCall = await vaults.aaveVaultRead?.ratio(); - const linkRatioCall = await vaults.linkVaultRead?.ratio(); - const hardWethRatioCall = await hardVaults.wethVaultRead?.ratio(); - const hardDaiRatioCall = await hardVaults.daiVaultRead?.ratio(); - const hardUsdcRatioCall = await hardVaults.usdcVaultRead?.ratio(); - const hardWbtcRatioCall = await hardVaults.wbtcVaultRead?.ratio(); - ethcalls.push(wethRatioCall); - ethcalls.push(aaveRatioCall); - ethcalls.push(linkRatioCall); - ethcalls.push(hardWethRatioCall); - ethcalls.push(hardDaiRatioCall); - ethcalls.push(hardUsdcRatioCall); - ethcalls.push(hardWbtcRatioCall); - } - if (isOptimism(currentNetwork.chainId)) { - const wethRatioCall = await vaults.wethVaultRead?.ratio(); - const linkRatioCall = await vaults.linkVaultRead?.ratio(); - const snxRatioCall = await vaults.snxVaultRead?.ratio(); - const uniRatioCall = await vaults.uniVaultRead?.ratio(); - ethcalls.push(wethRatioCall); - ethcalls.push(linkRatioCall); - ethcalls.push(snxRatioCall); - ethcalls.push(uniRatioCall); - } - if (isPolygon(currentNetwork.chainId)) { - const maticRatioCall = await vaults.maticVaultRead?.ratio(); - const wbtcRatioCall = await vaults.wbtcVaultRead?.ratio(); - ethcalls.push(maticRatioCall); - ethcalls.push(wbtcRatioCall); - } - let ethRatio = 0; - let daiRatio = 0; - let aaveRatio = 0; - let linkRatio = 0; - let snxRatio = 0; - let uniRatio = 0; - let maticRatio = 0; - let wbtcRatio = 0; - let hardEthRatio = 0; - let hardDaiRatio = 0; - let hardUsdcRatio = 0; - let hardWbtcRatio = 0; - if (isInLayer1(currentNetwork.chainId)) { - // @ts-ignore - [ - daiRatio, - ethRatio, - aaveRatio, - linkRatio, - hardEthRatio, - hardDaiRatio, - hardUsdcRatio, - hardWbtcRatio, - ] = await signer.ethcallProvider?.all(ethcalls); - } else if (isOptimism(currentNetwork.chainId)) { - // @ts-ignore - [daiRatio, ethRatio, linkRatio, snxRatio, uniRatio] = await signer.ethcallProvider?.all( - ethcalls - ); - } else if (isPolygon(currentNetwork.chainId)) { - // @ts-ignore - [daiRatio, maticRatio, wbtcRatio] = await signer.ethcallProvider?.all(ethcalls); - } - setVaultsRatio({ - ethRatio, - wethRatio: ethRatio, - daiRatio, - aaveRatio, - linkRatio, - uniRatio, - snxRatio, - maticRatio, - wbtcRatio, - hardEthRatio, - hardWethRatio: hardEthRatio, - hardDaiRatio, - hardUsdcRatio, - hardWbtcRatio, - }); - } - }; - - const getCollateralPrice = (symbol: string) => { - let price = "0"; - switch (symbol) { - case "ETH": - price = oraclePrices?.wethOraclePrice || "0"; - break; - case "WETH": - price = oraclePrices?.wethOraclePrice || "0"; - break; - case "DAI": - price = oraclePrices?.daiOraclePrice || "0"; - break; - case "AAVE": - price = oraclePrices?.aaveOraclePrice || "0"; - break; - case "LINK": - price = oraclePrices?.linkOraclePrice || "0"; - break; - case "UNI": - price = oraclePrices?.uniOraclePrice || "0"; - break; - case "SNX": - price = oraclePrices?.snxOraclePrice || "0"; - break; - case "MATIC": - price = oraclePrices?.maticOraclePrice || "0"; - break; - case "WBTC": - price = oraclePrices?.wbtcOraclePrice || "0"; - break; - case "USDC": - price = oraclePrices?.usdcOraclePrice || "0"; - break; - default: - break; - } - return price; - }; - - const getMinRatio = (symbol: string, isHardVault: boolean) => { - let minRatio = 200; - switch (symbol) { - case "ETH": - if (isHardVault) { - minRatio = vaultsRatio?.hardEthRatio || 100; - } else { - minRatio = vaultsRatio?.ethRatio || 200; - } - break; - case "WETH": - if (isHardVault) { - minRatio = vaultsRatio?.hardWethRatio || 125; - } else { - minRatio = vaultsRatio?.ethRatio || 200; - } - break; - case "DAI": - if (isHardVault) { - minRatio = vaultsRatio?.hardDaiRatio || 125; - } else { - minRatio = vaultsRatio?.daiRatio || 200; - } - break; - case "AAVE": - minRatio = vaultsRatio?.aaveRatio || 200; - break; - case "LINK": - minRatio = vaultsRatio?.linkRatio || 200; - break; - case "UNI": - minRatio = vaultsRatio?.uniRatio || 200; - break; - case "SNX": - minRatio = vaultsRatio?.snxRatio || 200; - break; - case "MATIC": - minRatio = vaultsRatio?.maticRatio || 200; - break; - case "WBTC": - if (isHardVault) { - minRatio = vaultsRatio?.hardWbtcRatio || 125; - } else { - minRatio = vaultsRatio?.wbtcRatio || 200; - } - break; - case "USDC": - minRatio = vaultsRatio?.hardUsdcRatio || 125; - break; - default: - break; - } - return minRatio; - }; - - const confPagination = (vData: Array, itemsPerPage: number) => { - if (vData.length > 0) { - const lastVaultId = vData[vData.length - 1].blockTS; - const itemsCount = vData.length; - const pages = Math.ceil(itemsCount / itemsPerPage); - const lastDataPage = Math.ceil(itemsCount / itemsPerPage); - const pag = { - previous: 0, - current: 1, - next: 2, - pages, - lastDataPage, - itemsPerPage, - itemsCount, - lastId: lastVaultId, - }; - setPagination(pag); - } else { - setPagination(pagDefault); - } - }; - - const calculateNetRewardUsd = async ( - vaultId: string, - vaultType: string, - isHardVault: boolean, - decimals: number - ) => { - try { - let cVault = vaults.wethVault; - let cVaultRead = vaults.wethVaultRead; - let vaultPrice = oraclePrices?.wethOraclePrice; - if (isHardVault) { - cVault = hardVaults.wethVault; - cVaultRead = hardVaults.wethVaultRead; - } - - switch (vaultType) { - case "DAI": - if (isHardVault) { - cVault = hardVaults.daiVault; - cVaultRead = hardVaults.daiVaultRead; - } else { - cVault = vaults.daiVault; - cVaultRead = vaults.daiVaultRead; - } - vaultPrice = oraclePrices?.daiOraclePrice; - break; - case "AAVE": - cVault = vaults.aaveVault; - cVaultRead = vaults.aaveVaultRead; - vaultPrice = oraclePrices?.aaveOraclePrice; - break; - case "LINK": - cVault = vaults.linkVault; - cVaultRead = vaults.linkVaultRead; - vaultPrice = oraclePrices?.linkOraclePrice; - break; - case "SNX": - cVault = vaults.snxVault; - cVaultRead = vaults.snxVaultRead; - vaultPrice = oraclePrices?.snxOraclePrice; - break; - case "UNI": - cVault = vaults.uniVault; - cVaultRead = vaults.uniVaultRead; - vaultPrice = oraclePrices?.uniOraclePrice; - break; - case "MATIC": - cVault = vaults.maticVault; - cVaultRead = vaults.maticVaultRead; - vaultPrice = oraclePrices?.maticOraclePrice; - break; - case "WBTC": - cVault = vaults.wbtcVault; - cVaultRead = vaults.wbtcVaultRead; - vaultPrice = oraclePrices?.wbtcOraclePrice; - break; - case "USDC": - cVault = hardVaults.usdcVault; - cVaultRead = hardVaults.usdcVaultRead; - vaultPrice = oraclePrices?.usdcOraclePrice; - break; - default: - if (isHardVault) { - cVault = hardVaults.wethVault; - cVaultRead = hardVaults.wethVaultRead; - } else { - cVault = vaults.wethVault; - cVaultRead = vaults.wethVaultRead; - } - vaultPrice = oraclePrices?.wethOraclePrice; - break; - } - - const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); - const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); - // @ts-ignore - const [reqTcap, liqReward] = await signer.ethcallProvider?.all([reqTcapCall, liqRewardCall]); - - const reqTcapText = ethers.utils.formatEther(reqTcap); - const liqRewardText = ethers.utils.formatUnits(liqReward, decimals); - const currentLiqFee = await cVault?.getFee(reqTcap); - const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); - const ethFee = ethers.utils.formatEther(increasedFee); - - return ( - toUSD(liqRewardText, vaultPrice || "0") - - toUSD(reqTcapText, oraclePrices?.tcapOraclePrice || "0") - - toUSD(ethFee, oraclePrices?.wethOraclePrice || "0") - ); - } catch (error) { - if (error.code !== "UNPREDICTABLE_GAS_LIMIT") { - console.log(error.code); - } - return 0; - } - }; - - const calculateVaultData = ( - collateralWei: ethers.BigNumberish, - debtWei: ethers.BigNumberish, - symbol: string, - isHardVault: boolean, - decimals: number - ) => { - const collateralText = ethers.utils.formatUnits(collateralWei, decimals); - const debtText = ethers.utils.formatEther(debtWei); - const collateralPrice = getCollateralPrice(symbol); - const collateralUSD = toUSD(collateralText, collateralPrice); - const debtUSD = toUSD(debtText, oraclePrices?.tcapOraclePrice || "0"); - const minRatio = getMinRatio(symbol, isHardVault); - - const ratio = getRatio2( - collateralText, - collateralPrice, - debtText, - oraclePrices?.tcapOraclePrice || "1" - ); - - let status = VAULT_STATUS.liquidation; - if (parseFloat(collateralText) < 0.0000000001) { - status = VAULT_STATUS.empty; - } else if (parseFloat(collateralText) >= 0.0000000001 && parseFloat(debtText) < 0.0000000001) { - status = VAULT_STATUS.ready; - } else if (ratio >= minRatio) { - status = VAULT_STATUS.active; - } - return { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status }; - }; - - const isValidRatio = (value: string) => { - let valid = false; - if (!Number.isNaN(value)) { - valid = Number.parseFloat(value) >= 0; - } - return valid; - }; - - const getMinRangeRatio = (): number => { - if (minRatioInput && minRatioInput.current) { - // @ts-ignore - const minRatio = minRatioInput.current.value; - if (isValidRatio(minRatio)) { - return parseFloat(minRatio); - } - } - return 0; - }; - - const getMaxRangeRatio = (): number => { - if (maxRatioInput && maxRatioInput.current) { - // @ts-ignore - const maxRatio = maxRatioInput.current.value; - if (isValidRatio(maxRatio)) { - return parseFloat(maxRatio); - } - } - return 3000; - }; - - const loadVaults = async (vaultsData: any) => { - const vData = new Array(); - const vLiquidables = new Array(); - const totals = { ...totalsDefault }; - const minFilterRatio = getMinRangeRatio(); - const maxFilterRatio = getMaxRangeRatio(); - - setSkipQuery(true); - setLoadMore(false); - setFilteringRatios(true); - // setLiqLoaded(currentStatus !== VAULT_STATUS.liquidation); - // @ts-ignore - vaultsData.vaults.forEach((v) => { - const cVaultDecimals = v.underlyingProtocol.underlyingToken.decimals; - const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = - calculateVaultData(v.collateral, v.debt, v.tokenSymbol, v.hardVault, cVaultDecimals); - - let addVault = true; - if (currentStatus === VAULT_STATUS.active || currentStatus === VAULT_STATUS.liquidation) { - addVault = currentStatus === status; - } - // filter ratio - if (currentStatus !== VAULT_STATUS.empty && currentStatus !== VAULT_STATUS.ready) { - addVault = addVault && ratio >= minFilterRatio && ratio <= maxFilterRatio; - } - - if (!showAllVaults) { - addVault = v.tokenSymbol === "WETH" || v.tokenSymbol === "DAI"; - } - if (addVault) { - let vaultUrl = ""; - const symbol = v.tokenSymbol === "WETH" ? "ETH" : v.tokenSymbol; - if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { - vaultUrl = window.location.origin.concat("/vault/").concat(symbol); - } - if (currentStatus === VAULT_STATUS.liquidation) { - vLiquidables.push({ - vaultId: v.vaultId, - vaultType: v.tokenSymbol, - decimals: cVaultDecimals, - hardVault: v.hardVault, - }); - } - - vData.push({ - id: v.vaultId, - collateralSymbol: v.tokenSymbol, - collateralValue: collateralText, - collateralUsd: collateralUSD.toFixed(2), - debt: debtText, - debtUsd: debtUSD.toFixed(2), - ratio, - minRatio: minRatio.toString(), - decimals: cVaultDecimals, - isHardVault: v.hardVault, - netReward: 0, - status, - blockTS: v.blockTS, - url: vaultUrl, - }); - - totals.vaults += 1; - totals.collateral = (parseFloat(totals.collateral) + parseFloat(collateralText)).toFixed(4); - totals.collateralUSD = (parseFloat(totals.collateralUSD) + collateralUSD).toFixed(2); - totals.debt = (parseFloat(totals.debt) + parseFloat(debtText)).toFixed(4); - totals.debtUSD = (parseFloat(totals.debtUSD) + debtUSD).toFixed(2); - } - }); - if (currentStatus !== VAULT_STATUS.liquidation) { - setVaultList(vData); - setVaultsTotals(totals); - } else { - const loadNetReward = async () => { - vLiquidables.forEach((l, index) => { - calculateNetRewardUsd(l.vaultId, l.vaultType, l.hardVault, l.decimals).then((result) => { - const newA = [...vData]; - newA[index].netReward = result; - setVaultList(newA); - }); - }); - }; - loadNetReward().then(() => { - setVaultList(vData); - setVaultsTotals(totals); - }); - } - // Set pagination data - confPagination(vData, pagination.itemsPerPage); - setFilteringRatios(false); - }; - - const { loading, data, error } = useQuery(vaultsQuery, { - fetchPolicy: "no-cache", - notifyOnNetworkStatusChange: true, - skip: skipQuery, - onError: () => { - console.log(error); - }, - onCompleted: () => { - if (pricesUpdated) { - setVaultGraphList(data); - loadVaults(data); - } - }, - }); - - useEffect( - () => { - if (!pricesUpdated) { - loadPrices(); - loadRatios(); - } else if (!isUndefined(data)) { - loadVaults(data); - } - }, - // eslint-disable-next-line - [signer, currentNetwork.chainId, pricesUpdated] - ); - - const tokensSymbols = (): Array => { - const symbols = [{ key: "all", name: "All" }]; - if (isInLayer1(currentNetwork.chainId)) { - symbols.push({ key: "weth", name: "ETH" }); - symbols.push({ key: "dai", name: "DAI" }); - if (showAllVaults) { - symbols.push({ key: "aave", name: "AAVE" }); - symbols.push({ key: "link", name: "LINK" }); - symbols.push({ key: "usdc", name: "USDC" }); - symbols.push({ key: "wbtc", name: "WBTC" }); - } - } else if (isOptimism(currentNetwork.chainId)) { - symbols.push({ key: "eth", name: "ETH" }); - symbols.push({ key: "dai", name: "DAI" }); - if (showAllVaults) { - symbols.push({ key: "link", name: "LINK" }); - symbols.push({ key: "uni", name: "UNI" }); - symbols.push({ key: "snx", name: "SNX" }); - } - } else { - symbols.push({ key: "matic", name: "MATIC" }); - symbols.push({ key: "dai", name: "DAI" }); - symbols.push({ key: "wbtc", name: "WBTC" }); - } - - return symbols; - }; - - const handleItemsViewChange = (number: string) => { - setSkipQuery(true); - confPagination(vaultList, parseInt(number)); - }; - - const handleRadioBtnChange = (value: string) => { - setSkipQuery(false); - setRadioValue(value); - if (value === "1") { - setOwnerAddress(""); - } else { - setOwnerAddress(currentAddress); - } - }; - - const handleStatusChange = (newStatus: string) => { - setSkipQuery(false); - setCurrentStatus(newStatus); - }; - - const handleTokenChange = (newToken: string) => { - setSkipQuery(false); - setTokenSymbol(newToken); - }; - - const handleModeChange = (newMode: string) => { - setSkipQuery(false); - setVaultMode(newMode); - }; - - /* const onChangeMinFilterRatio = async (event: React.ChangeEvent) => { - setMinFilterRatio(event.target.value); - }; - - const onChangeMaxFilterRatio = async (event: React.ChangeEvent) => { - setMaxFilterRatio(event.target.value); - }; */ - - const onFilterRatioClick = () => { - if (minRatioInput && maxRatioInput) { - // @ts-ignore - const minRatio = minRatioInput.current.value; - // @ts-ignore - const maxRatio = maxRatioInput.current.value; - if (isValidRatio(minRatio) && isValidRatio(maxRatio)) { - setCurrentMinRatio(minRatio.concat("%")); - setCurrentMaxRatio(maxRatio.concat("%")); - // @ts-ignore - loadVaults(vaultGraphList); - if (ratioRangeDropdown !== null) { - // @ts-ignore - ratioRangeDropdown.current.click(); - } - } - } - }; - - const onPageSelected = (pageNumber: number) => { - const nextPage = pageNumber === pagination.pages ? 0 : pageNumber + 1; - const newPagination = { - ...pagination, - previous: pageNumber === 1 ? 0 : pageNumber - 1, - current: pageNumber, - next: nextPage, - }; - setPagination(newPagination); - }; - - const updateLiquidatedVault = async (index: number, symbol: string) => { - let currentVault = vaults?.wethVault; - if (vaultList[index].isHardVault) { - currentVault = hardVaults?.wethVault; - } - switch (symbol) { - case "DAI": - if (vaultList[index].isHardVault) { - currentVault = hardVaults?.daiVault; - } else { - currentVault = vaults?.daiVault; - } - break; - case "AAVE": - currentVault = vaults?.aaveVault; - break; - case "LINK": - currentVault = vaults?.linkVault; - break; - case "UNI": - currentVault = vaults?.uniVault; - break; - case "SNX": - currentVault = vaults?.snxVault; - break; - case "MATIC": - currentVault = vaults?.maticVault; - break; - case "WBTC": - currentVault = vaults?.wbtcVault; - break; - case "USDC": - currentVault = hardVaults?.usdcVault; - break; - default: - break; - } - const [vaultId, collateral, , debt] = await currentVault?.getVault( - BigNumber.from(vaultList[index].id) - ); - const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = - calculateVaultData( - collateral, - debt, - symbol, - vaultList[index].isHardVault, - vaultList[index].decimals - ); - const allVaults = vaultList; - const v = { - id: vaultId, - collateralSymbol: symbol, - collateralValue: collateralText, - collateralUsd: collateralUSD.toFixed(2), - debt: debtText, - debtUsd: debtUSD.toFixed(2), - ratio, - minRatio: minRatio.toString(), - decimals: vaultList[index].decimals, - isHardVault: vaultList[index].isHardVault, - netReward: 0, - status, - blockTS: vaultList[index].blockTS, - url: vaultList[index].url, - }; - allVaults[index] = Object.create(v); - setVaultList(Array.from(allVaults)); - setRenderTable(!renderTable); - }; - - return ( -
- - - - -
{t("totals")}
-
- - - -
{t("vaults")}
- {vaultsTotals.vaults} - - -
{t("collateral")} (USD)
- - ${numberFormatStr(vaultsTotals.collateralUSD, 2, 2)} - - - -
-
{t("debt")}
- -
- {numberFormatStr(vaultsTotals.debt, 4, 4)} - - -
{t("debt")} (USD)
- ${numberFormatStr(vaultsTotals.debtUSD, 2, 2)} - - -
-
- - - -
-
-
{t("view")}:
- handleItemsViewChange(eventKey || "15")}> - -
- {pagination.itemsPerPage} -
-
- - {viewsList.map((item) => ( - - {item.name} - - ))} - -
-
-
-
-
-
{t("collateral")}:
- handleTokenChange(eventKey || "ALL")} - > - -
- - {tokenSymbol.toUpperCase()} -
-
- - {tokensSymbols().map((item) => ( - - {item.name} - - ))} - -
-
-
-
Status
- handleStatusChange(eventKey || "ALL")}> - -
- {capitalize(currentStatus)} -
-
- - {statusList.map((item) => ( - - {item.name} - - ))} - -
-
- {isInLayer1(currentNetwork.chainId) && ( -
-
{t("mode")}:
- handleModeChange(eventKey || "ALL")} - > - -
- {capitalize(vaultMode)} -
-
- - {modeList.map((item) => ( - - {item.name} - - ))} - -
-
- )} - {currentStatus !== VAULT_STATUS.empty && currentStatus !== VAULT_STATUS.ready && ( -
-
Ratio Range
- - -
- - {currentMinRatio} {currentMaxRatio} - -
-
- -
- - - -
- -
-
-
- )} - {currentAddress !== "" && ( -
- - {radios.map((radio, idx) => ( - handleRadioBtnChange(e.currentTarget.value)} - > - {radio.name} - - ))} - -
- )} -
- - {loading || filteringRatios || !pricesUpdated ? ( - - ) : ( - ) => setVaultList(v)} - currentStatus={currentStatus} - pagination={pagination} - refresh={updateLiquidatedVault} - /> - )} - - {pagination.pages > 0 && !loading && ( - - )} - -
-
-
-
-
- ); -}; diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 707973e..9495c96 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -30,6 +30,7 @@ import { isOptimism, notifyUser, toUSD, + isInLayer1, } from "../../../utils/utils"; type VaultInitType = { @@ -338,7 +339,12 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { // @ts-ignore const [currentAssetPrice] = await signer.ethcallProvider?.all([currentAssetPriceCall]); - return currentAssetPrice; + let cAssetPrice = currentAssetPrice; + if (isArbitrum(currentNetwork.chainId)) { + cAssetPrice = currentAssetPrice.mul(10); + } + + return cAssetPrice; }; const collateralPrice = async () => { @@ -1330,7 +1336,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => {
- {!isArbitrum(currentNetwork.chainId) ? ( + {isInLayer1(currentNetwork.chainId) ? ( <> {radios.map((radio, idx) => ( diff --git a/src/components/Warnings/FarmWarning.tsx b/src/components/Warnings/FarmWarning.tsx index aeefacc..8636781 100644 --- a/src/components/Warnings/FarmWarning.tsx +++ b/src/components/Warnings/FarmWarning.tsx @@ -1,7 +1,7 @@ import React, { useContext, useState } from "react"; import Alert from "react-bootstrap/esm/Alert"; import { useLocation } from "react-router-dom"; -import { isOptimism } from "../../utils/utils"; +import { isInLayer1 } from "../../utils/utils"; import { networkContext } from "../../state"; const FarmWarning = () => { @@ -11,13 +11,14 @@ const FarmWarning = () => { return ( <> - {showWarning && isOptimism(currentNetwork.chainId) && location.pathname === "/farm" && ( + {showWarning && !isInLayer1(currentNetwork.chainId) && location.pathname === "/farm" && ( { setShowWarning(false); }} + dismissible > - Liquidity incentives are not available on Optimism. + Liquidity incentives are only available ethereum mainnet network. )} diff --git a/src/contracts/cryptex.json b/src/contracts/cryptex.json index 1c83856..2597a3c 100644 --- a/src/contracts/cryptex.json +++ b/src/contracts/cryptex.json @@ -79609,7 +79609,7 @@ "chainId": "42161", "contracts": { "DAI": { - "address": "0x7E574b5F8B61B71A6A1DA6127A9383F656d1a800", + "address": "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", "abi": [ { "inputs": [], @@ -79925,7 +79925,7 @@ ] }, "DAIOracle": { - "address": "0x435D960a2Dcfb04f9099F13A6B5d09AD8849AD6A", + "address": "0x2fE5Bfd6051f45Df35167855e34335ed047bC8cC", "abi": [ { "inputs": [ @@ -80166,7 +80166,7 @@ ] }, "DAIVaultHandler": { - "address": "0xCEcB53DDa8C14796966a3797351E62cC72a98beE", + "address": "0x76fD6b835d21E1e411F5927950Ec9A0146cDB54B", "abi": [ { "inputs": [ @@ -80190,6 +80190,11 @@ "name": "_burnFee", "type": "uint256" }, + { + "internalType": "uint256", + "name": "_mintFee", + "type": "uint256" + }, { "internalType": "uint256", "name": "_liquidationPenalty", @@ -80366,6 +80371,25 @@ "name": "NewMinimumTCAP", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_mintFee", + "type": "uint256" + } + ], + "name": "NewMintFee", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -80853,7 +80877,26 @@ "type": "uint256" } ], - "name": "getFee", + "name": "getBurnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getMintFee", "outputs": [ { "internalType": "uint256", @@ -81132,7 +81175,20 @@ ], "name": "mint", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "mintFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { @@ -81345,6 +81401,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_mintFee", + "type": "uint256" + } + ], + "name": "setMintFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -81510,7 +81579,7 @@ ] }, "JPEGZ": { - "address": "0xB091FCDE940d3303f7174C41e184AEDe3dd7AdBf", + "address": "0xD5536c80191c624F6bFD5590A45b9E93B16DEA97", "abi": [ { "inputs": [ @@ -82091,7 +82160,7 @@ ] }, "JPEGZOracle": { - "address": "0xB67AD4cd26B33Ec60EbA6718626FF76a41CC676F", + "address": "0xAcd157D7D20a758FfA37830b873bA428a785D66d", "abi": [ { "inputs": [ @@ -83154,7 +83223,7 @@ ] }, "WETH": { - "address": "0x85f85C12FADEec638c63850117203f098386e6b9", + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "abi": [ { "anonymous": false, @@ -83439,7 +83508,7 @@ ] }, "WETHOracle": { - "address": "0x7E398fD108f81D7074c8512bd307270F936b19d3", + "address": "0x437964C8094C368d831a636C6b903fd207901756", "abi": [ { "inputs": [ @@ -83680,7 +83749,7 @@ ] }, "WETHVaultHandler": { - "address": "0x94BD0Ea4f4497F877aFeeDb7b1242b286f94D621", + "address": "0xe30C148Ca3cCe47341aB9bEbD7A8db031aB207D0", "abi": [ { "inputs": [ @@ -83704,6 +83773,11 @@ "name": "_burnFee", "type": "uint256" }, + { + "internalType": "uint256", + "name": "_mintFee", + "type": "uint256" + }, { "internalType": "uint256", "name": "_liquidationPenalty", @@ -83880,6 +83954,25 @@ "name": "NewMinimumTCAP", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_mintFee", + "type": "uint256" + } + ], + "name": "NewMintFee", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -84374,7 +84467,26 @@ "type": "uint256" } ], - "name": "getFee", + "name": "getBurnFee", + "outputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "getMintFee", "outputs": [ { "internalType": "uint256", @@ -84653,7 +84765,20 @@ ], "name": "mint", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "mintFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { @@ -84879,6 +85004,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_mintFee", + "type": "uint256" + } + ], + "name": "setMintFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/src/hooks/useBalances.tsx b/src/hooks/useBalances.tsx index ec167cc..d36f354 100644 --- a/src/hooks/useBalances.tsx +++ b/src/hooks/useBalances.tsx @@ -23,7 +23,6 @@ export const useBalances = ( }); const loadBalanceArbitrum = async () => { - console.log("Load Arbitrum "); const jpegzBalanceCall = await arbitrumContracts.jpegzTokenRead?.balanceOf(address); const jpegzSupplyCall = await arbitrumContracts.jpegzTokenRead?.totalSupply(); // @ts-ignore @@ -41,7 +40,6 @@ export const useBalances = ( }; const loadBalanceEthereum = async () => { - console.log("Load Ethereum "); const tcapBalanceCall = await ethereumContracts.tcapTokenRead?.balanceOf(address); const tcapSupplyCall = await ethereumContracts.tcapTokenRead?.totalSupply(); const ctxBalanceCall = await ethereumContracts.ctxTokenRead?.balanceOf(address); @@ -63,21 +61,23 @@ export const useBalances = ( }; const loadBalanceOptimism = async () => { - const tcapBalanceCall = await optimismContracts.tcapTokenRead?.balanceOf(address); - const tcapSupplyBalanceCall = await ethereumContracts.tcapTokenRead?.totalSupply(); + if (optimismContracts.tcapTokenRead) { + const tcapBalanceCall = await optimismContracts.tcapTokenRead?.balanceOf(address); + const tcapSupplyBalanceCall = await optimismContracts.tcapTokenRead?.totalSupply(); - // @ts-ignore - const [tcapBalance, tcapSupply] = await ethcallProvider?.all([ - tcapBalanceCall, - tcapSupplyBalanceCall, - ]); - setBalances({ - tcapBalance: ethers.utils.formatEther(tcapBalance), - jpegzBalance: "0", - ctxBalance: "0", - tcapSupplly: ethers.utils.formatEther(tcapSupply), - jpegzSupplly: "0", - }); + // @ts-ignore + const [tcapBalance, tcapSupply] = await ethcallProvider?.all([ + tcapBalanceCall, + tcapSupplyBalanceCall, + ]); + setBalances({ + tcapBalance: ethers.utils.formatEther(tcapBalance), + jpegzBalance: "0", + ctxBalance: "0", + tcapSupplly: ethers.utils.formatEther(tcapSupply), + jpegzSupplly: "0", + }); + } }; const loadBalance = async () => { diff --git a/src/hooks/usePrices.tsx b/src/hooks/usePrices.tsx index 2d361b0..9a58c0e 100644 --- a/src/hooks/usePrices.tsx +++ b/src/hooks/usePrices.tsx @@ -115,7 +115,7 @@ export const usePrices = (): OraclePricesType => { } setOraclePrices({ - jpegzOraclePrice: ethers.utils.formatEther(jpegzOraclePrice), + jpegzOraclePrice: ethers.utils.formatEther(jpegzOraclePrice.mul(10)), jpegzMarketCap: ethers.utils.formatEther(jpegzOraclePrice.mul(10000000000)), tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), tcapMarketCap: ethers.utils.formatEther(tcapOraclePrice.mul(10000000000)), diff --git a/src/hooks/usePrices2.tsx b/src/hooks/usePrices2.tsx index 7d1badc..0a2a3fc 100644 --- a/src/hooks/usePrices2.tsx +++ b/src/hooks/usePrices2.tsx @@ -30,7 +30,6 @@ export const usePrices2 = ( }); const loadPricesArbitrum = async () => { - console.log("Load Arbitrum PRICES "); const jpegzPriceCall = await arbitrumContracts.jpegzOracleRead?.getLatestAnswer(); const wethOraclePriceCall = await arbitrumContracts.wethOracleRead?.getLatestAnswer(); const daiOraclePriceCall = await arbitrumContracts.daiOracleRead?.getLatestAnswer(); @@ -46,12 +45,8 @@ export const usePrices2 = ( daiOraclePriceCall, ]); const marketCap = jpegzOraclePrice.mul(10000000000); - - console.log("jpegz price: ", ethers.utils.formatEther(jpegzOraclePrice)); - console.log("jpegz market cap: ", ethers.utils.formatEther(marketCap)); - const p = oraclePrices; - p.jpegzOraclePrice = ethers.utils.formatEther(jpegzOraclePrice); + p.jpegzOraclePrice = ethers.utils.formatEther(jpegzOraclePrice.mul(10)); p.jpegzMarketCap = ethers.utils.formatEther(marketCap); p.wethOraclePrice = ethers.utils.formatEther(wethOraclePrice.mul(10000000000)); p.daiOraclePrice = ethers.utils.formatEther(daiOraclePrice.mul(10000000000)); @@ -59,7 +54,6 @@ export const usePrices2 = ( }; const loadPricesEthereum = async () => { - console.log("Load Ethereum PRICES "); const tcapPriceCall = await ethereumContracts.tcapOracleRead?.getLatestAnswer(); const wethOraclePriceCall = await ethereumContracts.wethOracleRead?.getLatestAnswer(); const daiOraclePriceCall = await ethereumContracts.daiOracleRead?.getLatestAnswer(); @@ -96,9 +90,6 @@ export const usePrices2 = ( ]); const marketCap = tcapOraclePrice.mul(10000000000); - console.log("tcap price: ", ethers.utils.formatEther(tcapOraclePrice)); - console.log("tcap market cap: ", ethers.utils.formatEther(marketCap)); - setOraclePrices({ jpegzOraclePrice: "0", jpegzMarketCap: "0", diff --git a/src/state/Web3ModalContext.tsx b/src/state/Web3ModalContext.tsx index 5041780..04d5ace 100644 --- a/src/state/Web3ModalContext.tsx +++ b/src/state/Web3ModalContext.tsx @@ -31,6 +31,12 @@ switch (process.env.REACT_APP_NETWORK_ID) { } const providerOptions = { + injected: { + package: null, + options: { + infuraId: process.env.REACT_APP_INFURA_ID, + }, + }, walletlink: { package: WalletLink, // Required options: { @@ -54,10 +60,6 @@ const providerOptions = { options: { infuraId: process.env.REACT_APP_INFURA_ID, // required }, - // connector: async (ProviderPackage: new (arg0: any) => any, options: any) => { - // const provider = WalletConnectProvider; - // return provider; - // } }, }; diff --git a/src/styles/vault.scss b/src/styles/vault.scss index 85176a4..99ef4cf 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -31,7 +31,7 @@ display: flex; flex-direction: column; margin-top: 4rem; - width: 33%; + width: 40%; background-color: $darker; } diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 046574d..0603478 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -40,9 +40,9 @@ export const NETWORKS = { chainId: 42161, hexChainId: "0xA4B1", name: "Arbitrum One", - eth: "0x85f85C12FADEec638c63850117203f098386e6b9", - weth: "0x85f85C12FADEec638c63850117203f098386e6b9", - dai: "0x17aC26AB292660126d2baF16e5304DcbEc54340C", + eth: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + weth: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + dai: "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", }, arbitrum_goerli: { chainId: 421613, @@ -98,7 +98,7 @@ export const API_ENDPOINT = "https://test-api.cryptex.finance"; export const GRAPHQL_ENDPOINT = { mainnet: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-graph", goerli: "https://api.thegraph.com/subgraphs/name/jdestephen/cryptex-goerli-demo", - arbitrum: "https://api.thegraph.com/subgraphs/name/jdestephen/arbitrum-goerli-demo", + arbitrum: "https://api.thegraph.com/subgraphs/name/jdestephen/cryptex-arbitrum-demo", arbitrum_goerli: "https://api.thegraph.com/subgraphs/name/jdestephen/arbitrum-goerli-demo", optimism: "https://api.thegraph.com/subgraphs/name/cryptexfinance/cryptex-optimism", okovan: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo", diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index f12995e..04d1f86 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -19,6 +19,7 @@ export const makeShortAddress = (address: string) => { export const isUndefined = (value: any): boolean => typeof value === "undefined"; export const getENS = async (address: string) => { + console.log(" getENS ---"); const provider = ethers.getDefaultProvider(NETWORKS.mainnet.name, { infura: process.env.REACT_APP_INFURA_ID, alchemy: process.env.REACT_APP_ALCHEMY_KEY, @@ -31,6 +32,7 @@ export const getENS = async (address: string) => { }; export const getAddressFromENS = async (ens: string) => { + console.log(" ENS ---"); const provider = ethers.getDefaultProvider(); const address = await provider.resolveName(ens); if (address) { @@ -40,11 +42,13 @@ export const getAddressFromENS = async (ens: string) => { }; export const getENSAvatar = async (resolver: ethers.providers.Resolver) => { + console.log(" ENS Avatar ---"); const avatar = await resolver.getText("avatar"); return avatar; }; export const isValidAddress = async (address: string) => { + console.log(" isValidAddress ---"); try { const currentAddress = ethers.utils.getAddress(address); return currentAddress; @@ -269,7 +273,7 @@ export function toFragment(abi: JsonFragment[]): Fragment[] { } export const isValidNetwork = (chainId: number) => { - const name = process.env.REACT_APP_NETWORK_NAME || "rinkeby"; + const name = process.env.REACT_APP_NETWORK_NAME || "goerli"; if (name.toLowerCase() === "mainnet") { return ( chainId === NETWORKS.mainnet.chainId || @@ -323,7 +327,11 @@ export const isGoerli = (chainId: number | undefined) => { export const getDefaultProvider = (chainId: number | undefined) => { let provider; - if (chainId === NETWORKS.arbitrum_goerli.chainId) { + if (chainId === NETWORKS.arbitrum.chainId) { + provider = new ethers.providers.InfuraProvider("arbitrum", { + infura: process.env.REACT_APP_INFURA_ID, + }); + } else if (chainId === NETWORKS.arbitrum_goerli.chainId) { provider = new ethers.providers.InfuraProvider("arbitrum-goerli", { infura: process.env.REACT_APP_INFURA_ID, }); @@ -416,6 +424,7 @@ export const validOracles = (chainId: number, oracles: any): boolean => { valid && !isUndefined(oracles.tcapOracleRead) && !isUndefined(oracles.wethOracleRead) && + !isUndefined(oracles.daiOracleRead) && !isUndefined(oracles.linkOracleRead) && !isUndefined(oracles.snxOracleRead) && !isUndefined(oracles.uniOracleRead); diff --git a/yarn.lock b/yarn.lock index 3a81bc9..c9121fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@adobe/css-tools@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" - integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== + version "4.1.0" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.1.0.tgz#417fef4a143f4396ad0b3b4351fee21323f15aa8" + integrity sha512-mMVJ/j/GbZ/De4ZHWbQAQO1J6iVnjtZLc9WEdkUQb8S/Bu2cAF2bETXUgMAdvMG3/ngtKmcNBe+Zms9bg6jnQQ== "@ampproject/remapping@^2.1.0": version "2.2.0" @@ -16,9 +16,9 @@ "@jridgewell/trace-mapping" "^0.3.9" "@apollo/client@^3.7.1": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.3.tgz#ab3fe31046e74bc1a3762363a185ba5bcfffc58b" - integrity sha512-nzZ6d6a4flLpm3pZOGpuAUxLlp9heob7QcCkyIqZlCLvciUibgufRfYTwfkWCc4NaGHGSZyodzvfr79H6oUwGQ== + version "3.7.7" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.7.tgz#5eb6e8af24fb809c97c8f66c3faf9524f83c412b" + integrity sha512-Rp/pCWuJSjLN7Xl5Qi2NoeURmZYEU/TIUz0n/LOwEo1tGdU2W7/fGVZ8+5um58JeVYq4UoTGBKFxSVeG4s411A== dependencies: "@graphql-typed-document-node/core" "^3.1.1" "@wry/context" "^0.7.0" @@ -56,9 +56,9 @@ "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.12.1", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.20.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" - integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== + version "7.20.14" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" + integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== "@babel/core@7.12.3": version "7.12.3" @@ -83,30 +83,30 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.5", "@babel/core@^7.8.4", "@babel/core@^7.9.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.7.tgz#37072f951bd4d28315445f66e0ec9f6ae0c8c35f" - integrity sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw== + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" "@babel/generator" "^7.20.7" "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" "@babel/helpers" "^7.20.7" "@babel/parser" "^7.20.7" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" + "@babel/traverse" "^7.20.12" "@babel/types" "^7.20.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" + json5 "^2.2.2" semver "^6.3.0" "@babel/generator@^7.12.1", "@babel/generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" - integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== + version "7.20.14" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== dependencies: "@babel/types" "^7.20.7" "@jridgewell/gen-mapping" "^0.3.2" @@ -138,10 +138,10 @@ lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz#d0e1f8d7e4ed5dac0389364d9c0c191d948ade6f" - integrity sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.12", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" + integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" @@ -149,6 +149,7 @@ "@babel/helper-member-expression-to-functions" "^7.20.7" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": @@ -212,7 +213,7 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.20.7": +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== @@ -307,12 +308,12 @@ "@babel/types" "^7.20.5" "@babel/helpers@^7.12.1", "@babel/helpers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" - integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" + integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== dependencies: "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" + "@babel/traverse" "^7.20.13" "@babel/types" "^7.20.7" "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": @@ -324,10 +325,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.7.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" - integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7", "@babel/parser@^7.7.0": + version "7.20.15" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" + integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -373,11 +374,11 @@ "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.7.tgz#05d37453c2ce818f3e47bbeda9468c8de947eecc" - integrity sha512-JB45hbUweYpwAGjkiM7uCyXMENH2lG+9r3G2E+ttc2PRXAoEkpfd/KW5jDg4j8RS6tLtTG1jZi9LbHZVSfs1/A== + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.13.tgz#b6bea3b18e88443688fa7ed2cc06d2c60da9f4a7" + integrity sha512-7T6BKHa9Cpd7lCueHBBzP0nkXNina+h5giOZw+a8ZpMfPFY19VjJAjIxyFHuWkhCWgL6QMqRiY/wB1fLXzm6Mw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-create-class-features-plugin" "^7.20.12" "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" @@ -656,9 +657,9 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz#9f5a3424bd112a3f32fe0cf9364fbb155cff262a" - integrity sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw== + version "7.20.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz#3e1b2aa9cbbe1eb8d644c823141a9c5c2a22392d" + integrity sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -847,9 +848,9 @@ "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz#025d85a1935fd7e19dfdcb1b1d4df34d4da484f7" - integrity sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ== + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz#f950f0b0c36377503d29a712f16287cedf886cbb" + integrity sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-module-imports" "^7.18.6" @@ -929,11 +930,11 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz#673f49499cd810ae32a1ea5f3f8fab370987e055" - integrity sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw== + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz#e3581b356b8694f6ff450211fe6774eaff8d25ab" + integrity sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-create-class-features-plugin" "^7.20.12" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-typescript" "^7.20.0" @@ -1138,17 +1139,17 @@ "@babel/plugin-transform-typescript" "^7.18.6" "@babel/runtime-corejs3@^7.10.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.7.tgz#a1e5ea3d758ba6beb715210142912e3f29981d84" - integrity sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg== + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.13.tgz#ad012857db412ab0b5ccf184b67be2cfcc2a1dcf" + integrity sha512-p39/6rmY9uvlzRiLZBIB3G9/EBr66LBMcYm7fIDeSBNdRjF2AGD3rFZucUyAgGHC2N+7DdLvVi33uTjSE44FIw== dependencies: core-js-pure "^3.25.1" regenerator-runtime "^0.13.11" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.19.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" - integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.19.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== dependencies: regenerator-runtime "^0.13.11" @@ -1161,10 +1162,10 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": - version "7.20.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.10.tgz#2bf98239597fcec12f842756f186a9dde6d09230" - integrity sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" + integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== dependencies: "@babel/code-frame" "^7.18.6" "@babel/generator" "^7.20.7" @@ -1172,7 +1173,7 @@ "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.7" + "@babel/parser" "^7.20.13" "@babel/types" "^7.20.7" debug "^4.1.0" globals "^11.1.0" @@ -1763,10 +1764,10 @@ "@types/node" "*" jest-mock "^26.6.2" -"@jest/expect-utils@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" - integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== +"@jest/expect-utils@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.1.tgz#105b9f3e2c48101f09cae2f0a4d79a1b3a419cbb" + integrity sha512-w6YJMn5DlzmxjO00i9wu2YSozUYRBhIoJ6nQwpMYcBMtiqMGJm1QBzOf6DDgRao8dbtpDoaqLg6iiQTvv0UHhQ== dependencies: jest-get-type "^29.2.0" @@ -1823,12 +1824,12 @@ optionalDependencies: node-notifier "^8.0.0" -"@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== +"@jest/schemas@^29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.0.tgz#0d6ad358f295cc1deca0b643e6b4c86ebd539f17" + integrity sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ== dependencies: - "@sinclair/typebox" "^0.24.1" + "@sinclair/typebox" "^0.25.16" "@jest/source-map@^26.6.2": version "26.6.2" @@ -1892,12 +1893,12 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@jest/types@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" - integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== +"@jest/types@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.1.tgz#f9f83d0916f50696661da72766132729dcb82ecb" + integrity sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.0" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -2006,50 +2007,12 @@ schema-utils "^2.6.5" source-map "^0.7.3" -"@popperjs/core@^2.11.5": +"@popperjs/core@^2.11.6": version "2.11.6" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== -"@portis/web3-provider-engine@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@portis/web3-provider-engine/-/web3-provider-engine-1.1.2.tgz#97f383156ea6b70fba69ae93a945fdd94159b1ba" - integrity sha512-NiiF0UPfngf4ulo32ybEDAMaad4i7h44HJaN8ea8HHt/vaFiUcPtINjC2o21jhWaLANerW4ZbOrNs1iCLH4p6A== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^4.2.0" - eth-json-rpc-filters "^4.0.2" - eth-json-rpc-infura "^3.1.0" - eth-json-rpc-middleware "^5.0.2" - eth-sig-util "2.5.3" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" - -"@portis/web3@^2.0.0-beta.59": - version "2.0.0-beta.59" - resolved "https://registry.yarnpkg.com/@portis/web3/-/web3-2.0.0-beta.59.tgz#2e5292d8e1daf6070aa3b4a8cb33c1a9e0315011" - integrity sha512-QdIdrI3uK+TyT+dxRK5bEYOi2PBlUDJ7vszR2uu0bT49wy7O52B9td6fL/5gsfk0VpCsmrYov3x3gEQYwGUyvQ== - dependencies: - "@portis/web3-provider-engine" "1.1.2" - ethereumjs-util "5.2.0" - penpal "3.0.7" - pocket-js-core "0.0.3" - -"@react-aria/ssr@^3.2.0": +"@react-aria/ssr@^3.4.1": version "3.4.1" resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.4.1.tgz#79e8bb621487e8f52890c917d3c734f448ba95e7" integrity sha512-NmhoilMDyIfQiOSdQgxpVH2tC2u85Y0mVijtBNbI9kcDYLEiW/r6vKYVKtkyU+C4qobXhGMPfZ70PTc0lysSVA== @@ -2062,23 +2025,23 @@ integrity sha512-VM14wDOX5CW5Dn6b2lTiMd79BFMTut9AZj2+vIRT3LCKgMCYmdqruTtzDPSnIVDQdtxdPgtOzvU9oK20LopuOw== "@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7": - version "0.4.7" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.7.tgz#d79ca6472c01ce04389fc73d4a79af1b5e33cd39" - integrity sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A== + version "0.4.8" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.8.tgz#67ada92e36527956865ab9b1ddfb87d37aa1db42" + integrity sha512-Ivvp1FZ0Lja80iUTYAhbzy+stxwO7FbPHP95ypCtIh0wyOLiayQywXhVJ2ZYP5S1AjW2GmKHeRU4UglMwTG2sA== dependencies: dequal "^2.0.2" "@restart/ui@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.4.1.tgz#c9057915f0708c411824eeb16c03d0108c0208d2" - integrity sha512-J7wFOx2DcmkBqCqiZgDsggLO7faiNh4Nv1/v80FmbRgP+MYpwaVDKKXLC69DA4+ejgNIsBP5ORtC74EZqO1j8A== + version "1.5.4" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.5.4.tgz#2537e1b7495f7ed4257dae3676c8d2b91e664e03" + integrity sha512-ziNtXY2PrjXrRUfR1D/ry1v1i5IF+kfMcH9d1kIcU2lOELfmDsVb+fzbyEDz3yKvKuqkphTunVDuLdYRJ0YsAg== dependencies: - "@babel/runtime" "^7.18.3" - "@popperjs/core" "^2.11.5" - "@react-aria/ssr" "^3.2.0" + "@babel/runtime" "^7.20.7" + "@popperjs/core" "^2.11.6" + "@react-aria/ssr" "^3.4.1" "@restart/hooks" "^0.4.7" "@types/warning" "^3.0.0" - dequal "^2.0.2" + dequal "^2.0.3" dom-helpers "^5.2.0" uncontrollable "^7.2.1" warning "^4.0.3" @@ -2111,10 +2074,10 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@sinclair/typebox@^0.25.16": + version "0.25.21" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" + integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== "@sinonjs/commons@^1.7.0": version "1.8.6" @@ -2298,17 +2261,17 @@ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@typeform/embed-react@^2.1.0": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@typeform/embed-react/-/embed-react-2.10.0.tgz#7213011d43078266a5f5ab9c61ba11eaf3123a90" - integrity sha512-vtmALabuj8zlfznOvjP/RRPEu4pKqRqDT+AhhBtoRxOtgwq1g+sMyE5jKPguU/onRybSDMp3QioOJqLeuU5ZIg== + version "2.15.0" + resolved "https://registry.yarnpkg.com/@typeform/embed-react/-/embed-react-2.15.0.tgz#4f283c311ae8a5f75a563291747faebbd4f2e5a4" + integrity sha512-OO3gT96yMv+vMflXjYbsSS84qizjfkdCO39Y5kPalpRVvydCgT3KoxM+tdrWY6L2ciD1q+yQs1NZbYh63xFkuw== dependencies: - "@typeform/embed" "2.5.1" + "@typeform/embed" "2.8.0" fast-deep-equal "^3.1.3" -"@typeform/embed@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@typeform/embed/-/embed-2.5.1.tgz#a4139c005b13c0d46737511d6e77498a7c721b18" - integrity sha512-fxyTFuv9H5Mqo/cTzwzHEp/WqchiD0HO+kE9LxHeOO+PrDtgXOoRcQAVKlI+/1UWxtO0GXhIe9cio3CyyVr/iA== +"@typeform/embed@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@typeform/embed/-/embed-2.8.0.tgz#45456b47103d27e818e426d782e0af0976909db8" + integrity sha512-+64uxHXbOefA9euw9gQUZ3WAvh+61wH6Vbl3x9WYQ3tAY2iM9gPTYhfxPDMdx/79KuRMIbHUKWpTD6PflaWy8w== "@types/aria-query@^4.2.0": version "4.2.2" @@ -2316,12 +2279,12 @@ integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.20" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" - integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" @@ -2389,9 +2352,9 @@ "@types/node" "*" "@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== dependencies: "@types/node" "*" @@ -2425,9 +2388,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@*": - version "29.2.5" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.5.tgz#c27f41a9d6253f288d1910d3c5f09484a56b73c0" - integrity sha512-H2cSxkKgVmqNHXP7TC2L/WUorrZu8ZigyRywfVzv6EyBlxj39n4C00hjXYQWsbwqgElaj/CiAeSRmk5GoaKTgw== + version "29.4.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" + integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2461,9 +2424,9 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": - version "18.11.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" - integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== + version "18.11.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.19.tgz#35e26df9ec441ab99d73e99e9aca82935eea216d" + integrity sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw== "@types/node@^14.14.2": version "14.18.36" @@ -2541,9 +2504,9 @@ "@types/react" "*" "@types/react@*", "@types/react@>=16.9.11", "@types/react@^18.0.24": - version "18.0.26" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" - integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== + version "18.0.27" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.27.tgz#d9425abe187a00f8a5ec182b010d4fd9da703b71" + integrity sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2629,16 +2592,16 @@ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== + version "15.0.15" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" + integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== dependencies: "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.18" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.18.tgz#466225ab4fbabb9aa711f5b406796daf1374a5b7" - integrity sha512-eIJR1UER6ur3EpKM3d+2Pgd+ET+k6Kn9B4ZItX0oPjjVI5PrfaRjKyLT5UYendDpLuoiJMNJvovLQbEXqhsPaw== + version "17.0.22" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" + integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== dependencies: "@types/yargs-parser" "*" @@ -3114,6 +3077,11 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + abstract-leveldown@~2.6.0: version "2.6.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" @@ -3165,9 +3133,9 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.5.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== address@1.1.2: version "1.1.2" @@ -3247,6 +3215,11 @@ alphanum-sort@^1.0.0: resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ== +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" @@ -3284,6 +3257,11 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -3319,11 +3297,19 @@ anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.1.1: +aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -3344,7 +3330,7 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" -aria-query@^5.0.0: +aria-query@^5.0.0, aria-query@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== @@ -3376,6 +3362,11 @@ array-differ@^3.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -3386,7 +3377,7 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.4, array-includes@^3.1.5, array-includes@^3.1.6: +array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== @@ -3419,7 +3410,7 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -array.prototype.flat@^1.2.5: +array.prototype.flat@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== @@ -3461,11 +3452,6 @@ array.prototype.tosorted@^1.1.1: es-shim-unscopables "^1.0.0" get-intrinsic "^1.1.3" -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - arrify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" @@ -3527,9 +3513,9 @@ astral-regex@^2.0.0: integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" + integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== async-eventemitter@^0.2.2: version "0.2.4" @@ -3538,6 +3524,11 @@ async-eventemitter@^0.2.2: dependencies: async "^2.4.0" +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA== + async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -3601,27 +3592,21 @@ aws-sign2@~0.7.0: integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axe-core@^4.4.3: - version "4.6.1" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.1.tgz#79cccdee3e3ab61a8f42c458d4123a6768e6fbce" - integrity sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w== +axe-core@^4.6.2: + version "4.6.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece" + integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== -axios@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" - integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== +axobject-query@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== dependencies: - follow-redirects "1.5.10" - is-buffer "^2.0.2" - -axobject-query@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" - integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + deep-equal "^2.0.5" babel-eslint@^10.1.0: version "10.1.0" @@ -3667,20 +3652,6 @@ babel-loader@8.1.0: pify "^4.0.1" schema-utils "^2.6.5" -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA== - dependencies: - babel-runtime "^6.22.0" - babel-plugin-istanbul@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -3936,6 +3907,13 @@ blakejs@^1.1.0: resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ== + dependencies: + inherits "~2.0.0" + bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -4119,14 +4097,14 @@ browserslist@4.14.2: node-releases "^1.1.61" browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.6.2, browserslist@^4.6.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" bs58@^4.0.0: version "4.0.1" @@ -4339,11 +4317,24 @@ camel-case@^4.1.1: pascal-case "^3.1.2" tslib "^2.0.3" +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ== + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw== + camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" @@ -4364,10 +4355,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001400: - version "1.0.30001441" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz#987437b266260b640a23cd18fbddb509d7f69f3e" - integrity sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001449: + version "1.0.30001450" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz#022225b91200589196b814b51b1bbe45144cf74f" + integrity sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew== capture-exit@^2.0.0: version "2.0.0" @@ -4395,6 +4386,17 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -4578,6 +4580,11 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" @@ -4728,6 +4735,11 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -4741,9 +4753,9 @@ content-disposition@0.5.4: safe-buffer "5.2.1" content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@1.7.0: version "1.7.0" @@ -4757,7 +4769,7 @@ convert-source-map@^0.3.3: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" integrity sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg== -convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== @@ -4773,9 +4785,9 @@ cookie@0.5.0: integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== cookiejar@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" - integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== + version "2.1.4" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== copy-concurrently@^1.0.0: version "1.0.5" @@ -4802,16 +4814,16 @@ copy-to-clipboard@^3.3.1: toggle-selection "^1.0.6" core-js-compat@^3.25.1, core-js-compat@^3.6.2: - version "3.27.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.1.tgz#b5695eb25c602d72b1d30cbfba3cb7e5e4cf0a67" - integrity sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA== + version "3.27.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.2.tgz#607c50ad6db8fd8326af0b2883ebb987be3786da" + integrity sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg== dependencies: browserslist "^4.21.4" core-js-pure@^3.25.1: - version "3.27.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.27.1.tgz#ede4a6b8440585c7190062757069c01d37a19dca" - integrity sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw== + version "3.27.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.27.2.tgz#47e9cc96c639eefc910da03c3ece26c5067c7553" + integrity sha512-Cf2jqAbXgWH3VVzjyaaFkY1EBazxugUepGymDoeteyYr9ByX51kD2jdHZlsEF/xnJMyN3Prua7mQuzwMg6Zc9A== core-js@^2.4.0: version "2.6.12" @@ -4819,9 +4831,9 @@ core-js@^2.4.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.6.5: - version "3.27.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.1.tgz#23cc909b315a6bb4e418bf40a52758af2103ba46" - integrity sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww== + version "3.27.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.2.tgz#85b35453a424abdcacb97474797815f4d62ebbf7" + integrity sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w== core-util-is@1.0.2: version "1.0.2" @@ -4909,6 +4921,14 @@ cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ== + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -5037,9 +5057,9 @@ css-select@^4.1.3: nth-check "^2.0.1" css-to-react-native@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" - integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.1.0.tgz#e783474149997608986afcff614405714a8fe1ac" + integrity sha512-AryfkFA29b4I3vG7N4kxFboq15DxwSXzhXM37XNEjwJMgjYIc8BcqfiprpAqX0zadI5PMByEIwAMzXxk5Vcc4g== dependencies: camelize "^1.0.0" css-color-keywords "^1.0.0" @@ -5198,6 +5218,13 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng== + dependencies: + array-find-index "^1.0.1" + cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -5232,7 +5259,7 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -5253,15 +5280,7 @@ debug@^3.2.5, debug@^3.2.7: dependencies: ms "^2.1.1" -decamelize-keys@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -5276,13 +5295,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -5301,16 +5313,18 @@ deep-equal@^1.0.1: regexp.prototype.flags "^1.2.0" deep-equal@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.1.0.tgz#5ba60402cf44ab92c2c07f3f3312c3d857a0e1dd" - integrity sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" + integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== dependencies: call-bind "^1.0.2" es-get-iterator "^1.1.2" get-intrinsic "^1.1.3" is-arguments "^1.1.1" + is-array-buffer "^3.0.1" is-date-object "^1.0.5" is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" isarray "^2.0.5" object-is "^1.1.5" object-keys "^1.1.1" @@ -5319,7 +5333,7 @@ deep-equal@^2.0.5: side-channel "^1.0.4" which-boxed-primitive "^1.0.2" which-collection "^1.0.1" - which-typed-array "^1.1.8" + which-typed-array "^1.1.9" deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" @@ -5327,9 +5341,9 @@ deep-is@^0.1.3, deep-is@~0.1.3: integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== default-gateway@^4.2.0: version "4.2.0" @@ -5376,11 +5390,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" - integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== - del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -5399,6 +5408,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -5409,7 +5423,7 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -dequal@^2.0.2: +dequal@^2.0.2, dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== @@ -5526,9 +5540,9 @@ doctrine@^3.0.0: esutils "^2.0.2" dom-accessibility-api@^0.5.6: - version "0.5.15" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.15.tgz#357e74338704f36fada8b2e01a4bfc11ef436ac9" - integrity sha512-8o+oVqLQZoruQPYy3uAAQtc6YbtSiRq5aPJBhJ82YTJRHvI6ofhYAkC81WmjFTnfUbqg6T3aCglIpU9p/5e7Cw== + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== dom-converter@^0.2.0: version "0.2.0" @@ -5671,10 +5685,10 @@ ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.284: + version "1.4.286" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz#0e039de59135f44ab9a8ec9025e53a9135eba11f" + integrity sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ== elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" @@ -5759,7 +5773,7 @@ errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.3.1: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -5774,26 +5788,32 @@ error-stack-parser@^2.0.6: stackframe "^1.3.4" es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.5.tgz#e6dc99177be37cacda5988e692c3fa8b218e95d2" - integrity sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ== + version "1.21.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" + integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== dependencies: + available-typed-arrays "^1.0.5" call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" function-bind "^1.1.1" function.prototype.name "^1.1.5" get-intrinsic "^1.1.3" get-symbol-description "^1.0.0" + globalthis "^1.0.3" gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" + internal-slot "^1.0.4" + is-array-buffer "^3.0.1" is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" + is-typed-array "^1.1.10" is-weakref "^1.0.2" object-inspect "^1.12.2" object-keys "^1.1.1" @@ -5802,7 +5822,9 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: safe-regex-test "^1.0.0" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" es-array-method-boxes-properly@^1.0.0: version "1.0.0" @@ -5810,18 +5832,28 @@ es-array-method-boxes-properly@^1.0.0: integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-get-iterator@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" - integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.0" - has-symbols "^1.0.1" - is-arguments "^1.1.0" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" is-map "^2.0.2" is-set "^2.0.2" - is-string "^1.0.5" + is-string "^1.0.7" isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" es-shim-unscopables@^1.0.0: version "1.0.0" @@ -5880,7 +5912,7 @@ escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -5934,15 +5966,16 @@ eslint-config-react-app@^6.0.0: dependencies: confusing-browser-globals "^1.0.10" -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: debug "^3.2.7" - resolve "^1.20.0" + is-core-module "^2.11.0" + resolve "^1.22.1" -eslint-module-utils@^2.7.3: +eslint-module-utils@^2.7.4: version "2.7.4" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== @@ -5973,22 +6006,24 @@ eslint-plugin-html@^6.1.0: htmlparser2 "^7.1.2" eslint-plugin-import@^2.22.1: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" has "^1.0.3" - is-core-module "^2.8.1" + is-core-module "^2.11.0" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" tsconfig-paths "^3.14.1" eslint-plugin-jest@^24.1.0: @@ -5999,22 +6034,25 @@ eslint-plugin-jest@^24.1.0: "@typescript-eslint/experimental-utils" "^4.0.1" eslint-plugin-jsx-a11y@^6.3.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" - integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== dependencies: - "@babel/runtime" "^7.18.9" - aria-query "^4.2.2" - array-includes "^3.1.5" + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" ast-types-flow "^0.0.7" - axe-core "^4.4.3" - axobject-query "^2.2.0" + axe-core "^4.6.2" + axobject-query "^3.1.1" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" has "^1.0.3" - jsx-ast-utils "^3.3.2" - language-tags "^1.0.5" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" semver "^6.3.0" eslint-plugin-prettier@^3.1.4: @@ -6035,9 +6073,9 @@ eslint-plugin-react-hooks@^4.2.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.21.5: - version "7.31.11" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" - integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== + version "7.32.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" @@ -6051,7 +6089,7 @@ eslint-plugin-react@^7.21.5: object.hasown "^1.1.2" object.values "^1.1.6" prop-types "^15.8.1" - resolve "^2.0.0-next.3" + resolve "^2.0.0-next.4" semver "^6.3.0" string.prototype.matchall "^4.0.8" @@ -6646,15 +6684,15 @@ expect@^26.6.0, expect@^26.6.2: jest-regex-util "^26.0.0" expect@^29.0.0: - version "29.3.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" - integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== + version "29.4.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.1.tgz#58cfeea9cbf479b64ed081fd1e074ac8beb5a1fe" + integrity sha512-OKrGESHOaMxK3b6zxIq9SOW8kEXztKff/Dvg88j4xIJxur1hspEbedVkR3GpHe5LO+WB2Qw7OWN0RMTdp6as5A== dependencies: - "@jest/expect-utils" "^29.3.1" + "@jest/expect-utils" "^29.4.1" jest-get-type "^29.2.0" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" express@^4.17.1: version "4.18.2" @@ -6908,6 +6946,14 @@ find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -6960,7 +7006,7 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== -for-each@^0.3.3, for-each@~0.3.3: +for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== @@ -7096,6 +7142,16 @@ fsevents@^2.1.2, fsevents@^2.1.3, fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -7121,6 +7177,27 @@ functions-have-names@^1.2.2: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -7131,10 +7208,10 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -7150,6 +7227,11 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw== + get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" @@ -7204,7 +7286,7 @@ glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -7216,6 +7298,18 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@~7.1.1: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -7253,12 +7347,19 @@ globals@^12.1.0: type-fest "^0.8.1" globals@^13.6.0, globals@^13.9.0: - version "13.19.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" - integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + globby@11.0.1: version "11.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" @@ -7294,12 +7395,14 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== +globule@^1.0.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.4.tgz#7c11c43056055a75a6e68294453c17f2796170fb" + integrity sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg== dependencies: - get-intrinsic "^1.1.3" + glob "~7.1.1" + lodash "^4.17.21" + minimatch "~3.0.2" gopd@^1.0.1: version "1.0.1" @@ -7361,6 +7464,13 @@ harmony-reflect@^1.4.6: resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -7383,6 +7493,11 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -7395,6 +7510,11 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -7754,9 +7874,9 @@ immer@8.0.1: integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== immutable@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.1.tgz#8a4025691018c560a40c67e43d698f816edc44d4" - integrity sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ== + version "4.2.4" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" + integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== import-cwd@^2.0.0: version "2.1.0" @@ -7809,6 +7929,18 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +in-publish@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" + integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg== + dependencies: + repeating "^2.0.0" + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -7832,7 +7964,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, 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" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -7860,7 +7992,7 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" -internal-slot@^1.0.3: +internal-slot@^1.0.3, internal-slot@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== @@ -7915,7 +8047,7 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arguments@^1.0.4, is-arguments@^1.1.0, is-arguments@^1.1.1: +is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -7923,6 +8055,15 @@ is-arguments@^1.0.4, is-arguments@^1.1.0, is-arguments@^1.1.1: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" + integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -7972,11 +8113,6 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@^2.0.2: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -8001,7 +8137,7 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.0.0, is-core-module@^2.8.1, is-core-module@^2.9.0: +is-core-module@^2.0.0, is-core-module@^2.11.0, is-core-module@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== @@ -8074,11 +8210,23 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + is-fn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" integrity sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg== +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -8257,7 +8405,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10: +is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== @@ -8273,10 +8421,10 @@ is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== is-weakmap@^2.0.1: version "2.0.1" @@ -8493,15 +8641,15 @@ jest-diff@^26.0.0, jest-diff@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-diff@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" - integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== +jest-diff@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.1.tgz#9a6dc715037e1fa7a8a44554e7d272088c4029bd" + integrity sha512-uazdl2g331iY56CEyfbNA0Ut7Mn2ulAG5vUaEHXycf1L6IPyuImIxSz4F0VYBKi7LYIuxOwTZzK3wh5jHzASMw== dependencies: chalk "^4.0.0" diff-sequences "^29.3.1" jest-get-type "^29.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" jest-docblock@^26.0.0: version "26.0.0" @@ -8619,15 +8767,15 @@ jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-matcher-utils@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" - integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== +jest-matcher-utils@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.1.tgz#73d834e305909c3b43285fbc76f78bf0ad7e1954" + integrity sha512-k5h0u8V4nAEy6lSACepxL/rw78FLDkBnXhZVgFneVpnJONhb2DhZj/Gv4eNe+1XqQ5IhgUcqj745UwH0HJmMnA== dependencies: chalk "^4.0.0" - jest-diff "^29.3.1" + jest-diff "^29.4.1" jest-get-type "^29.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" jest-message-util@^26.6.0, jest-message-util@^26.6.2: version "26.6.2" @@ -8644,18 +8792,18 @@ jest-message-util@^26.6.0, jest-message-util@^26.6.2: slash "^3.0.0" stack-utils "^2.0.2" -jest-message-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" - integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== +jest-message-util@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.1.tgz#522623aa1df9a36ebfdffb06495c7d9d19e8a845" + integrity sha512-H4/I0cXUaLeCw6FM+i4AwCnOwHRgitdaUFOdm49022YD5nfyr8C/DrbXOBEyJaj+w/y0gGJ57klssOaUiLLQGQ== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.4.1" slash "^3.0.0" stack-utils "^2.0.3" @@ -8815,12 +8963,12 @@ jest-util@^26.6.0, jest-util@^26.6.2: is-ci "^2.0.0" micromatch "^4.0.2" -jest-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" - integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== +jest-util@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.1.tgz#2eeed98ff4563b441b5a656ed1a786e3abc3e4c4" + integrity sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -8900,6 +9048,11 @@ jest@26.6.0: import-local "^3.0.2" jest-cli "^26.6.0" +js-base64@^2.1.8: + version "2.6.4" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + js-sha256@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" @@ -9046,7 +9199,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.1: +json5@^2.1.2, json5@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -9082,7 +9235,7 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== @@ -9148,21 +9301,21 @@ kleur@^3.0.3: integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== klona@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== -language-subtag-registry@^0.3.20: +language-subtag-registry@~0.3.2: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== -language-tags@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.7.tgz#41cc248730f3f12a452c2e2efe32bc0bbce67967" - integrity sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw== +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== dependencies: - language-subtag-registry "^0.3.20" + language-subtag-registry "~0.3.2" last-call-webpack-plugin@^3.0.0: version "3.0.0" @@ -9248,6 +9401,17 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -9340,7 +9504,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0: +"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9357,6 +9521,14 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ== + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -9364,6 +9536,14 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -9427,6 +9607,11 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -9493,6 +9678,22 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" +meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA== + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -9663,15 +9864,7 @@ minimatch@~3.0.2: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6, minimist@~1.2.6: +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== @@ -9705,11 +9898,9 @@ minipass@^3.0.0, minipass@^3.1.1: yallist "^4.0.0" minipass@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.0.tgz#7cebb0f9fa7d56f0c5b17853cbe28838a8dbbd3b" - integrity sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw== - dependencies: - yallist "^4.0.0" + version "4.0.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.2.tgz#26fc3364d5ea6cb971c6e5259eac67a0887510d1" + integrity sha512-4Hbzei7ZyBp+1aw0874YWpKOubZd/jc53/XU+gkYry1QV+VvrbO8icLM5CUtm4F0hyXn85DXYKEMIS26gitD3A== minizlib@^2.1.1: version "2.1.2" @@ -9743,7 +9934,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.6, mkdirp@~0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.6, mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -9811,7 +10002,7 @@ multimatch@^4.0.0: arrify "^2.0.1" minimatch "^3.0.4" -nan@^2.12.1, nan@^2.13.2, nan@^2.14.0, nan@^2.2.1: +nan@^2.12.1, nan@^2.13.2: version "2.17.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== @@ -9883,22 +10074,47 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-fetch@2.6.7, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" +node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + node-forge@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== node-gyp-build@^4.2.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" - integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== + version "4.6.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" node-int64@^0.4.0: version "0.4.0" @@ -9951,12 +10167,42 @@ node-releases@^1.1.61: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== -node-releases@^2.0.6: - version "2.0.8" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" - integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== - -normalize-package-data@^2.5.0: +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +node-sass@^4.14.1: + version "4.14.1" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" + integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.15" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "2.2.5" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -10012,6 +10258,16 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -10031,6 +10287,11 @@ num2fraction@^1.2.2: resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" @@ -10064,9 +10325,9 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-is@^1.0.1, object-is@^1.1.5: version "1.1.5" @@ -10146,7 +10407,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.5, object.values@^1.1.6: +object.values@^1.1.0, object.values@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== @@ -10246,6 +10507,24 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +osenv@0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" @@ -10353,6 +10632,13 @@ parse-headers@^2.0.0: resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== + dependencies: + error-ex "^1.2.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -10404,6 +10690,13 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== + dependencies: + pinkie-promise "^2.0.0" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -10451,6 +10744,15 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -11229,9 +11531,9 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po source-map "^0.6.1" postcss@^8.1.0: - version "8.4.20" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56" - integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== + version "8.4.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" @@ -11275,9 +11577,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.1.2: - version "2.8.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" - integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== + version "2.8.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632" + integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw== pretty-bytes@^5.3.0: version "5.6.0" @@ -11302,12 +11604,12 @@ pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" - integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== +pretty-format@^29.0.0, pretty-format@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.1.tgz#0da99b532559097b8254298da7c75a0785b1751c" + integrity sha512-dt/Z761JUVsrIKaY215o1xQJBGlSmTx/h4cSqXqjHLnU1+Kt+mavVE7UgqJJO5ukx5HjSswHfmXz4LjS2oIJfg== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.0" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -11404,6 +11706,11 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + psl@^1.1.28, psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -11457,9 +11764,9 @@ punycode@^1.2.4: integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== q@^1.1.2: version "1.5.1" @@ -11848,6 +12155,14 @@ react@^18.0.0: dependencies: loose-envify "^1.1.0" +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -11857,6 +12172,15 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -11867,7 +12191,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -11932,6 +12256,14 @@ recursive-readdir@2.2.2: dependencies: minimatch "3.0.4" +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g== + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -11962,15 +12294,6 @@ regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.7: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" @@ -12005,15 +12328,6 @@ regexpp@^3.1.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ== - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - regexpu-core@^5.2.1: version "5.2.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" @@ -12026,11 +12340,6 @@ regexpu-core@^5.2.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g== - regjsgen@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" @@ -12074,7 +12383,14 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== -request@^2.85.0: +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== + dependencies: + is-finite "^1.0.0" + +request@^2.85.0, request@^2.87.0, request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -12183,7 +12499,7 @@ resolve@1.18.1: is-core-module "^2.0.0" path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.3.2: +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.3.2: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -12192,7 +12508,7 @@ resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.1 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.3: +resolve@^2.0.0-next.4: version "2.0.0-next.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== @@ -12244,6 +12560,13 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg== +rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -12251,13 +12574,6 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.5.4, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -12404,6 +12720,16 @@ sanitize.css@^10.0.0: resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== +sass-graph@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" + integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^13.3.2" + sass-loader@8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" @@ -12426,10 +12752,10 @@ sass-loader@^10.0.4: schema-utils "^3.0.0" semver "^7.3.2" -sass@^1.27.0: - version "1.57.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5" - integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw== +sass@^1.57.1: + version "1.58.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.0.tgz#ee8aea3ad5ea5c485c26b3096e2df6087d0bb1cc" + integrity sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -12494,6 +12820,14 @@ scrypt-js@3.0.1, scrypt-js@^3.0.0: resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q== + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + secp256k1@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" @@ -12542,6 +12876,11 @@ semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: dependencies: lru-cache "^6.0.0" +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw== + semver@~5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -12603,7 +12942,7 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" -set-blocking@^2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== @@ -12843,6 +13182,13 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A== + dependencies: + amdefine ">=0.0.4" + source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -12988,6 +13334,20 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + dependencies: + readable-stream "^2.0.1" + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -13051,6 +13411,24 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -13074,15 +13452,6 @@ string.prototype.matchall@^4.0.8: regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" -string.prototype.trim@~1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - string.prototype.trimend@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" @@ -13136,7 +13505,7 @@ strip-ansi@6.0.0: dependencies: ansi-regex "^5.0.0" -strip-ansi@^3.0.1: +strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== @@ -13157,6 +13526,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== + dependencies: + is-utf8 "^0.2.0" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -13192,6 +13568,13 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA== + dependencies: + get-stdin "^4.0.1" + strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -13237,6 +13620,11 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -13338,6 +13726,15 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + tar@^6.0.2: version "6.1.13" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" @@ -13412,9 +13809,9 @@ terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.3.4: - version "5.16.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" - integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== + version "5.16.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.3.tgz#3266017a9b682edfe019b8ecddd2abaae7b39c6b" + integrity sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -13567,6 +13964,18 @@ treeify@^1.1.0: resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw== + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + dependencies: + glob "^7.1.2" + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" @@ -13611,9 +14020,9 @@ tslib@1.14.1, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" @@ -13701,6 +14110,15 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typedarray-to-buffer@3.1.5, 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" @@ -13840,7 +14258,7 @@ upath@^1.1.1, upath@^1.1.2, upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.9: +update-browserslist-db@^1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== @@ -14114,9 +14532,9 @@ web3-provider-engine@16.0.1: xtend "^4.0.1" web3-utils@^1.3.4: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.1.tgz#f2f7ca7eb65e6feb9f3d61056d0de6bbd57125ff" - integrity sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ== + version "1.8.2" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.2.tgz#c32dec5e9b955acbab220eefd7715bc540b75cc9" + integrity sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA== dependencies: bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" @@ -14127,9 +14545,9 @@ web3-utils@^1.3.4: utf8 "3.0.0" web3modal@^1.9.8: - version "1.9.11" - resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.11.tgz#6a2c3c66f2e183c21446a441a217f996b38a82b6" - integrity sha512-fJ8HAHKxS05DlyZIV1oFbA7cT+E2/keyN1E4Yuhb023qGQIXlnht2DtTH978DERYnAnX28wZchwnwpSUnTTmhg== + version "1.9.12" + resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.12.tgz#cb000888fa422a96e3df552d4784e347ba35efcc" + integrity sha512-RiLY2tNOEUCobtsMTmhwl/FoHZGxRZz7SSdLsh6qbbybPNUO0rFPY8xam9SpPwlLd2cUDGiWkLgDUJde0sHxdw== dependencies: detect-browser "^5.1.0" prop-types "^15.7.2" @@ -14344,7 +14762,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== -which-typed-array@^1.1.8: +which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== @@ -14370,6 +14788,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +wide-align@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -14655,6 +15080,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" From 17939e41c2b3a1e175b49d4e34bf08b89058bc04 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 6 Feb 2023 17:43:18 -0600 Subject: [PATCH 236/278] fixed sometimes not loading prices on monitoring tool --- src/components/Summary/Balance.tsx | 6 ++++-- src/components/Summary/Indexes.tsx | 2 +- src/components/Vaults/monitoring/index.tsx | 13 +++++++------ src/components/Vaults/vault/index.tsx | 14 ++++++++------ src/hooks/usePrices.tsx | 12 ++++++++---- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/components/Summary/Balance.tsx b/src/components/Summary/Balance.tsx index 80633c2..e1c2f4c 100644 --- a/src/components/Summary/Balance.tsx +++ b/src/components/Summary/Balance.tsx @@ -10,7 +10,7 @@ import { BalancesType, OraclePricesType } from "../../hooks/types"; import { ethereumContext } from "../../state"; import { getPriceInUSDFromPair, isArbitrum, isInLayer1 } from "../../utils/utils"; import { NETWORKS, TOKENS_SYMBOLS } from "../../utils/constants"; -import { VaultsWarning } from "./warnings/index"; +// import { VaultsWarning } from "./warnings/index"; type props = { currentChainId: number; @@ -188,9 +188,11 @@ const Balance = ({ currentChainId, ethCallProvider, signerAddress, balances, pri )}
+ {/*
-
+
+ */} )}
diff --git a/src/components/Summary/Indexes.tsx b/src/components/Summary/Indexes.tsx index 197a707..82f46f6 100644 --- a/src/components/Summary/Indexes.tsx +++ b/src/components/Summary/Indexes.tsx @@ -100,7 +100,7 @@ const Indexes = ({ currentChainId, ethCallProvider, balances, prices }: props) = value={marketCap} displayType="text" thousandSeparator - decimalScale={2} + decimalScale={0} prefix="$" /> diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index fc95d42..d2a9fe1 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -79,7 +79,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { const signer = useContext(signerContext); const vaults = useContext(vaultsContext); const hardVaults = useContext(hardVaultsContext); - const prices = usePrices(); + const [prices, loadingPrices] = usePrices(); const ratios = useRatios(); const vaultsOwnerFilter = [ { name: t("all-vaults"), value: "0" }, @@ -99,7 +99,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { const [currentStatus, setCurrentStatus] = useState("all"); const [vaultMode, setVaultMode] = useState("all"); const [currentMinRatio, setCurrentMinRatio] = useState("0%"); - const [currentMaxRatio, setCurrentMaxRatio] = useState("2500%"); + const [currentMaxRatio, setCurrentMaxRatio] = useState("5000%"); const [renderTable, setRenderTable] = useState(false); const ratioRangeDropdown = useRef(null); const minRatioInput = useRef(null); @@ -227,7 +227,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { return parseFloat(maxRatio); } } - return 3000; + return 5000; }; const calculateNetRewardUsd = async ( @@ -397,6 +397,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { if (!showAllVaults) { addVault = v.tokenSymbol === TOKENS_SYMBOLS.WETH || v.tokenSymbol === TOKENS_SYMBOLS.DAI; } + if (addVault && v.tokenSymbol !== TOKENS_SYMBOLS.WBTC) { let vaultUrl = ""; const symbol = v.tokenSymbol === TOKENS_SYMBOLS.WETH ? TOKENS_SYMBOLS.ETH : v.tokenSymbol; @@ -481,7 +482,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { () => { const load = async () => { if (signer && signer.signer) { - if (!vaultsUpdated) { + if (!vaultsUpdated && !loadingPrices) { const address = await signer.signer.getAddress(); setCurrentAddress(address); setOwnerAddress(currentOwnerFilter.value === "1" ? address : ""); @@ -496,7 +497,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { load(); }, // eslint-disable-next-line - [signer, prices.daiOraclePrice] + [signer, loadingPrices, prices.daiOraclePrice] ); const tokensSymbols = (): Array => { @@ -786,7 +787,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { type="number" placeholder="" className="neon-green" - defaultValue="2500" + defaultValue="5000" ref={maxRatioInput} />
diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 9495c96..6ac6f62 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -361,12 +361,15 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const refresh = async () => { try { + const updateAction = isApproved; await loadVault(); - if (activeAction === "add") { - setActiveAction("mint"); - } - if (activeAction === "burn") { - setActiveAction("remove"); + if (updateAction) { + if (activeAction === "add") { + setActiveAction("mint"); + } + if (activeAction === "burn") { + setActiveAction("remove"); + } } } catch (error) { console.log(error); @@ -1204,7 +1207,6 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ); const creatOrApprovee = async () => { - // currentCollateral?.mint(); if (currentVaultId === "0") { setBtnDisabled(true); try { diff --git a/src/hooks/usePrices.tsx b/src/hooks/usePrices.tsx index 9a58c0e..c9e1564 100644 --- a/src/hooks/usePrices.tsx +++ b/src/hooks/usePrices.tsx @@ -4,10 +4,11 @@ import { oraclesContext, networkContext, signerContext } from "../state/index"; import { isArbitrum, isInLayer1, isOptimism, isPolygon, validOracles } from "../utils/utils"; import { OraclePricesType } from "./types"; -export const usePrices = (): OraclePricesType => { +export const usePrices = (): [OraclePricesType, boolean] => { const currentNetwork = useContext(networkContext); const oracles = useContext(oraclesContext); const signer = useContext(signerContext); + const [loadingPrices, setLoadingPrices] = useState(true); const [oraclePrices, setOraclePrices] = useState({ jpegzOraclePrice: "0", jpegzMarketCap: "0", @@ -129,16 +130,19 @@ export const usePrices = (): OraclePricesType => { wbtcOraclePrice: ethers.utils.formatEther(wbtcOraclePrice.mul(10000000000)), usdcOraclePrice: ethers.utils.formatEther(usdcOraclePrice.mul(10000000000)), }); + setLoadingPrices(false); } }; useEffect( () => { - loadPrices(); + if (signer.ethcallProvider) { + loadPrices(); + } }, // eslint-disable-next-line - [] + [signer.ethcallProvider] ); - return oraclePrices; + return [oraclePrices, loadingPrices]; }; From 99ca7207d2626a79db0cdbd9b7e2305e60c57085 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 6 Feb 2023 17:53:38 -0600 Subject: [PATCH 237/278] vault container width --- src/styles/vault.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/vault.scss b/src/styles/vault.scss index 99ef4cf..a0976c9 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -31,7 +31,7 @@ display: flex; flex-direction: column; margin-top: 4rem; - width: 40%; + width: 38%; background-color: $darker; } From 4c40e58aecadfc08fb52da564186d8df4c86ad87 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 6 Feb 2023 18:48:44 -0600 Subject: [PATCH 238/278] fixed minted USD value on vault --- src/components/Vaults/vault/index.tsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 6ac6f62..7e1900f 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -236,7 +236,13 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { currentIndexPriceCall, currentCollateralPriceCall, ]); - currentIndexPrice = ethers.utils.formatEther(currentIndexPriceVal); + + if (!isArbitrum(currentNetwork.chainId)) { + currentIndexPrice = ethers.utils.formatEther(currentIndexPriceVal); + } else { + currentIndexPrice = ethers.utils.formatEther(currentIndexPriceVal.mul(10)); + } + currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); iBalance = ethers.utils.formatUnits(currentIndexBalance, 18); @@ -291,7 +297,13 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { currentIndexPriceCall, ]); currentCollateralPrice = ethers.utils.formatEther(currentCollateralPriceVal.mul(10000000000)); - currentIndexPrice = ethers.utils.formatEther(currentIndexPriceVal); + + if (!isArbitrum(currentNetwork.chainId)) { + currentIndexPrice = ethers.utils.formatEther(currentIndexPriceVal); + } else { + currentIndexPrice = ethers.utils.formatEther(currentIndexPriceVal.mul(10)); + } + iBalance = ethers.utils.formatUnits(currentIndexBalance, 18); setIndexBalance(iBalance); From 2fb1d1df5628620a6fab945ecb869ff4766bbcc0 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 6 Feb 2023 22:12:13 -0600 Subject: [PATCH 239/278] fixed total supply bug when wallet not connected --- src/components/SewageFruitz/Sewagefruitz.tsx | 38 ++++++++++---------- src/components/Summary/Summary.tsx | 3 +- src/components/Vaults/vault/index.tsx | 10 ++++-- src/hooks/useBalances.tsx | 28 +++++++++++++++ src/hooks/useVault.tsx | 2 ++ src/styles/sewagefruit.scss | 11 ++++++ 6 files changed, 69 insertions(+), 23 deletions(-) diff --git a/src/components/SewageFruitz/Sewagefruitz.tsx b/src/components/SewageFruitz/Sewagefruitz.tsx index cf6215e..04b3104 100644 --- a/src/components/SewageFruitz/Sewagefruitz.tsx +++ b/src/components/SewageFruitz/Sewagefruitz.tsx @@ -39,7 +39,6 @@ const SewageFruitz = () => { const [minting, setMinting] = useState(false); const [loadingFruit, setLoadingFruit] = useState(false); const [merkleProof, setMerkleProof] = useState(); - const [mintPeriodEnd, setMintPeriodEnd] = useState(new Date()); const [publicMint, setPublicMint] = useState(false); const [maxSupplyReached, setMaxSupplyReached] = useState(false); const [userStatus, setUserStatus] = useState({ @@ -164,7 +163,6 @@ const SewageFruitz = () => { const today = new Date(); const endDateMS = mintPeriod.toNumber() * 1000; - setMintPeriodEnd(new Date(endDateMS)); setPublicMint(today.getTime() > endDateMS); setMaxSupplyReached(currentTokenId.toNumber() + 1 > maxSupply.toNumber()); @@ -329,34 +327,36 @@ const SewageFruitz = () => {

Sewage Fruitz are a collection of 2,500 upgradable NFTs created from the depths of the - Ethereum Blockchain and are a reward to all members of the Cryptex Finance community. - A fungus, grown out of dark substances in the yard of Mushroom Man as he spreads his - spores worldwide. + Ethereum Blockchain and were a reward to all members of the Cryptex Finance community.

+

- Holding a Sewage Fruitz PFP unlocks user ability to go on quests within the Cryptex - Finance ecosystem, completing tasks that will be unlocked inside the DAO. Sewage - Fruitz holders can earn upgrades, badges and burn them in the future based on their - achievements to earn CTX, Cryptex Finance protocol governance token available - worldwide on Coinbase, Gemini, Huobi and many others. + Keep an eye out for upcoming quests within the Cryptex Finance ecosystem. By going on + quests, Sewage Fruitz holders can earn upgrades, badges and burn them in the future + based on their achievements to earn CTX.

+

- Read more in our most recent blog post:{" "} + Read more in the announcement blog post:{" "} - Introducing Sewage Fruitz + https://cryptex.finance/blog/2022-10-22-introducing-sewage-fruitz/ + +

+

+ Check out the collection: + + https://opensea.io/collection/sewage-fruitz

-
- {signerAddress === "" && ( -

- Connect your wallet to see if you are eligible to mint a Sewage Fruit. If you aren’t - eligible, public mint will be available on {mintPeriodEnd.toLocaleDateString()}. -

- )}
diff --git a/src/components/Summary/Summary.tsx b/src/components/Summary/Summary.tsx index 616e5a9..60ab92b 100644 --- a/src/components/Summary/Summary.tsx +++ b/src/components/Summary/Summary.tsx @@ -83,7 +83,8 @@ const Summary = ({ signerAddress, signerChainId }: props) => { const ops = [...options]; if (c) { - ops[1].name = indexName.concat(" Summary"); + const indName = isArbitrum(c.id) ? TOKENS_SYMBOLS.JPEGz : TOKENS_SYMBOLS.TCAP; + ops[1].name = indName.concat(" Summary"); } if (currentOption.id === "1") { const cOpt = currentOption; diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 7e1900f..11ff890 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -172,6 +172,9 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { let currentVaultData: any; // @ts-ignore const vaultID = await currentVault.userToVault(currentAddress); + console.log("vaultID: ", vaultID.toString()); + console.log("vaultData: ", vaultData.collateralSymbol); + console.log("currentVault: ", currentVault?.address); setCurrentVaultId(vaultID.toString()); if (vaultID.toString() !== "0") { // @ts-ignore @@ -320,11 +323,12 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setTokenBalanceDecimals(2); } setCollateralBalance(currentBalance); - setIsLoading(false); + const iUsdBalance = toUSD(currentIndexPrice, iBalance); const cUsdBalance = toUSD(currentCollateralPrice, currentBalance); setIndexBalanceUSD(iUsdBalance.toString()); setCollateralBalanceUSD(cUsdBalance.toString()); + setIsLoading(false); } useEffect( @@ -343,7 +347,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { load(); }, // eslint-disable-next-line - [currentAddress, currentVault, refreshVault] + [currentAddress, currentVault?.address, refreshVault] ); const assetPrice = async () => { @@ -1418,7 +1422,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { )}
- {isLoading ? ( + {isLoading || loadingVault ? ( ) : (
diff --git a/src/hooks/useBalances.tsx b/src/hooks/useBalances.tsx index d36f354..f4634b9 100644 --- a/src/hooks/useBalances.tsx +++ b/src/hooks/useBalances.tsx @@ -95,11 +95,39 @@ export const useBalances = ( setLoadingBalances(false); }; + const loadIndexSupply = async () => { + if (ethcallProvider) { + let indexTokenRead = ethereumContracts.tcapTokenRead; + if (isArbitrum(chainId)) { + indexTokenRead = arbitrumContracts.jpegzTokenRead; + } + if (isOptimism(chainId)) { + indexTokenRead = optimismContracts.tcapTokenRead; + } + + if (indexTokenRead) { + const indexSupplyCall = await indexTokenRead?.totalSupply(); + // @ts-ignore + const [indexSupply] = await ethcallProvider?.all([indexSupplyCall]); + const indexSupplyVal = ethers.utils.formatEther(indexSupply); + + setBalances({ + tcapBalance: "0", + jpegzBalance: "0", + ctxBalance: "0", + tcapSupplly: !isArbitrum(chainId) ? indexSupplyVal : "0", + jpegzSupplly: isArbitrum(chainId) ? indexSupplyVal : "0", + }); + } + } + }; + useEffect( () => { if (ethcallProvider && address !== "") { loadBalance(); } else { + loadIndexSupply(); setLoadingBalances(false); } }, diff --git a/src/hooks/useVault.tsx b/src/hooks/useVault.tsx index 591f3ef..8e012bf 100644 --- a/src/hooks/useVault.tsx +++ b/src/hooks/useVault.tsx @@ -167,6 +167,8 @@ export const useVault = ( validVaults(currentNetwork.chainId || NETWORKS.mainnet.chainId, vaults) && validHardVaults(currentNetwork.chainId || NETWORKS.mainnet.chainId, hardVaults) ) { + console.log("loadingVault: ", loadingVault); + setLoadingVault(true); await loadContracts(); setLoadingVault(false); } diff --git a/src/styles/sewagefruit.scss b/src/styles/sewagefruit.scss index 2216a0a..39e614a 100644 --- a/src/styles/sewagefruit.scss +++ b/src/styles/sewagefruit.scss @@ -57,6 +57,15 @@ } } + .info { + a { + margin-left: 10px; + } + .link-blog { + margin-left: 0px; + } + } + .mint { background-color: rgba(33, 33, 56, 0.7); p { @@ -66,6 +75,8 @@ display: flex; justify-content: center; align-items: center; + + } } From 4ed7a8aa94438754dfb9b99d02c8e17d9a944276 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 6 Feb 2023 23:06:11 -0600 Subject: [PATCH 240/278] fixing desing on small screen --- src/components/Vaults/vault/index.tsx | 69 +++++++++++++-------------- src/hooks/useVault.tsx | 1 - src/styles/vault.scss | 16 ++++--- src/utils/utils.tsx | 4 -- 4 files changed, 43 insertions(+), 47 deletions(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 11ff890..6e87a6e 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -172,9 +172,6 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { let currentVaultData: any; // @ts-ignore const vaultID = await currentVault.userToVault(currentAddress); - console.log("vaultID: ", vaultID.toString()); - console.log("vaultData: ", vaultData.collateralSymbol); - console.log("currentVault: ", currentVault?.address); setCurrentVaultId(vaultID.toString()); if (vaultID.toString() !== "0") { // @ts-ignore @@ -919,6 +916,16 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const AddCollateral = () => ( + + + { <>{t("add")} + + ); + + const RemoveCollateral = () => ( + - - ); - - const RemoveCollateral = () => ( - { <>{t("remove")} - - - ); @@ -1009,6 +1006,16 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const MintAsset = () => ( + + + { <>{t("mint")} + {BurnFeeLabel("burn-fee2", false)} + + ); + + const BurnAsset = () => ( + - {BurnFeeLabel("burn-fee2", false)} - - ); - - const BurnAsset = () => ( - { <>{t("burn")} - - - {BurnFeeLabel("burn-fee2", true)} ); diff --git a/src/hooks/useVault.tsx b/src/hooks/useVault.tsx index 8e012bf..bad8d09 100644 --- a/src/hooks/useVault.tsx +++ b/src/hooks/useVault.tsx @@ -167,7 +167,6 @@ export const useVault = ( validVaults(currentNetwork.chainId || NETWORKS.mainnet.chainId, vaults) && validHardVaults(currentNetwork.chainId || NETWORKS.mainnet.chainId, hardVaults) ) { - console.log("loadingVault: ", loadingVault); setLoadingVault(true); await loadContracts(); setLoadingVault(false); diff --git a/src/styles/vault.scss b/src/styles/vault.scss index a0976c9..1bb822a 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -82,8 +82,9 @@ position: absolute; text-align: left; font-size: .9rem; - margin-top: -1.7rem; + margin-top: 2.4rem; padding-left: 1rem; + z-index: 1; } .form-group { @@ -609,12 +610,18 @@ } } - @media (max-width: 1400px) { + @media (max-width: 1500px) { .vault-container { width: 43%; } } + @media (max-width: 1400px) { + .vault-container { + width: 51%; + } + } + @media (max-width: 1200px) { .vault-container { width: 55%; @@ -708,10 +715,7 @@ width: 6.2rem; font-size: 0.9rem; } - } - .text-muted { - position: relative; - } + } } } } diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index 04d1f86..1047fd3 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -19,7 +19,6 @@ export const makeShortAddress = (address: string) => { export const isUndefined = (value: any): boolean => typeof value === "undefined"; export const getENS = async (address: string) => { - console.log(" getENS ---"); const provider = ethers.getDefaultProvider(NETWORKS.mainnet.name, { infura: process.env.REACT_APP_INFURA_ID, alchemy: process.env.REACT_APP_ALCHEMY_KEY, @@ -32,7 +31,6 @@ export const getENS = async (address: string) => { }; export const getAddressFromENS = async (ens: string) => { - console.log(" ENS ---"); const provider = ethers.getDefaultProvider(); const address = await provider.resolveName(ens); if (address) { @@ -42,13 +40,11 @@ export const getAddressFromENS = async (ens: string) => { }; export const getENSAvatar = async (resolver: ethers.providers.Resolver) => { - console.log(" ENS Avatar ---"); const avatar = await resolver.getText("avatar"); return avatar; }; export const isValidAddress = async (address: string) => { - console.log(" isValidAddress ---"); try { const currentAddress = ethers.utils.getAddress(address); return currentAddress; From 09fec2d54dac1808cee2f0563715cb288b627e6a Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 7 Feb 2023 11:08:04 -0600 Subject: [PATCH 241/278] fixed jpegx name --- public/images/jpez-green.png | Bin 0 -> 953618 bytes public/index.html | 10 +++++----- public/locales/en/translation.json | 1 + src/components/Summary/Indexes.tsx | 2 +- src/styles/vault.scss | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) create mode 100644 public/images/jpez-green.png diff --git a/public/images/jpez-green.png b/public/images/jpez-green.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a1a08903426230b676c92aee9d8865453ae24b GIT binary patch literal 953618 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

iK;U^i{xuUUh+5=PlZ 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 z

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�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�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�aB}tp1)+b)bhA4*8 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 + content="Building innovative, open-source index tokens that empower the crypto and NFT community." /> - + content="Building innovative, open-source index tokens that empower the crypto and NFT community." /> + - + content="Building innovative, open-source index tokens that empower the crypto and NFT community." /> + diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index bfa4a76..2786969 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -60,6 +60,7 @@ "warning": "This project is in beta. Use at your own risk.", "welcome": { "tcap": "Total Cryptocurrency Market Capitalization", + "jpegz": "Total NFT Market Cap.", "tcap-token": "Total Cryptocurrency Market Capitalization Token", "tcap-info": "Total Crypto Market Capitalization is updated on-chain on every 1% movement", "title1": "My Total Balance", diff --git a/src/components/Summary/Indexes.tsx b/src/components/Summary/Indexes.tsx index 82f46f6..b701df4 100644 --- a/src/components/Summary/Indexes.tsx +++ b/src/components/Summary/Indexes.tsx @@ -93,7 +93,7 @@ const Indexes = ({ currentChainId, ethCallProvider, balances, prices }: props) =

- <>{t("welcome.tcap")} + {!isArbitrum(currentChainId) ? <>{t("welcome.tcap")} : <>{t("welcome.jpegz")}}
Date: Tue, 7 Feb 2023 11:55:22 -0600 Subject: [PATCH 242/278] upated meta image --- public/images/{jpez-green.png => jpegz-green.png} | Bin public/index.html | 2 +- src/styles/vault.scss | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename public/images/{jpez-green.png => jpegz-green.png} (100%) diff --git a/public/images/jpez-green.png b/public/images/jpegz-green.png similarity index 100% rename from public/images/jpez-green.png rename to public/images/jpegz-green.png diff --git a/public/index.html b/public/index.html index 1de5085..fba173c 100644 --- a/public/index.html +++ b/public/index.html @@ -20,7 +20,7 @@ - + diff --git a/src/styles/vault.scss b/src/styles/vault.scss index 845ddb8..fbd40c6 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -82,7 +82,7 @@ position: absolute; text-align: left; font-size: .9rem; - margin-top: 37px; + margin-top: 2.4rem; // 37px padding-left: 1rem; z-index: 1; } From 1f1a1ec77d36918bbccdb0d301b837e9c92e8ac6 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 7 Feb 2023 13:03:28 -0600 Subject: [PATCH 243/278] fixing display of usd amount on minting --- src/components/Vaults/vault/index.tsx | 80 +++++++++++++-------------- src/styles/vault.scss | 31 +++++++---- src/utils/utils.tsx | 1 - 3 files changed, 61 insertions(+), 51 deletions(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 6e87a6e..eb4e5b9 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -916,16 +916,6 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const AddCollateral = () => ( - - - { onFocus={onFocusAddCollateral} onBlur={onBlurAddCollateral} /> + + + @@ -945,17 +945,17 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const RemoveCollateral = () => ( - - - + + + { const MintAsset = () => ( - - - + + + { const BurnAsset = () => ( - - - + + + { } else if (chainId === NETWORKS.okovan.chainId) { provider = ethers.getDefaultProvider(process.env.REACT_APP_ALCHEMY_URL_OKOVAN); } else if (chainId === NETWORKS.optimism.chainId) { - // provider = ethers.getDefaultProvider(process.env.REACT_APP_ALCHEMY_URL_OPTIMISM); provider = ethers.getDefaultProvider(NETWORKS.optimism.infuraRpcUrl); } else { let alchemyKey; From 9a6dead83af821691ccc34456a46cfa314c936a8 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 8 Feb 2023 11:21:36 -0600 Subject: [PATCH 244/278] keepers page mobile version --- src/components/Governance/StakerStats.tsx | 195 +++++++++++++++------- src/components/Summary/Protocol.tsx | 5 +- src/hooks/usePrices2.tsx | 2 +- src/styles/app.scss | 39 ++++- src/styles/delegators.scss | 51 ++++++ src/styles/vault.scss | 7 - src/utils/utils.tsx | 5 +- 7 files changed, 226 insertions(+), 78 deletions(-) diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 918cb89..a04e2ba 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -1,8 +1,9 @@ import React, { useContext, useState, useEffect } from "react"; -import { Button } from "react-bootstrap"; +import { Accordion, Button } from "react-bootstrap"; import { ethers } from "ethers"; import Table from "react-bootstrap/esm/Table"; import NumberFormat from "react-number-format"; +import { useMediaQuery } from "react-responsive"; import { governanceContext, networkContext, signerContext } from "../../state"; import { errorNotification, isInLayer1, notifyUser } from "../../utils/utils"; @@ -17,6 +18,7 @@ type props = { }; const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: props) => { + const isMobile = useMediaQuery({ query: "(max-width: 850px)" }); const currentNetwork = useContext(networkContext); const signer = useContext(signerContext); const governance = useContext(governanceContext); @@ -101,68 +103,139 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro return "-"; }; + const StakedValue = () => ( + <> + + + ); + + const LastStakeDate = () => ( + <>{lastStakeDate != null ? lastStakeDate?.toLocaleDateString() : "-"} + ); + + const StakeReward = () => ( + + ); + + const ClaimButton = () => ( + + ); + + const RenderMobile = () => ( + + + +

{t("governance.stake-reward")}

+
+ +
+
{t("staked")}
+
+ +
+
+
+
+ {t("last")} {t("staked")} +
+
+
+ +
+
+
+
+
{t("governance.staked-reward")}
+
+ +
+
+
+
APR
+
+ {apy()} +
+
+
+
End Date
+
+
{periodEnds.toLocaleDateString()}
+
+
+ +
+
+
+ ); + return (
-

{t("governance.stake-reward")}

- - - - - - - - - - - - - - - - - - - - -
{t("staked")} - <> - {t("last")} {t("staked")} - - {t("governance.staked-reward")}APREnd Date -
- {" "} - CTX - {lastStakeDate != null ? lastStakeDate?.toLocaleDateString() : "-"} - {" "} - CTX - - {apy()} - {periodEnds.toLocaleDateString()} - -
+ {isMobile ? ( + + ) : ( + <> +

{t("governance.stake-reward")}

+ + + + + + + + + + + + + + + + + + + + +
{t("staked")} + <> + {t("last")} {t("staked")} + + {t("governance.staked-reward")}APREnd Date +
+ + + + + + + {apy()} + {periodEnds.toLocaleDateString()} + +
+ + )}
); }; diff --git a/src/components/Summary/Protocol.tsx b/src/components/Summary/Protocol.tsx index a9f1ebc..7cbd82d 100644 --- a/src/components/Summary/Protocol.tsx +++ b/src/components/Summary/Protocol.tsx @@ -44,7 +44,7 @@ const Protocol = ({ currentChainId, ethCallProvider, prices }: props) => { const [uniStake, setUNIStake] = useState("0"); const [wbtcStake, setWBTCStake] = useState("0"); const [usdcStake, setUSDCStake] = useState("0"); - const [TotalStake, setTotalStake] = useState("0"); + const [totalStake, setTotalStake] = useState("0"); const VAULTS_STATE = gql` { @@ -207,7 +207,6 @@ const Protocol = ({ currentChainId, ethCallProvider, prices }: props) => { toUSD(prices.wbtcOraclePrice, formatWBTC) + toUSD(prices.usdcOraclePrice, formatUSDC); setTotalStake(totalUSD.toString()); - // setTotalSupply(ethers.utils.formatEther(currentTotalSupply)); } }; @@ -249,7 +248,7 @@ const Protocol = ({ currentChainId, ethCallProvider, prices }: props) => {
{ }; export const getAddressFromENS = async (ens: string) => { - const provider = ethers.getDefaultProvider(); + const provider = ethers.getDefaultProvider(NETWORKS.mainnet.name, { + infura: process.env.REACT_APP_INFURA_ID, + alchemy: process.env.REACT_APP_ALCHEMY_KEY, + }); const address = await provider.resolveName(ens); if (address) { return address; From 415effe9069244605cd1de106a63e8ecc1940f66 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 8 Feb 2023 18:11:56 -0600 Subject: [PATCH 245/278] finished updating keepers mobile --- src/components/Governance/KeeperForm.tsx | 11 ++++-- src/styles/delegators.scss | 48 ++++++++++++++++++++++-- src/styles/modal.scss | 41 ++++++++++++-------- 3 files changed, 77 insertions(+), 23 deletions(-) diff --git a/src/components/Governance/KeeperForm.tsx b/src/components/Governance/KeeperForm.tsx index dba958a..7b0eb55 100644 --- a/src/components/Governance/KeeperForm.tsx +++ b/src/components/Governance/KeeperForm.tsx @@ -215,17 +215,20 @@ const KeeperForm = ({ const isImageValid = (value: File | null): boolean => { if (value === null) { if (isNew) { - setImageError(t("errors.empty")); + // setImageError(t("errors.empty")); + errorNotification(t("errors.empty")); } return !isNew; } if (value.type !== "image/png" && value.type !== "image/jpg" && value.type !== "image/jpeg") { - setImageError(t("errors.invalid-file-type")); + // setImageError(t("errors.invalid-file-type")); + errorNotification(t("errors.invalid-file-type")); return false; } const maxSize = 250000; if (value.size > maxSize) { - setImageError(t("errors.invalid-image-size", { size: Math.round(maxSize / 1000) })); + errorNotification(t("errors.invalid-image-size", { size: Math.round(maxSize / 1000) })); + // setImageError(t("errors.invalid-image-size", { size: Math.round(maxSize / 1000) })); setImageUrl(""); return false; } @@ -420,7 +423,7 @@ const KeeperForm = ({ /> {imageError} - + Date: Thu, 9 Feb 2023 16:33:04 -0600 Subject: [PATCH 246/278] added MAX range limit to range filter --- src/components/Vaults/monitoring/index.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index d2a9fe1..72f5e2e 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -71,6 +71,7 @@ type props = { }; const showAllVaults = true; +const MAX_RANGE_LIMIT = 100000000; const Monitoring = ({ setVaultToUpdate }: props) => { const { t } = useTranslation(); @@ -99,7 +100,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { const [currentStatus, setCurrentStatus] = useState("all"); const [vaultMode, setVaultMode] = useState("all"); const [currentMinRatio, setCurrentMinRatio] = useState("0%"); - const [currentMaxRatio, setCurrentMaxRatio] = useState("5000%"); + const [currentMaxRatio, setCurrentMaxRatio] = useState("MAX"); const [renderTable, setRenderTable] = useState(false); const ratioRangeDropdown = useRef(null); const minRatioInput = useRef(null); @@ -226,8 +227,9 @@ const Monitoring = ({ setVaultToUpdate }: props) => { if (isValidRatio(maxRatio)) { return parseFloat(maxRatio); } + return MAX_RANGE_LIMIT; } - return 5000; + return MAX_RANGE_LIMIT; }; const calculateNetRewardUsd = async ( @@ -773,7 +775,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => {
- +
{ type="number" placeholder="" className="neon-green" - defaultValue="5000" + defaultValue="" ref={maxRatioInput} />
From 080509fae8129c36badceba7125d9f54c6c38846 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 14 Feb 2023 11:45:00 -0600 Subject: [PATCH 247/278] disabled optimism --- src/components/Header.tsx | 6 +++--- src/utils/constants.tsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 36b5950..71182b3 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -272,16 +272,16 @@ const Header = ({ signerAddress, isMobile }: props) => {
<> {isInLayer1(currentNetwork.chainId) && EthereumToggle()} - {isOptimism(currentNetwork.chainId) && OptimismToggle()} - {isPolygon(currentNetwork.chainId) && PolygonToggle()} {isArbitrum(currentNetwork.chainId) && ArbitrumToggle()} + {FEATURES.OPTIMISM && isOptimism(currentNetwork.chainId) && OptimismToggle()} + {FEATURES.POLYGON && isPolygon(currentNetwork.chainId) && PolygonToggle()}
{EthereumOpt()} {ArbitrumOpt()} - {OptimismOpt()} + {FEATURES.OPTIMISM && OptimismOpt()} {FEATURES.POLYGON && PolygonOpt()} diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 0603478..14631af 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -114,7 +114,7 @@ export const OS_API_URL = { export const FEATURES = { KEEPERS_API: true, NEW_VAULTS: true, - OPTIMISM: true, + OPTIMISM: false, POLYGON: false, }; From 729da85f1a24af03cbb3d8e4b815a67afff90089 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 14 Feb 2023 22:18:37 -0600 Subject: [PATCH 248/278] fixing usd format when very little values are shown --- src/components/Summary/Summary.tsx | 2 - src/components/Vaults/monitoring/Vaults.tsx | 2 +- .../Vaults/monitoring/VaultsMobile.tsx | 18 +- src/components/Vaults/monitoring/index.tsx | 2 +- src/components/Vaults/vault/index.tsx | 438 ++++++++++-------- src/styles/vault.scss | 3 +- 6 files changed, 252 insertions(+), 213 deletions(-) diff --git a/src/components/Summary/Summary.tsx b/src/components/Summary/Summary.tsx index 60ab92b..e947e16 100644 --- a/src/components/Summary/Summary.tsx +++ b/src/components/Summary/Summary.tsx @@ -22,13 +22,11 @@ const Summary = ({ signerAddress, signerChainId }: props) => { let chains = [ { id: NETWORKS.mainnet.chainId, name: "Mainnet" }, { id: NETWORKS.arbitrum.chainId, name: "Arbitrum" }, - { id: NETWORKS.optimism.chainId, name: "Optimism" }, ]; if (process.env.REACT_APP_NETWORK_ID !== "1") { chains = [ { id: NETWORKS.goerli.chainId, name: "Goerli" }, { id: NETWORKS.arbitrum_goerli.chainId, name: "Arbitrum Goerli" }, - { id: NETWORKS.okovan.chainId, name: "OKovan" }, ]; } const [updatingChain, setUpdatingChain] = useState(false); diff --git a/src/components/Vaults/monitoring/Vaults.tsx b/src/components/Vaults/monitoring/Vaults.tsx index 61f7db8..f8c872a 100644 --- a/src/components/Vaults/monitoring/Vaults.tsx +++ b/src/components/Vaults/monitoring/Vaults.tsx @@ -332,7 +332,7 @@ export const Vaults = ({ } > - {v.ratio.toFixed(0)} + {v.ratio < 1000000 ? v.ratio.toFixed(0) : v.ratio.toExponential(1)} {v.ratio === 0 ? "" : "%"} diff --git a/src/components/Vaults/monitoring/VaultsMobile.tsx b/src/components/Vaults/monitoring/VaultsMobile.tsx index 54e4945..cc7f04a 100644 --- a/src/components/Vaults/monitoring/VaultsMobile.tsx +++ b/src/components/Vaults/monitoring/VaultsMobile.tsx @@ -146,13 +146,17 @@ export const VaultsMobile = ({
- + {v.ratio < 1000000 ? ( + + ) : ( + {v.ratio.toExponential(1)}% + )}
{capitalize(v.status)}
diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index 72f5e2e..02e39dd 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -71,7 +71,7 @@ type props = { }; const showAllVaults = true; -const MAX_RANGE_LIMIT = 100000000; +const MAX_RANGE_LIMIT = Number.MAX_VALUE; const Monitoring = ({ setVaultToUpdate }: props) => { const { t } = useTranslation(); diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index eb4e5b9..a7872c7 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -432,6 +432,15 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { } }; + const isValidTokenValue = (value: string): boolean => { + try { + ethers.utils.parseEther(value); + return true; + } catch (error) { + return false; + } + }; + // Mint, Burn fees const calculateMintFee = async (amount: string) => { const currentMintFee = await currentVault?.getMintFee(ethers.utils.parseEther(amount)); @@ -469,26 +478,28 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { }; const onChangeAddCollateral = async (event: React.ChangeEvent) => { - setAddCollateralTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentPrice, event.target.value); - if (!usd) { - usd = 0; + if (isValidTokenValue(event.target.value) || event.target.value === "") { + setAddCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); + const r = await getRatio( + newCollateral.toString(), + currentPrice, + vaultDebt, + currentAssetPrice + ); + changeVault(r); + setAddCollateralUSD(usd.toString()); + } else { + changeVault(0, false); + setAddCollateralUSD("0"); } - const newCollateral = parseFloat(event.target.value) + parseFloat(vaultCollateral); - const r = await getRatio( - newCollateral.toString(), - currentPrice, - vaultDebt, - currentAssetPrice - ); - changeVault(r); - setAddCollateralUSD(usd.toString()); - } else { - changeVault(0, false); - setAddCollateralUSD("0"); } }; @@ -505,26 +516,28 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { }; const onChangeRemoveCollateral = async (event: React.ChangeEvent) => { - setRemoveCollateralTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentPrice, event.target.value); - if (!usd) { - usd = 0; + if (isValidTokenValue(event.target.value) || event.target.value === "") { + setRemoveCollateralTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); + const r = await getRatio( + newCollateral.toString(), + currentPrice, + vaultDebt, + currentAssetPrice + ); + changeVault(r); + setRemoveCollateralUSD(usd.toString()); + } else { + changeVault(0, false); + setRemoveCollateralUSD("0"); } - const newCollateral = parseFloat(vaultCollateral) - parseFloat(event.target.value); - const r = await getRatio( - newCollateral.toString(), - currentPrice, - vaultDebt, - currentAssetPrice - ); - changeVault(r); - setRemoveCollateralUSD(usd.toString()); - } else { - changeVault(0, false); - setRemoveCollateralUSD("0"); } }; @@ -541,32 +554,34 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { }; const onChangeMint = async (event: React.ChangeEvent) => { - setMintTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentAssetPrice, event.target.value); - if (!usd) { - usd = 0; - } - const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); - const r = await getRatio( - vaultCollateral, - currentPrice, - newDebt.toString(), - currentAssetPrice - ); - changeVault(r); - setMintUSD(usd.toString()); + if (isValidTokenValue(event.target.value) || event.target.value === "") { + setMintTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentAssetPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(event.target.value) + parseFloat(vaultDebt); + const r = await getRatio( + vaultCollateral, + currentPrice, + newDebt.toString(), + currentAssetPrice + ); + changeVault(r); + setMintUSD(usd.toFixed(14)); - if (isArbitrum(currentNetwork.chainId)) { - const increasedFee = await calculateMintFee(event.target.value); - const ethFee = ethers.utils.formatEther(increasedFee); - setMintFee(ethFee.toString()); + if (isArbitrum(currentNetwork.chainId)) { + const increasedFee = await calculateMintFee(event.target.value); + const ethFee = ethers.utils.formatEther(increasedFee); + setMintFee(ethFee.toString()); + } + } else { + changeVault(0, false); + setMintUSD("0"); } - } else { - changeVault(0, false); - setMintUSD("0"); } }; @@ -583,38 +598,39 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { }; const onChangeBurn = async (event: React.ChangeEvent) => { - try { - setBurnTxt(event.target.value); - if (event.target.value !== "") { - const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); - const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); - let usd = toUSD(currentAssetPrice, event.target.value); - if (!usd) { - usd = 0; + if (isValidTokenValue(event.target.value) || event.target.value === "") { + try { + setBurnTxt(event.target.value); + if (event.target.value !== "") { + const currentPrice = ethers.utils.formatEther((await collateralPrice()).mul(10000000000)); + const currentAssetPrice = ethers.utils.formatEther(await assetPrice()); + let usd = toUSD(currentAssetPrice, event.target.value); + if (!usd) { + usd = 0; + } + const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); + const r = await getRatio( + vaultCollateral, + currentPrice, + newDebt.toString(), + currentAssetPrice + ); + changeVault(r); + setBurnUSD(usd.toString()); + + const increasedFee = await calculateBurnFee(event.target.value); + const ethFee = ethers.utils.formatEther(increasedFee); + setBurnFee(ethFee.toString()); + } else { + changeVault(0, false); + setBurnUSD("0"); + setBurnFee("0"); } - const newDebt = parseFloat(vaultDebt) - parseFloat(event.target.value); - const r = await getRatio( - vaultCollateral, - currentPrice, - newDebt.toString(), - currentAssetPrice - ); - changeVault(r); - setBurnUSD(usd.toString()); - - const increasedFee = await calculateBurnFee(event.target.value); - const ethFee = ethers.utils.formatEther(increasedFee); - setBurnFee(ethFee.toString()); - } else { - changeVault(0, false); + } catch (error) { + changeVault(0, true); setBurnUSD("0"); setBurnFee("0"); } - } catch (error) { - console.error(error); - changeVault(0, true); - setBurnUSD("0"); - setBurnFee("0"); } }; @@ -773,7 +789,6 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { } } catch (error) { console.error(error); - console.error("Code: ", error.code); if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); } else { @@ -914,9 +929,49 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ); - const AddCollateral = () => ( + const RenderUsdValue = (amount: string, maxDecimals = 6) => { + const numberAmount = parseFloat(amount); + let newAmount = amount; + let decimals = 2; + + if (numberAmount < 0.0001) { + decimals = maxDecimals; + newAmount = numberAmount.toFixed(decimals); + } else if (numberAmount < 0.01) { + decimals = 4; + } + if (numberAmount === 0) { + decimals = 2; + newAmount = numberAmount.toFixed(decimals); + } + + return ( + + ${numberAmount.toFixed(20)} + + } + > + + + ); + }; + + const RenderAddCollateral = () => ( + {RenderUsdValue(addCollateralUSD, 10)} { onFocus={onFocusAddCollateral} onBlur={onBlurAddCollateral} /> - - - @@ -943,19 +988,10 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ); - const RemoveCollateral = () => ( + const RenderRemoveCollateral = () => ( - - - + {RenderUsdValue(removeCollateralUSD, 12)} { ); - const MintAsset = () => ( + const RenderMintIndex = () => ( - - - + {RenderUsdValue(mintUSD, 16)} { ); - const BurnAsset = () => ( + const RenderBurnIndex = () => ( - - - + {RenderUsdValue(burnUSD, 18)} { const ActionControls = () => { if (activeAction === "add") { - return AddCollateral(); + return RenderAddCollateral(); } if (activeAction === "remove") { - return RemoveCollateral(); + return RenderRemoveCollateral(); } if (activeAction === "mint") { - return MintAsset(); + return RenderMintIndex(); } - return BurnAsset(); + return RenderBurnIndex(); }; const MaxButton = () => { @@ -1130,24 +1148,28 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ) : ( <> -
- - -
- + + ${parseFloat(aBalance).toFixed(18)} + + } + > +
+ + +
+
+ {RenderUsdValue(aBalanceUSD)} )} @@ -1163,24 +1185,28 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ) : ( <> -
- - -
- + + ${parseFloat(vaultCollateral).toFixed(18)} + + } + > +
+ + +
+
+ {RenderUsdValue(vaultCollateralUSD)} )} @@ -1195,24 +1221,28 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ) : ( <> -
- - -
- + + ${parseFloat(vaultDebt).toFixed(18)} + + } + > +
+ + +
+
+ {RenderUsdValue(vaultDebtUSD)} )} @@ -1450,14 +1480,20 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => {

- + {parseFloat(vaultRatio) <= 1000000 ? ( + + ) : ( + + {parseFloat(vaultRatio).toExponential(2)}% + + )}

- diff --git a/src/styles/vault.scss b/src/styles/vault.scss index b56f2f4..c94963f 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -89,7 +89,7 @@ background-color: #281e31; border: 1px solid $dark; border-radius: 5px; - + .text-muted { position: absolute; text-align: left; @@ -110,6 +110,7 @@ border-color: transparent; color: $white; height: 4.1rem; + z-index: 2; } .btn { From a2e5ad73bfc67f89993d01bfdad5859020c79aa3 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 15 Feb 2023 17:14:25 -0600 Subject: [PATCH 249/278] fixing display of usd balances --- src/components/Vaults/vault/index.tsx | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index a7872c7..439bca1 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -87,8 +87,10 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const [currentVaultId, setCurrentVaultId] = useState("0"); const [isApproved, setIsApproved] = useState(false); const [vaultDebt, setVaultDebt] = useState("0"); + const [vaultDebtRaw, setVaultDebtRaw] = useState(BigNumber.from("0")); const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); const [vaultCollateral, setVaultCollateral] = useState("0"); + const [vaultCollateralRaw, setVaultCollateralRaw] = useState(BigNumber.from("0")); const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); const [vaultRatio, setVaultRatio] = useState("0"); const [tempRatio, setTempRatio] = useState(""); @@ -198,6 +200,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { decimals = 6; } + setVaultDebtRaw(BigNumber.from("0")); if (currentVaultData) { const { collateral, debt } = currentVaultData; // @ts-ignore @@ -265,11 +268,13 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setVaultStatus("danger"); } + setVaultCollateralRaw(collateral); const parsedCollateral = ethers.utils.formatUnits(collateral, decimals); setVaultCollateral(parsedCollateral); const usdCollateral = toUSD(currentCollateralPrice, parsedCollateral); setVaultCollateralUSD(usdCollateral.toString()); + setVaultDebtRaw(debt); const parsedDebt = ethers.utils.formatEther(debt); setVaultDebt(parsedDebt); const usdIndex = toUSD(currentIndexPrice, parsedDebt); @@ -947,7 +952,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { return ( { const BurnFeeLabel = (className: string, isBurning: boolean) => ( { const RenderMintIndex = () => ( - {RenderUsdValue(mintUSD, 16)} + {RenderUsdValue(mintUSD, 18)} { ) : ( <> - ${parseFloat(aBalance).toFixed(18)} + {parseFloat(aBalance).toFixed(18)} } > @@ -1169,7 +1174,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { />
- {RenderUsdValue(aBalanceUSD)} + {RenderUsdValue(aBalanceUSD, 4)} )} @@ -1186,12 +1191,12 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ) : ( <> - ${parseFloat(vaultCollateral).toFixed(18)} + {ethers.utils.formatUnits(vaultCollateralRaw, selectedVaultDecimals)} } > @@ -1206,7 +1211,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { />
- {RenderUsdValue(vaultCollateralUSD)} + {RenderUsdValue(vaultCollateralUSD, 4)} )} @@ -1227,7 +1232,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { trigger={["hover", "click"]} overlay={ - ${parseFloat(vaultDebt).toFixed(18)} + {ethers.utils.formatEther(vaultDebtRaw, 18)} } > @@ -1242,7 +1247,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { />
- {RenderUsdValue(vaultDebtUSD)} + {RenderUsdValue(vaultDebtUSD, 4)} )} From 88c8e134ef44670c80fdab4d30621cdbb2120e53 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 15 Feb 2023 17:31:46 -0600 Subject: [PATCH 250/278] fixed typo --- src/components/Vaults/vault/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 439bca1..4185049 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -1232,7 +1232,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { trigger={["hover", "click"]} overlay={ - {ethers.utils.formatEther(vaultDebtRaw, 18)} + {ethers.utils.formatEther(vaultDebtRaw)} } > From 3825f1bddd7814b25d1681ded8f3b686faa0b93c Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 15 Feb 2023 18:19:48 -0600 Subject: [PATCH 251/278] added almost symbol --- src/components/Vaults/vault/index.tsx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 4185049..95fffb0 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -934,14 +934,17 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ); - const RenderUsdValue = (amount: string, maxDecimals = 6) => { + const RenderUsdValue = (amount: string, maxDecimals = 6, symbol = false) => { const numberAmount = parseFloat(amount); let newAmount = amount; let decimals = 2; - + let prefix = "$"; if (numberAmount < 0.0001) { decimals = maxDecimals; newAmount = numberAmount.toFixed(decimals); + if (symbol) { + prefix = "~$"; + } } else if (numberAmount < 0.01) { decimals = 4; } @@ -966,7 +969,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { value={newAmount} displayType="text" thousandSeparator - prefix="$" + prefix={prefix} decimalScale={decimals} /> @@ -1174,7 +1177,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { />
- {RenderUsdValue(aBalanceUSD, 4)} + {RenderUsdValue(aBalanceUSD, 4, true)} )} @@ -1211,7 +1214,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { />
- {RenderUsdValue(vaultCollateralUSD, 4)} + {RenderUsdValue(vaultCollateralUSD, 4, true)} )} @@ -1247,7 +1250,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { />
- {RenderUsdValue(vaultDebtUSD, 4)} + {RenderUsdValue(vaultDebtUSD, 4, true)} )} From cf3a5f27f17a579a5d23ec02fb853b2fca57eaf6 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 16 Feb 2023 10:43:15 -0600 Subject: [PATCH 252/278] adding symbol --- src/components/Vaults/vault/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 95fffb0..9b0fa06 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -1211,6 +1211,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { displayType="text" thousandSeparator decimalScale={tokenBalanceDecimals} + prefix={parseFloat(vaultCollateral) < 0.0001 ? "~" : ""} />
@@ -1247,6 +1248,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { displayType="text" thousandSeparator decimalScale={tokenBalanceDecimals} + prefix={parseFloat(vaultDebt) < 0.0001 ? "~" : ""} />
From fe13d84269548c9cb2dfe335b71153193b8f1fd7 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 16 Feb 2023 18:34:31 -0600 Subject: [PATCH 253/278] added message when vault debt is less than 0.0001 --- src/components/Vaults/monitoring/Vaults.tsx | 12 +-- src/components/Vaults/monitoring/index.tsx | 6 +- src/components/Vaults/vault/index.tsx | 87 ++++++++++++++++++++- src/styles/app.scss | 13 ++- src/styles/vault-monitoring.scss | 3 + src/styles/vault.scss | 19 ++++- src/utils/constants.tsx | 4 + 7 files changed, 129 insertions(+), 15 deletions(-) diff --git a/src/components/Vaults/monitoring/Vaults.tsx b/src/components/Vaults/monitoring/Vaults.tsx index f8c872a..692b551 100644 --- a/src/components/Vaults/monitoring/Vaults.tsx +++ b/src/components/Vaults/monitoring/Vaults.tsx @@ -275,14 +275,14 @@ export const Vaults = ({ {v.isHardVault && H Mode}
- + - {numberFormatStr(v.collateralValue, 4, 12)} + {v.collateralValue} } > @@ -297,15 +297,15 @@ export const Vaults = ({ ${numberFormatStr(v.collateralUsd, 2, 2)}
- +
- {numberFormatStr(v.debt, 4, 12)} + {v.debt} } > diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index 02e39dd..99f0e04 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -127,7 +127,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { ]; const buildFilters = () => { - const weiLimit = "100000000"; + const weiLimit = "0"; let filter = ""; let ownerFilter = ""; let vaultFilter = ""; @@ -339,9 +339,9 @@ const Monitoring = ({ setVaultToUpdate }: props) => { const ratio = getRatio2(collateralText, collateralPrice, debtText, indexPrice || "1"); let status = VAULT_STATUS.liquidation; - if (parseFloat(collateralText) < 0.0000000001) { + if (parseFloat(collateralText) === 0) { status = VAULT_STATUS.empty; - } else if (parseFloat(collateralText) >= 0.0000000001 && parseFloat(debtText) < 0.0000000001) { + } else if (parseFloat(collateralText) > 0 && parseFloat(debtText) <= 0) { status = VAULT_STATUS.ready; } else if (ratio >= minRatio) { status = VAULT_STATUS.active; diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 9b0fa06..f09e1f2 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -1,6 +1,7 @@ import React, { useContext, useState, useEffect } from "react"; import { ethers, BigNumber } from "ethers"; import { + Alert, Button, ButtonGroup, Dropdown, @@ -18,7 +19,7 @@ import "../../../styles/vault.scss"; import { useVault } from "../../../hooks"; import { networkContext, signerContext } from "../../../state"; import { capitalize, TokenIcon } from "../common"; -import { NETWORKS, TOKENS_SYMBOLS } from "../../../utils/constants"; +import { NETWORKS, TOKENS_SYMBOLS, BIG_NUMBER_ZERO } from "../../../utils/constants"; import { errorNotification, getDefaultProvider, @@ -87,10 +88,10 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const [currentVaultId, setCurrentVaultId] = useState("0"); const [isApproved, setIsApproved] = useState(false); const [vaultDebt, setVaultDebt] = useState("0"); - const [vaultDebtRaw, setVaultDebtRaw] = useState(BigNumber.from("0")); + const [vaultDebtRaw, setVaultDebtRaw] = useState(BIG_NUMBER_ZERO); const [vaultDebtUSD, setVaultDebtUSD] = useState("0"); const [vaultCollateral, setVaultCollateral] = useState("0"); - const [vaultCollateralRaw, setVaultCollateralRaw] = useState(BigNumber.from("0")); + const [vaultCollateralRaw, setVaultCollateralRaw] = useState(BIG_NUMBER_ZERO); const [vaultCollateralUSD, setVaultCollateralUSD] = useState("0"); const [vaultRatio, setVaultRatio] = useState("0"); const [tempRatio, setTempRatio] = useState(""); @@ -100,6 +101,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { // General Data const isHardMode = () => vaultMode === "hard"; const [indexBalance, setIndexBalance] = useState("0"); + const [indexBalanceRaw, setIndexBalanceRaw] = useState(BIG_NUMBER_ZERO); const [indexBalanceUSD, setIndexBalanceUSD] = useState("0"); const [collateralBalance, setCollateralBalance] = useState("0"); const [collateralBalanceUSD, setCollateralBalanceUSD] = useState("0"); @@ -200,7 +202,8 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { decimals = 6; } - setVaultDebtRaw(BigNumber.from("0")); + setVaultDebtRaw(BIG_NUMBER_ZERO); + setIndexBalanceRaw(BIG_NUMBER_ZERO); if (currentVaultData) { const { collateral, debt } = currentVaultData; // @ts-ignore @@ -250,6 +253,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { iBalance = ethers.utils.formatUnits(currentIndexBalance, 18); setIndexBalance(iBalance); + setIndexBalanceRaw(currentIndexBalance); if (!allowance.isZero() || vaultData.collateralSymbol === TOKENS_SYMBOLS.ETH) { const safeValue = isHardMode() ? 20 : 50; @@ -311,6 +315,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { iBalance = ethers.utils.formatUnits(currentIndexBalance, 18); setIndexBalance(iBalance); + setIndexBalanceRaw(currentIndexBalance); setText(t("vault.create-text", { asset: "Index" })); setTitle(t("vault.create")); @@ -1385,6 +1390,76 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => {
); + const DebtWarning = () => ( + +

+ Vault still has a + + Debt: {ethers.utils.formatEther(vaultDebtRaw)} {vaultInitData.assetSymbol} + + } + > + + Small Debt + + + + but your + + Wallet Balance: {ethers.utils.formatEther(indexBalanceRaw)}{" "} + {vaultInitData.assetSymbol} + + } + > + + Wallet Balance + + + + is less than the debt. +

+
+ ); + + const DebtWarning2 = () => ( + +

+ Vault still has a + + Debt: {ethers.utils.formatEther(vaultDebtRaw)} {vaultInitData.assetSymbol} + + } + > + + Small Debt. + + + +

+
+ ); + return (
@@ -1467,6 +1542,10 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ) : ( <> + {vaultDebtRaw.lte(BigNumber.from("1000")) && + indexBalanceRaw.lt(vaultDebtRaw) && } + {vaultDebtRaw.lte(BigNumber.from("1000")) && + !indexBalanceRaw.lt(vaultDebtRaw) && }
diff --git a/src/styles/app.scss b/src/styles/app.scss index f2b013a..5e5db3e 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -67,6 +67,12 @@ body { margin-top: 2rem; padding-right: 1.5rem; + &-warning { + background-color: #f280400d; + box-shadow: 0px 0px 25px -6px rgba(242, 128, 64, 0.4); + border-color: $orange; + } + .btn-close { height: 15px; width: 15px; @@ -75,7 +81,12 @@ body { background-size: cover; background-repeat: no-repeat; border: none; - } + } +} + +.alert-inside { + width: 100% !important; + height: auto !important; } .badge.bg-light { diff --git a/src/styles/vault-monitoring.scss b/src/styles/vault-monitoring.scss index c447dd0..c4f74fc 100644 --- a/src/styles/vault-monitoring.scss +++ b/src/styles/vault-monitoring.scss @@ -284,6 +284,9 @@ span { td.go-to-vault { text-align: center; } + .has-tooltip { + cursor: pointer; + } .collateral{ display: flex; flex-direction: row; diff --git a/src/styles/vault.scss b/src/styles/vault.scss index c94963f..56cf6c3 100644 --- a/src/styles/vault.scss +++ b/src/styles/vault.scss @@ -12,11 +12,28 @@ margin-left: -1.5rem; .alert-warning { + flex-direction: row; margin-top: 0rem; margin-bottom: 0rem; padding: 0.2rem 1rem; height: 2rem; width: 70%; + + span { + color: $highlight; + margin: 0px 10px; + } + span:hover { + cursor: pointer; + } + .question-small { + margin-top: -3px; + } + } + + .alert-inside { + margin-top: -2rem; + margin-bottom: 2rem; } .btn-dark { @@ -30,7 +47,7 @@ .vault-container { display: flex; flex-direction: column; - margin-top: 4rem; + margin-top: 3rem; width: 38%; background-color: $darker; } diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 14631af..42024ec 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -1,3 +1,5 @@ +import { BigNumber } from "ethers"; + export const NETWORKS = { mainnet: { chainId: 1, @@ -132,3 +134,5 @@ export const TOKENS_SYMBOLS = { WETH: "WETH", WBTC: "WBTC", }; + +export const BIG_NUMBER_ZERO = BigNumber.from("0"); From 3d3f268c084a2a3290e366038cfd4d3475cc4321 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 17 Feb 2023 17:46:03 -0600 Subject: [PATCH 254/278] cleaning log --- src/components/Vaults/vault/index.tsx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index f09e1f2..b7d58f8 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -80,6 +80,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const [btnDisabled, setBtnDisabled] = useState(false); const [activeAction, setActiveAction] = useState("add"); const [refreshVault, setRefreshVault] = useState(false); + const [rerender, setRerender] = useState(false); // Vault Data const [assetOptions, setAssetOptions] = useState>([]); @@ -167,7 +168,6 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { }; async function loadVault() { - setIsLoading(true); let cBalance; let iBalance; let currentIndexPrice = "0"; @@ -336,6 +336,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setIndexBalanceUSD(iUsdBalance.toString()); setCollateralBalanceUSD(cUsdBalance.toString()); setIsLoading(false); + setRerender(!rerender); } useEffect( @@ -348,6 +349,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { currentAssetRead !== null && !loadingVault ) { + setIsLoading(true); await loadVault(); } }; @@ -409,6 +411,9 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setMintUSD("0"); setBurnUSD("0"); setBurnTxt("0"); + setIndexBalanceRaw(BIG_NUMBER_ZERO); + setVaultDebtRaw(BIG_NUMBER_ZERO); + setVaultCollateralRaw(BIG_NUMBER_ZERO); }; const changeVault = async (newRatio: number, reset = false) => { @@ -1336,17 +1341,18 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ) { keepVaultId = value === TOKENS_SYMBOLS.ETH || value === TOKENS_SYMBOLS.WETH; } - resetFields(); + setVaultData({ vaultId: !keepVaultId ? "0" : vaultData.vaultId, assetSymbol: vaultData.assetSymbol, collateralSymbol: value, isHardVault: vaultData.isHardVault, }); + resetFields(); setRefreshVault(!refreshVault); }; - const AssetDropdown = () => ( + const IndexDropdown = () => (
Index
@@ -1516,7 +1522,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => {
- + {!isLoading && ( <> {RenderIndexBalance(false)} From c222b429490bbe3d8da4d6af040406a3268ebf55 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 20 Feb 2023 10:39:06 -0600 Subject: [PATCH 255/278] fixed msg when debt is zero --- src/components/Vaults/vault/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index b7d58f8..d994265 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -1548,9 +1548,11 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { ) : ( <> - {vaultDebtRaw.lte(BigNumber.from("1000")) && + {!vaultDebtRaw.eq(BIG_NUMBER_ZERO) && + vaultDebtRaw.lte(BigNumber.from("1000")) && indexBalanceRaw.lt(vaultDebtRaw) && } {vaultDebtRaw.lte(BigNumber.from("1000")) && + !vaultDebtRaw.eq(BIG_NUMBER_ZERO) && !indexBalanceRaw.lt(vaultDebtRaw) && }
From fb2aae735cf747c80c8f3459e7a51ff580964260 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 20 Feb 2023 10:45:49 -0600 Subject: [PATCH 256/278] fixed aprox symbol when zero --- src/components/Vaults/vault/index.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index d994265..372a3eb 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -959,6 +959,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { decimals = 4; } if (numberAmount === 0) { + prefix = "$"; decimals = 2; newAmount = numberAmount.toFixed(decimals); } @@ -1221,7 +1222,11 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { displayType="text" thousandSeparator decimalScale={tokenBalanceDecimals} - prefix={parseFloat(vaultCollateral) < 0.0001 ? "~" : ""} + prefix={ + parseFloat(vaultCollateral) > 0 && parseFloat(vaultCollateral) < 0.0001 + ? "~" + : "" + } />
@@ -1258,7 +1263,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { displayType="text" thousandSeparator decimalScale={tokenBalanceDecimals} - prefix={parseFloat(vaultDebt) < 0.0001 ? "~" : ""} + prefix={parseFloat(vaultDebt) > 0 && parseFloat(vaultDebt) < 0.0001 ? "~" : ""} />
From a44c9e903b32275eb83e9ffdf6067504bae79c7d Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 20 Feb 2023 12:24:03 -0600 Subject: [PATCH 257/278] fixed bug regarding wbtc vaults not showing on UI --- src/components/Vaults/monitoring/index.tsx | 8 +++++++- src/hooks/useVault.tsx | 9 +++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index 99f0e04..cc95ae2 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -400,7 +400,12 @@ const Monitoring = ({ setVaultToUpdate }: props) => { addVault = v.tokenSymbol === TOKENS_SYMBOLS.WETH || v.tokenSymbol === TOKENS_SYMBOLS.DAI; } - if (addVault && v.tokenSymbol !== TOKENS_SYMBOLS.WBTC) { + // show only wbtc hard vaults + if (v.tokenSymbol === TOKENS_SYMBOLS.WBTC) { + addVault = addVault && v.hardVault; + } + + if (addVault) { let vaultUrl = ""; const symbol = v.tokenSymbol === TOKENS_SYMBOLS.WETH ? TOKENS_SYMBOLS.ETH : v.tokenSymbol; if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { @@ -512,6 +517,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { symbols.push({ key: "link", name: TOKENS_SYMBOLS.LINK }); symbols.push({ key: "usdc", name: TOKENS_SYMBOLS.USDC }); } + symbols.push({ key: "wbtc", name: TOKENS_SYMBOLS.WBTC }); } else if (isArbitrum(currentNetwork.chainId)) { symbols.push({ key: "weth", name: TOKENS_SYMBOLS.ETH }); symbols.push({ key: "dai", name: TOKENS_SYMBOLS.DAI }); diff --git a/src/hooks/useVault.tsx b/src/hooks/useVault.tsx index bad8d09..ea13fc7 100644 --- a/src/hooks/useVault.tsx +++ b/src/hooks/useVault.tsx @@ -114,8 +114,13 @@ export const useVault = ( cOracleRead = oracles.maticOracleRead; break; case TOKENS_SYMBOLS.WBTC: - cVault = vaults.wbtcVault; - cVaultRead = vaults.wbtcVaultRead; + if (isHardVault) { + cVault = hardVaults.wbtcVault; + cVaultRead = hardVaults.wbtcVaultRead; + } else { + cVault = vaults.wbtcVault; + cVaultRead = vaults.wbtcVaultRead; + } cCollateral = tokens.wbtcToken; cCollateralRead = tokens.wbtcTokenRead; cOracleRead = oracles.wbtcOracleRead; From 76c876a3e4d80efe8a54faa9484be94d0857da24 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 21 Feb 2023 12:18:47 -0600 Subject: [PATCH 258/278] new incentive --- src/components/Farm/UniV3Rewards/Apr.tsx | 9 +++++---- src/utils/univ3.tsx | 7 +++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/Apr.tsx b/src/components/Farm/UniV3Rewards/Apr.tsx index 68dddf9..d136268 100644 --- a/src/components/Farm/UniV3Rewards/Apr.tsx +++ b/src/components/Farm/UniV3Rewards/Apr.tsx @@ -21,12 +21,12 @@ const Apr = ({ incentive, stakerContractRead }: props) => { const TVL = gql` query aprs { - apr(id: "2") { + apr(id: "1") { id totalAmount0 totalAmount1 } - positions(where: { staked: true, stakedBlockNumber_gt: 15998870 }) { + positions(where: { staked: true, stakedBlockNumber_gt: 16678120 }) { id } } @@ -35,7 +35,6 @@ const Apr = ({ incentive, stakerContractRead }: props) => { const calculateClaimableRewards = async (stakedLpTokens: any) => { let claimableReward = ethers.BigNumber.from("0"); const rewardCalls = new Array(); - if (stakedLpTokens.length > 0) { for (let i = 0; i < stakedLpTokens.length; i += 1) { rewardCalls.push(await stakerContractRead?.getRewardInfo(incentive, stakedLpTokens[i].id)); @@ -118,8 +117,10 @@ const Apr = ({ incentive, stakerContractRead }: props) => { console.log(error); }, onCompleted: (data: any) => { - if (signer) { + if (signer && data) { calculateApr(data); + } else { + setApr(10); } }, }); diff --git a/src/utils/univ3.tsx b/src/utils/univ3.tsx index f3d3fb1..c031310 100644 --- a/src/utils/univ3.tsx +++ b/src/utils/univ3.tsx @@ -8,6 +8,13 @@ export const UNIV3 = { id: "0x11456b3750E991383bB8943118ed79C1afdEE192", feeTier: 3000, incentives: [ + { + rewardToken: "0x321C2fE4446C7c963dc41Dd58879AF648838f98D", + pool: "0x11456b3750E991383bB8943118ed79C1afdEE192", + startTime: 1677001966, + endTime: 1684691574, + refundee: "0xa70b638B70154EdfCbb8DbbBd04900F328F32c35", + }, { rewardToken: "0x321C2fE4446C7c963dc41Dd58879AF648838f98D", pool: "0x11456b3750E991383bB8943118ed79C1afdEE192", From c8b3200922fc430d4521cea157730648faef3819 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 22 Feb 2023 11:25:33 -0600 Subject: [PATCH 259/278] fixed liquidation on arbitrum --- .../Vaults/monitoring/Liquidate.tsx | 91 +++++++++++-------- src/components/Vaults/monitoring/index.tsx | 23 +++-- 2 files changed, 67 insertions(+), 47 deletions(-) diff --git a/src/components/Vaults/monitoring/Liquidate.tsx b/src/components/Vaults/monitoring/Liquidate.tsx index d595a53..22a66c1 100644 --- a/src/components/Vaults/monitoring/Liquidate.tsx +++ b/src/components/Vaults/monitoring/Liquidate.tsx @@ -52,11 +52,11 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = liqVault ? liqVault.isHardVault : true ); - const [assetBalance, setAssetBalance] = useState("0"); - const [assetPrice, setAssetPrice] = useState("0"); - const [requiredTcap, setRequiredTcap] = useState("0"); - const [maxTcap, setMaxTcap] = useState("0"); - const [maxTcapUSD, setMaxTcapUSD] = useState("0"); + const [indexBalance, setIndexBalance] = useState("0"); + const [indexPrice, setIndexPrice] = useState("0"); + const [requiredIndex, setRequiredIndex] = useState("0"); + const [maxIndex, setMaxIndex] = useState("0"); + const [maxIndexUSD, setMaxIndexUSD] = useState("0"); const [reward, setReward] = useState("0"); const [rewardUSD, setRewardUSD] = useState("0"); const [burnFee, setBurnFee] = useState("0"); @@ -97,22 +97,25 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = ]); const assetBalanceText = ethers.utils.formatEther(balance); const assetPriceText = ethers.utils.formatEther(assetOraclePrice); - const reqTcapText = ethers.utils.formatEther(reqTcap); + const reqIndexText = ethers.utils.formatEther(reqTcap); const liqRewardText = ethers.utils.formatUnits(liqReward, liqVault.decimals); const priceText = ethers.utils.formatEther(collateralPrice.mul(10000000000)); const ethPriceText = ethers.utils.formatEther(ethPrice.mul(10000000000)); - const currentLiqFee = await currentVault?.getFee(reqTcap); + let currentLiqFee; + if (isArbitrum(currentNetwork.chainId)) { + currentLiqFee = await currentVault?.getBurnFee(reqTcap); + } else { + currentLiqFee = await currentVault?.getFee(reqTcap); + } + const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); - console.log("ASSE: ", currentVaultRead); - console.log("REQ: ", reqTcapText); - - setAssetBalance(assetBalanceText); - setAssetPrice(assetPriceText); - setRequiredTcap(reqTcapText); - setMaxTcap(reqTcapText); - setMaxTcapUSD(toUSD(reqTcapText, assetPriceText).toFixed(2)); + setIndexBalance(assetBalanceText); + setIndexPrice(assetPriceText); + setRequiredIndex(reqIndexText); + setMaxIndex(reqIndexText); + setMaxIndexUSD(toUSD(reqIndexText, assetPriceText).toFixed(2)); setReward(liqRewardText); setRewardUSD(toUSD(liqRewardText, priceText).toFixed(2)); setBurnFee(ethFee); @@ -132,14 +135,14 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = }, [currentAddress, liqVault, currentVaultRead, currentAssetOracleRead]); const onChangeMaxTcap = (event: React.ChangeEvent) => { - setMaxTcap(event.target.value); - setMaxTcapUSD(toUSD(event.target.value, assetPrice).toFixed(2)); + setMaxIndex(event.target.value); + setMaxIndexUSD(toUSD(event.target.value, indexPrice).toFixed(2)); }; - const minTcap = async (e: React.MouseEvent) => { + const minIndex = async (e: React.MouseEvent) => { e.preventDefault(); - setMaxTcap(requiredTcap); - setMaxTcapUSD(toUSD(requiredTcap, assetPrice).toFixed(2)); + setMaxIndex(requiredIndex); + setMaxIndexUSD(toUSD(requiredIndex, indexPrice).toFixed(2)); }; const loadVaultData = async () => { @@ -153,25 +156,30 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = event.preventDefault(); if (currentAddress && liqVault !== null && canLiquidate && currentVault) { setCanLiquidate(false); - const maxAmountTcap = parseFloat(maxTcap); - if (maxTcap && maxAmountTcap > 0) { - if (maxAmountTcap >= parseFloat(requiredTcap)) { - if (maxAmountTcap <= parseFloat(assetBalance)) { + const maxAmountIndex = parseFloat(maxIndex); + if (maxIndex && maxAmountIndex > 0) { + if (maxAmountIndex >= parseFloat(requiredIndex)) { + if (maxAmountIndex <= parseFloat(indexBalance)) { try { - const currentLiqFee = await currentVault?.getFee( - ethers.utils.parseEther(requiredTcap) - ); + let currentLiqFee; + if (isArbitrum(currentNetwork.chainId)) { + currentLiqFee = await currentVault?.getBurnFee( + ethers.utils.parseEther(requiredIndex) + ); + } else { + currentLiqFee = await currentVault?.getFee(ethers.utils.parseEther(requiredIndex)); + } const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); setBurnFee(ethFee); const tx = await currentVault.liquidateVault( BigNumber.from(liqVault.id), - ethers.utils.parseEther(maxTcap), + ethers.utils.parseEther(maxIndex), { value: increasedFee } ); notifyUser(tx, loadVaultData); await loadVaultData(); - setMaxTcap(""); + setMaxIndex(""); onHide(); } catch (error) { errorNotification("Burn fee less than required."); @@ -189,7 +197,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = } }; - const netReward = parseFloat(rewardUSD) - parseFloat(maxTcapUSD) - parseFloat(burnFeeUsd); + const netReward = parseFloat(rewardUSD) - parseFloat(maxIndexUSD) - parseFloat(burnFeeUsd); const getTokeSymbol = () => { if (liqVault !== null) { @@ -246,8 +254,8 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = aria-labelledby="contained-modal-title-vcenter" centered onHide={() => { - setMaxTcap("0"); - setMaxTcapUSD("0"); + setMaxIndex("0"); + setMaxIndexUSD("0"); onHide(); }} > @@ -261,9 +269,16 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) =
<> - {isMobile ? "Amount" : <>{t("amount-tcap")}} + {isMobile ? ( + Amount + ) : ( + + Amount of{" "} + {isArbitrum(currentNetwork.chainId) ? TOKENS_SYMBOLS.JPEGz : TOKENS_SYMBOLS.TCAP} + + )} - + MIN REQUIRED @@ -272,13 +287,13 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = type="text" placeholder="0" className="neon-green" - value={maxTcap} + value={maxIndex} onChange={onChangeMaxTcap} /> ${numberFormatStr(rewardUSD, 2, 2)} - ${numberFormatStr(maxTcapUSD, 2, 2)} + ${numberFormatStr(maxIndexUSD, 2, 2)} ${numberFormatStr(burnFeeUsd, 2, 2)} ${numberFormatStr(netReward.toFixed(2), 2, 2)} @@ -355,7 +370,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = <>{t("required-tcap", { indexName })} {helpToolTip(1)}
-
${numberFormatStr(maxTcapUSD, 2, 2)}
+
${numberFormatStr(maxIndexUSD, 2, 2)}
Burn Fee
diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index cc95ae2..348c78c 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -248,7 +248,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { } switch (vaultType) { - case "DAI": + case TOKENS_SYMBOLS.DAI: if (isHardVault) { cVault = hardVaults.daiVault; cVaultRead = hardVaults.daiVaultRead; @@ -257,31 +257,31 @@ const Monitoring = ({ setVaultToUpdate }: props) => { cVaultRead = vaults.daiVaultRead; } break; - case "AAVE": + case TOKENS_SYMBOLS.AAVE: cVault = vaults.aaveVault; cVaultRead = vaults.aaveVaultRead; break; - case "LINK": + case TOKENS_SYMBOLS.LINK: cVault = vaults.linkVault; cVaultRead = vaults.linkVaultRead; break; - case "SNX": + case TOKENS_SYMBOLS.SNX: cVault = vaults.snxVault; cVaultRead = vaults.snxVaultRead; break; - case "UNI": + case TOKENS_SYMBOLS.UNI: cVault = vaults.uniVault; cVaultRead = vaults.uniVaultRead; break; - case "MATIC": + case TOKENS_SYMBOLS.MATIC: cVault = vaults.maticVault; cVaultRead = vaults.maticVaultRead; break; - case "WBTC": + case TOKENS_SYMBOLS.WBTC: cVault = vaults.wbtcVault; cVaultRead = vaults.wbtcVaultRead; break; - case "USDC": + case TOKENS_SYMBOLS.USDC: cVault = hardVaults.usdcVault; cVaultRead = hardVaults.usdcVaultRead; break; @@ -303,7 +303,12 @@ const Monitoring = ({ setVaultToUpdate }: props) => { const reqTcapText = ethers.utils.formatEther(reqTcap); const liqRewardText = ethers.utils.formatUnits(liqReward, decimals); - const currentLiqFee = await cVault?.getFee(reqTcap); + let currentLiqFee; + if (isArbitrum(currentNetwork.chainId)) { + currentLiqFee = await cVault?.getBurnFee(reqTcap); + } else { + currentLiqFee = await cVault?.getFee(reqTcap); + } const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); const ethFee = ethers.utils.formatEther(increasedFee); From 93b06013620fd4d7b3634e8216b605c6d4eadfda Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sun, 26 Feb 2023 15:02:43 -0600 Subject: [PATCH 260/278] fixed monitoring tool pagination oon arbitrum --- src/components/Vaults/common.tsx | 2 + src/components/Vaults/index.tsx | 13 +- .../Vaults/monitoring/GraphqlQueries.tsx | 175 +++ .../Vaults/monitoring/Pagination.tsx | 15 +- .../Vaults/monitoring/VaultsSummary.tsx | 73 ++ src/components/Vaults/monitoring/index.tsx | 8 +- src/components/Vaults/monitoring/index2.tsx | 1104 +++++++++++++++++ src/components/Vaults/types.tsx | 2 + src/hooks/index.tsx | 2 + src/hooks/useVaultsSummary.tsx | 161 +++ 10 files changed, 1548 insertions(+), 7 deletions(-) create mode 100644 src/components/Vaults/monitoring/GraphqlQueries.tsx create mode 100644 src/components/Vaults/monitoring/VaultsSummary.tsx create mode 100644 src/components/Vaults/monitoring/index2.tsx create mode 100644 src/hooks/useVaultsSummary.tsx diff --git a/src/components/Vaults/common.tsx b/src/components/Vaults/common.tsx index 1d0960a..071f5f0 100644 --- a/src/components/Vaults/common.tsx +++ b/src/components/Vaults/common.tsx @@ -54,6 +54,8 @@ export const OPTIMISM_COLLATERALS = [ TOKENS_SYMBOLS.SNX, ]; +export const KEYWORD_ALL = "all"; + export const getMinRatio = (ratios: VaultsRatioType, symbol: string, isHardVault: boolean) => { let minRatio = 200; switch (symbol) { diff --git a/src/components/Vaults/index.tsx b/src/components/Vaults/index.tsx index ecc4f08..21a159d 100644 --- a/src/components/Vaults/index.tsx +++ b/src/components/Vaults/index.tsx @@ -1,11 +1,14 @@ import React, { useContext, useEffect, useState } from "react"; -import Monitoring from "./monitoring"; +import Monitoring from "./monitoring/index"; +import MonitoringArb from "./monitoring/index2"; import Vault from "./vault/index"; -import { signerContext } from "../../state"; +import { signerContext, networkContext } from "../../state"; import { VaultToUpdateType } from "./types"; +import { isArbitrum } from "../../utils/utils"; const Vaults = () => { const signer = useContext(signerContext); + const currentNetwork = useContext(networkContext); const [currentAddress, setCurrentAddress] = useState(""); const [isMinting, setMinting] = useState(false); const [currrentVault, setCurrentVault] = useState({ @@ -53,7 +56,11 @@ const Vaults = () => { return ( <> - + {!isArbitrum(currentNetwork.chainId) ? ( + + ) : ( + + )} ); }; diff --git a/src/components/Vaults/monitoring/GraphqlQueries.tsx b/src/components/Vaults/monitoring/GraphqlQueries.tsx new file mode 100644 index 0000000..4b301d9 --- /dev/null +++ b/src/components/Vaults/monitoring/GraphqlQueries.tsx @@ -0,0 +1,175 @@ +import { gql } from "@apollo/client"; + +export const VAULTS_ALL = gql` + query AllVaults($lastBlockTS: String!) { + vaults(first: 1000, orderBy: blockTS, where: { blockTS_gt: $lastBlockTS }) { + id + vaultId + owner + collateral + debt + currentRatio + tokenSymbol + status + hardVault + blockTS + underlyingProtocol { + underlyingToken { + decimals + } + } + } + } +`; + +export const VAULTS_BY_USER = gql` + query MyVaults($ownerAddress: String!) { + vaults(where: { owner: $ownerAddress }) { + id + vaultId + owner + collateral + debt + currentRatio + tokenSymbol + status + hardVault + blockTS + underlyingProtocol { + underlyingToken { + decimals + } + } + } + } +`; + +export const VAULTS_BY_COLLATERAL = gql` + query VAULTS_BY_COLLATERAL($lastBlockTS: String!, $symbol: String!) { + vaults( + first: 1000 + orderBy: blockTS + where: { blockTS_gt: $lastBlockTS, tokenSymbol: $symbol } + ) { + id + vaultId + owner + collateral + debt + currentRatio + tokenSymbol + status + hardVault + blockTS + underlyingProtocol { + underlyingToken { + decimals + } + } + } + } +`; + +export const VAULTS_BY_STATUS = gql` + query VAULTS_BY_STATUS($lastBlockTS: String!, $status: String!) { + vaults(first: 1000, orderBy: blockTS, where: { blockTS_gt: $lastBlockTS, status: $status }) { + id + vaultId + owner + collateral + debt + currentRatio + tokenSymbol + status + hardVault + blockTS + underlyingProtocol { + underlyingToken { + decimals + } + } + } + } +`; + +export const VAULTS_BY_TOKEN_STATUS = gql` + query VAULTS_BY_TS($lastBlockTS: String!, $symbol: String!, $status: String!) { + vaults( + first: 1000 + orderBy: blockTS + where: { blockTS_gt: $lastBlockTS, tokenSymbol: $symbol, status: $status } + ) { + id + vaultId + owner + collateral + debt + currentRatio + tokenSymbol + hardVault + blockTS + underlyingProtocol { + underlyingToken { + decimals + } + } + } + } +`; + +export const VAULTS_IN_LIQ = gql` + query VAULTS_BY_TS($lastBlockTS: String!) { + vaults( + first: 1000 + orderBy: blockTS + where: { blockTS_gt: $lastBlockTS, status: "active", debt_gt: 100000000 } + ) { + id + vaultId + owner + collateral + debt + currentRatio + tokenSymbol + status + hardVault + blockTS + underlyingProtocol { + underlyingToken { + decimals + } + } + } + } +`; + +export const VAULTS_IN_LIQ_BY_TOKEN = gql` + query VAULTS_BY_TS($lastBlockTS: String!, $symbol: String!) { + vaults( + first: 1000 + orderBy: blockTS + where: { + blockTS_gt: $lastBlockTS + tokenSymbol: $symbol + status: "active" + debt_gt: 100000000 + } + ) { + id + vaultId + owner + collateral + debt + currentRatio + tokenSymbol + status + hardVault + blockTS + underlyingProtocol { + underlyingToken { + decimals + } + } + } + } +`; diff --git a/src/components/Vaults/monitoring/Pagination.tsx b/src/components/Vaults/monitoring/Pagination.tsx index 8584d1f..23f167e 100644 --- a/src/components/Vaults/monitoring/Pagination.tsx +++ b/src/components/Vaults/monitoring/Pagination.tsx @@ -22,7 +22,11 @@ export const VaultPagination = ({ pagination, onPageSelected }: props) => { return ( <> - + onPageSelected(1)} + > {1} {pagination.current >= 3 && pagination.current < midPages[0] && } @@ -54,6 +58,9 @@ export const VaultPagination = ({ pagination, onPageSelected }: props) => { > {pagination.pages} + {pagination.itemsCount < pagination.totalItems - 1 && ( + onPageSelected(pagination.pages + 1)} /> + )} ); }; @@ -86,7 +93,11 @@ export const VaultPagination = ({ pagination, onPageSelected }: props) => { /> {pagination.pages >= 10 && ( onPageSelected(pagination.pages)} + onClick={() => + onPageSelected( + pagination.pages < pagination.totalPages ? pagination.pages + 1 : pagination.pages + ) + } disabled={pagination.next === 0} /> )} diff --git a/src/components/Vaults/monitoring/VaultsSummary.tsx b/src/components/Vaults/monitoring/VaultsSummary.tsx new file mode 100644 index 0000000..39613d3 --- /dev/null +++ b/src/components/Vaults/monitoring/VaultsSummary.tsx @@ -0,0 +1,73 @@ +import React, { useContext } from "react"; +import { Accordion, Col } from "react-bootstrap/esm"; +import { useMediaQuery } from "react-responsive"; +import { useTranslation } from "react-i18next"; +import { networkContext } from "../../../state"; +import { TokenIcon } from "../common"; +import { VaultsTotalsType } from "../types"; +import { TOKENS_SYMBOLS } from "../../../utils/constants"; +import { isArbitrum, numberFormatStr } from "../../../utils/utils"; + +type props = { + vaultsTotals: VaultsTotalsType; +}; + +const VaultsSummary = ({ vaultsTotals }: props) => { + const { t } = useTranslation(); + const isMobile = useMediaQuery({ query: "(max-width: 850px)" }); + const currentNetwork = useContext(networkContext); + + const IndexIcon = () => { + if (!isArbitrum(currentNetwork.chainId)) { + return ; + } + return ; + }; + + return ( + + + +
+ <>{t("totals")} +
+
+ + + +
+ <>{t("vaults")} +
+ + {numberFormatStr(vaultsTotals.vaults.toString(), 0, 0)} + + + +
+ <>{t("collateral")} (USD) +
+ ${numberFormatStr(vaultsTotals.collateralUSD, 2, 2)} + + +
+
+ <>{t("debt")} +
+ +
+ {numberFormatStr(vaultsTotals.debt, 4, 4)} + + +
+ <>{t("debt")} (USD) +
+ ${numberFormatStr(vaultsTotals.debtUSD, 2, 2)} + + +
+
+
+ ); +}; + +export default VaultsSummary; diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index cc95ae2..427fdfb 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -48,6 +48,8 @@ const pagDefault = { lastDataPage: 0, itemsPerPage: 10, itemsCount: 0, + totalItems: 0, + totalPages: 0, lastId: "0", }; @@ -142,10 +144,10 @@ const Monitoring = ({ setVaultToUpdate }: props) => { } if (currentStatus !== "all") { if (currentStatus === "empty") { - statusFilter = `collateral_lt: "${weiLimit}"`; + statusFilter = `collateral: "${weiLimit}"`; } if (currentStatus === "ready") { - statusFilter = `collateral_gte: "${weiLimit}", debt_lt: "${weiLimit}"`; + statusFilter = `collateral_gt: "${weiLimit}", debt: "${weiLimit}"`; } if (currentStatus === VAULT_STATUS.active || currentStatus === VAULT_STATUS.liquidation) { statusFilter = `debt_gt: "${weiLimit}"`; @@ -363,6 +365,8 @@ const Monitoring = ({ setVaultToUpdate }: props) => { lastDataPage, itemsPerPage, itemsCount, + totalItems: itemsCount, + totalPages: pages, lastId: lastVaultId, }; setPagination(pag); diff --git a/src/components/Vaults/monitoring/index2.tsx b/src/components/Vaults/monitoring/index2.tsx new file mode 100644 index 0000000..cee72c8 --- /dev/null +++ b/src/components/Vaults/monitoring/index2.tsx @@ -0,0 +1,1104 @@ +import React, { useContext, useEffect, useRef, useState } from "react"; +import { Accordion, Button, Card, Col, Dropdown, Form } from "react-bootstrap/esm"; +import Spinner from "react-bootstrap/Spinner"; +import { FaArrowsAltH } from "react-icons/fa"; +import { ethers, BigNumber } from "ethers"; +import { useMediaQuery } from "react-responsive"; +import { useLazyQuery } from "@apollo/client"; +import { useTranslation } from "react-i18next"; +import "../../../styles/vault-monitoring.scss"; +import { VaultPagination } from "./Pagination"; +import VaultsSummary from "./VaultsSummary"; +import { signerContext, hardVaultsContext, networkContext, vaultsContext } from "../../../state"; +import { Vaults } from "./Vaults"; +import { VaultsMobile } from "./VaultsMobile"; +import { + VAULTS_ALL, + VAULTS_BY_COLLATERAL, + VAULTS_BY_STATUS, + VAULTS_BY_TOKEN_STATUS, + VAULTS_IN_LIQ, + VAULTS_IN_LIQ_BY_TOKEN, + VAULTS_BY_USER, +} from "./GraphqlQueries"; +import { usePrices, useRatios, useVaultsSummary } from "../../../hooks"; +import { + getRatio2, + isArbitrum, + isInLayer1, + isOptimism, + isUndefined, + toUSD, +} from "../../../utils/utils"; +import { TOKENS_SYMBOLS } from "../../../utils/constants"; +import { + capitalize, + TokenIcon, + getMinRatio, + getCollateralPrice, + findNewArbitrumVaultCollateral, + findNewMainnetVaultCollateral, + findNewOptimismVaultCollateral, + KEYWORD_ALL, + VAULT_STATUS, +} from "../common"; +import { + DropdownItemType, + PaginationType, + VaultToUpdateType, + VaultsTotalsType, + VaultsType, +} from "../types"; + +const pagDefault = { + previous: 0, + current: 0, + next: 0, + pages: 0, + lastDataPage: 0, + itemsPerPage: 10, + itemsCount: 0, + totalItems: 0, + totalPages: 0, + lastId: "0", +}; + +const totalsDefault = { + vaults: 0, + collateral: "0", + collateralUSD: "0", + debt: "0", + debtUSD: "0", +}; + +type liqVaultsTempType = { + vaultId: string; + vaultType: string; + decimals: number; + hardVault: boolean; +}; + +type props = { + currentAddress: string; + setVaultToUpdate: (initData: VaultToUpdateType) => void; +}; + +const showAllVaults = true; +const MAX_RANGE_LIMIT = Number.MAX_VALUE; + +const Monitoring = ({ currentAddress, setVaultToUpdate }: props) => { + const { t } = useTranslation(); + const isMobile = useMediaQuery({ query: "(max-width: 850px)" }); + const currentNetwork = useContext(networkContext); + const signer = useContext(signerContext); + const vaults = useContext(vaultsContext); + const hardVaults = useContext(hardVaultsContext); + const [prices, loadingPrices] = usePrices(); + const ratios = useRatios(); + // eslint-disable-next-line + const [refetchSummary, vaultsSummary] = useVaultsSummary(prices, loadingPrices); + const vaultsOwnerFilter = [ + { name: t("all-vaults"), value: "0" }, + { name: t("my-vaults"), value: "1" }, + ]; + const [vaultsUpdated, setVaultsUpdated] = useState(false); + const [vaultsTotals, setVaultsTotals] = useState(totalsDefault); + const [vaultList, setVaultList] = useState>([]); + const [pagination, setPagination] = useState(pagDefault); + const [loadingMore, setLoadingMore] = useState(false); + const [byCollateralFirstLoad, setByCollateralFirstLoad] = useState(true); + const [byStatusFirstLoad, setByStatusFirstLoad] = useState(true); + const [byTSFirstLoad, setByTSFirstLoad] = useState(true); + const [byInLiqFirstLoad, setByInLiqFirstLoad] = useState(true); + const [byTokenInLiqFirstLoad, setByTokenInLiqFirstLoad] = useState(true); + const [filteringRatios, setFilteringRatios] = useState(false); + const [currentOwnerFilter, setCurrentOwnerFilter] = useState(vaultsOwnerFilter[1]); + const [tokenSymbol, setTokenSymbol] = useState("all"); + const [currentStatus, setCurrentStatus] = useState("all"); + const [vaultMode, setVaultMode] = useState("all"); + const [currentMinRatio, setCurrentMinRatio] = useState("0%"); + const [currentMaxRatio, setCurrentMaxRatio] = useState("MAX"); + const [renderTable, setRenderTable] = useState(false); + const ratioRangeDropdown = useRef(null); + const minRatioInput = useRef(null); + const maxRatioInput = useRef(null); + const viewsList = [ + { key: "5", name: "5" }, + { key: "10", name: "10" }, + { key: "15", name: "15" }, + { key: "20", name: "20" }, + { key: "25", name: "25" }, + { key: "30", name: "30" }, + ]; + const statusList = [ + { key: KEYWORD_ALL, name: "All" }, + { key: VAULT_STATUS.empty, name: "Empty" }, + { key: VAULT_STATUS.ready, name: "Ready" }, + { key: VAULT_STATUS.active, name: "Active" }, + { key: VAULT_STATUS.liquidation, name: "Liquidation" }, + ]; + const modeList = [ + { key: KEYWORD_ALL, name: "All" }, + { key: "regular", name: "Regular" }, + { key: "hard", name: "Hard" }, + ]; + + const isMyVaults = (): boolean => currentOwnerFilter.value === "1" && currentAddress !== ""; + + const isValidRatio = (value: string) => { + let valid = false; + if (!Number.isNaN(value)) { + valid = Number.parseFloat(value) >= 0; + } + return valid; + }; + + const getMinRangeRatio = (): number => { + if (minRatioInput && minRatioInput.current) { + // @ts-ignore + const minRatio = minRatioInput.current.value; + if (isValidRatio(minRatio)) { + return parseFloat(minRatio); + } + } + return 0; + }; + + const getMaxRangeRatio = (): number => { + if (maxRatioInput && maxRatioInput.current) { + // @ts-ignore + const maxRatio = maxRatioInput.current.value; + if (isValidRatio(maxRatio)) { + return parseFloat(maxRatio); + } + return MAX_RANGE_LIMIT; + } + return MAX_RANGE_LIMIT; + }; + + const calculateNetRewardUsd = async ( + vaultId: string, + vaultType: string, + isHardVault: boolean, + decimals: number + ) => { + try { + let cVault = vaults.wethVault; + let cVaultRead = vaults.wethVaultRead; + const vaultPrice = getCollateralPrice(prices, vaultType); + if (isHardVault) { + cVault = hardVaults.wethVault; + cVaultRead = hardVaults.wethVaultRead; + } + + switch (vaultType) { + case TOKENS_SYMBOLS.DAI: + if (isHardVault) { + cVault = hardVaults.daiVault; + cVaultRead = hardVaults.daiVaultRead; + } else { + cVault = vaults.daiVault; + cVaultRead = vaults.daiVaultRead; + } + break; + case TOKENS_SYMBOLS.AAVE: + cVault = vaults.aaveVault; + cVaultRead = vaults.aaveVaultRead; + break; + case TOKENS_SYMBOLS.LINK: + cVault = vaults.linkVault; + cVaultRead = vaults.linkVaultRead; + break; + case TOKENS_SYMBOLS.SNX: + cVault = vaults.snxVault; + cVaultRead = vaults.snxVaultRead; + break; + case TOKENS_SYMBOLS.UNI: + cVault = vaults.uniVault; + cVaultRead = vaults.uniVaultRead; + break; + case TOKENS_SYMBOLS.MATIC: + cVault = vaults.maticVault; + cVaultRead = vaults.maticVaultRead; + break; + case TOKENS_SYMBOLS.WBTC: + cVault = vaults.wbtcVault; + cVaultRead = vaults.wbtcVaultRead; + break; + case TOKENS_SYMBOLS.USDC: + cVault = hardVaults.usdcVault; + cVaultRead = hardVaults.usdcVaultRead; + break; + default: + if (isHardVault) { + cVault = hardVaults.wethVault; + cVaultRead = hardVaults.wethVaultRead; + } else { + cVault = vaults.wethVault; + cVaultRead = vaults.wethVaultRead; + } + break; + } + + const reqTcapCall = await cVaultRead?.requiredLiquidationTCAP(BigNumber.from(vaultId)); + const liqRewardCall = await cVaultRead?.liquidationReward(BigNumber.from(vaultId)); + // @ts-ignore + const [reqTcap, liqReward] = await signer.ethcallProvider?.all([reqTcapCall, liqRewardCall]); + + const reqTcapText = ethers.utils.formatEther(reqTcap); + const liqRewardText = ethers.utils.formatUnits(liqReward, decimals); + const currentLiqFee = await cVault?.getFee(reqTcap); + const increasedFee = currentLiqFee.add(currentLiqFee.div(100)).toString(); + const ethFee = ethers.utils.formatEther(increasedFee); + + return ( + toUSD(liqRewardText, vaultPrice) - + toUSD(reqTcapText, prices.tcapOraclePrice) - + toUSD(ethFee, prices.wethOraclePrice) + ); + } catch (error) { + if (error.code !== "UNPREDICTABLE_GAS_LIMIT") { + console.log(error.code); + } + return 0; + } + }; + + const calculateVaultData = ( + collateralWei: ethers.BigNumberish, + debtWei: ethers.BigNumberish, + symbol: string, + isHardVault: boolean, + decimals: number + ) => { + const indexPrice = !isArbitrum(currentNetwork.chainId) + ? prices.tcapOraclePrice + : prices.jpegzOraclePrice; + const collateralText = ethers.utils.formatUnits(collateralWei, decimals); + const debtText = ethers.utils.formatEther(debtWei); + const collateralPrice = getCollateralPrice(prices, symbol); + const collateralUSD = toUSD(collateralText, collateralPrice); + const debtUSD = toUSD(debtText, indexPrice || "0"); + const minRatio = getMinRatio(ratios, symbol, isHardVault); + const ratio = getRatio2(collateralText, collateralPrice, debtText, indexPrice || "1"); + + let status = VAULT_STATUS.liquidation; + if (parseFloat(collateralText) === 0) { + status = VAULT_STATUS.empty; + } else if (parseFloat(collateralText) > 0 && parseFloat(debtText) <= 0) { + status = VAULT_STATUS.ready; + } else if (ratio >= minRatio) { + status = VAULT_STATUS.active; + } + return { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status }; + }; + + const confPagination = (vData: Array, itemsPerPage: number, vaultsAmount: number) => { + if (vData.length > 0) { + const lastVaultId = vData[vData.length - 1].blockTS; + const itemsCount = vData.length; + const pages = Math.ceil(itemsCount / itemsPerPage); + const lastDataPage = Math.ceil(itemsCount / itemsPerPage); + const pag = { + previous: 0, + current: loadingMore ? pagination.pages + 1 : 1, + next: loadingMore ? pagination.pages + 2 : 2, + pages, + lastDataPage, + itemsPerPage, + itemsCount, + totalItems: vaultsAmount - 1, + totalPages: Math.ceil((vaultsAmount - 1) / itemsPerPage), + lastId: lastVaultId, + }; + setPagination(pag); + } else { + setPagination(pagDefault); + } + }; + + const loadTotals = () => { + let totalId = ""; + let vaultsAmount = 0; + if (tokenSymbol !== "all" || currentStatus !== "all") { + if (tokenSymbol !== "all") { + totalId = tokenSymbol.toUpperCase(); + } + if (currentStatus !== "all") { + if (totalId === "") { + totalId = currentStatus; + } else { + totalId = totalId.concat("_").concat(currentStatus); + } + } + } else { + totalId = "all"; + } + + const vs = vaultsSummary.find((item) => item.id === totalId); + if (vs) { + const indexPrice = !isArbitrum(currentNetwork.chainId) + ? prices.tcapOraclePrice + : prices.jpegzOraclePrice; + + const tDebtUsd = parseFloat(vs.debt) * parseFloat(indexPrice); + setVaultsTotals({ + vaults: vs.vaultsAmount, + collateral: vs.collateral, + collateralUSD: vs.collateralUsd, + debt: vs.debt, + debtUSD: tDebtUsd.toFixed(2), + }); + vaultsAmount = vs.vaultsAmount; + } + return vaultsAmount; + }; + + const isValidCollateral = (symbol: string): boolean => { + if (tokenSymbol !== KEYWORD_ALL) { + return symbol === tokenSymbol; + } + return true; + }; + + const isValidStatus = (vStatus: string): boolean => { + if (currentStatus !== KEYWORD_ALL) { + return vStatus === currentStatus; + } + return true; + }; + + const loadVaults = async (vaultsData: any, cStatus: string) => { + let vData = new Array(); + let vaultsAmount = 0; + console.log("vaultsData: ", vaultsData.vaults.length); + if (loadingMore) { + vData = vaultList; + } + + const vLiquidables = new Array(); + const totals = { ...totalsDefault }; + const minFilterRatio = getMinRangeRatio(); + const maxFilterRatio = getMaxRangeRatio(); + + setFilteringRatios(true); + // setLiqLoaded(currentStatus !== VAULT_STATUS.liquidation); + // @ts-ignore + vaultsData.vaults.forEach((v) => { + let validVault = true; + if (isMyVaults()) { + validVault = isValidCollateral(v.tokenSymbol) && isValidStatus(v.status); + } + + if (validVault) { + const cVaultDecimals = v.underlyingProtocol.underlyingToken.decimals; + const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = + calculateVaultData(v.collateral, v.debt, v.tokenSymbol, v.hardVault, cVaultDecimals); + + let addVault = true; + if (cStatus === VAULT_STATUS.liquidation) { + addVault = cStatus === status; + } + // filter ratio + if (cStatus !== VAULT_STATUS.empty && cStatus !== VAULT_STATUS.ready) { + addVault = addVault && ratio >= minFilterRatio && ratio <= maxFilterRatio; + } + + // show only wbtc hard vaults + if (v.tokenSymbol === TOKENS_SYMBOLS.WBTC) { + addVault = addVault && v.hardVault; + } + + if (addVault) { + let vaultUrl = ""; + const symbol = v.tokenSymbol === TOKENS_SYMBOLS.WETH ? TOKENS_SYMBOLS.ETH : v.tokenSymbol; + if (v.owner.toLowerCase() === currentAddress.toLowerCase()) { + vaultUrl = window.location.origin.concat("/vault/").concat(symbol); + } + if (cStatus === VAULT_STATUS.liquidation) { + vLiquidables.push({ + vaultId: v.vaultId, + vaultType: v.tokenSymbol, + decimals: cVaultDecimals, + hardVault: v.hardVault, + }); + } + + vData.push({ + id: v.vaultId, + collateralSymbol: v.tokenSymbol, + collateralValue: collateralText, + collateralUsd: collateralUSD.toFixed(2), + debt: debtText, + debtUsd: debtUSD.toFixed(2), + ratio, + minRatio: minRatio.toString(), + decimals: cVaultDecimals, + isHardVault: v.hardVault, + netReward: 0, + status, + blockTS: v.blockTS, + url: vaultUrl, + }); + + if (isMyVaults() || cStatus === VAULT_STATUS.liquidation) { + totals.vaults += 1; + totals.collateral = ( + parseFloat(totals.collateral) + parseFloat(collateralText) + ).toFixed(4); + totals.collateralUSD = (parseFloat(totals.collateralUSD) + collateralUSD).toFixed(2); + totals.debt = (parseFloat(totals.debt) + parseFloat(debtText)).toFixed(4); + totals.debtUSD = (parseFloat(totals.debtUSD) + debtUSD).toFixed(2); + } + } + } + }); + + if (currentStatus !== VAULT_STATUS.liquidation) { + setVaultList(vData); + if (isMyVaults()) { + setVaultsTotals(totals); + vaultsAmount = totals.vaults; + } else { + vaultsAmount = loadTotals(); + } + } else { + const loadNetReward = async () => { + vLiquidables.forEach((l, index) => { + calculateNetRewardUsd(l.vaultId, l.vaultType, l.hardVault, l.decimals).then((result) => { + const newA = [...vData]; + newA[index].netReward = result; + setVaultList(newA); + }); + }); + }; + loadNetReward().then(() => { + setVaultList(vData); + setVaultsTotals(totals); + }); + vaultsAmount = totals.vaults; + } + + // Set pagination data + confPagination(vData, pagination.itemsPerPage, vaultsAmount); + setFilteringRatios(false); + setLoadingMore(false); + }; + + // Graphql queries + const [loadVaultData, { loading, refetch: refetchVaults }] = useLazyQuery(VAULTS_ALL, { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + variables: { lastBlockTS: "0" }, + onError: (error) => { + console.log(error); + }, + onCompleted: (data: any) => { + if (!isUndefined(data)) { + loadVaults(data, currentStatus); + setVaultsUpdated(true); + } + }, + }); + + const [loadVaultByCollateral, { loading: loadingByCollateral, refetch: refetchByCollateral }] = + useLazyQuery(VAULTS_BY_COLLATERAL, { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + variables: { lastBlockTS: "0", symbol: tokenSymbol }, + onError: (error) => { + console.log(error); + }, + onCompleted: (data: any) => { + if (!isUndefined(data)) { + loadVaults(data, currentStatus); + setVaultsUpdated(true); + } + }, + }); + + const [loadVaultByStatus, { loading: loadingByStatus, refetch: refetchByStatus }] = useLazyQuery( + VAULTS_BY_STATUS, + { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + variables: { lastBlockTS: "0", status: currentStatus }, + onError: (error) => { + console.log(error); + }, + onCompleted: (data: any) => { + if (!isUndefined(data)) { + loadVaults(data, currentStatus); + setVaultsUpdated(true); + } + }, + } + ); + + const [loadVaultByTS, { loading: loadingByTS, refetch: refetchByTS }] = useLazyQuery( + VAULTS_BY_TOKEN_STATUS, + { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + variables: { lastBlockTS: "0", symbol: tokenSymbol, status: currentStatus }, + onError: (error) => { + console.log(error); + }, + onCompleted: (data: any) => { + if (!isUndefined(data)) { + loadVaults(data, currentStatus); + setVaultsUpdated(true); + } + }, + } + ); + + const [loadVaultInLiq, { loading: loadingInLiq, refetch: refetchInLiq }] = useLazyQuery( + VAULTS_IN_LIQ, + { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + variables: { lastBlockTS: "0" }, + onError: (error) => { + console.log(error); + }, + onCompleted: (data: any) => { + if (!isUndefined(data)) { + loadVaults(data, currentStatus); + setVaultsUpdated(true); + } + }, + } + ); + + const [loadVaultTokenInLiq, { loading: loadingTokenInLiq, refetch: refetchTokenInLiq }] = + useLazyQuery(VAULTS_IN_LIQ_BY_TOKEN, { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + variables: { lastBlockTS: "0", symbol: tokenSymbol }, + onError: (error) => { + console.log(error); + }, + onCompleted: (data: any) => { + if (!isUndefined(data)) { + loadVaults(data, currentStatus); + setVaultsUpdated(true); + } + }, + }); + + const [loadVaulsByUser, { loading: loadingByUser }] = useLazyQuery(VAULTS_BY_USER, { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + variables: { ownerAddress: currentAddress }, + onError: (error) => { + console.log(error); + }, + onCompleted: (data: any) => { + if (!isUndefined(data)) { + loadVaults(data, currentStatus); + setVaultsUpdated(true); + } + }, + }); + + useEffect( + () => { + const load = async () => { + if (signer && currentAddress !== "") { + if (!vaultsUpdated && !loadingPrices) { + if (currentOwnerFilter.value === "1") { + loadVaulsByUser(); + } else { + loadVaultData(); + } + } + } else if (prices.daiOraclePrice !== "0") { + setCurrentOwnerFilter(vaultsOwnerFilter[0]); + loadVaultData(); + } + }; + load(); + }, + // eslint-disable-next-line + [signer, loadingPrices, prices.daiOraclePrice] + ); + + const tokensSymbols = (): Array => { + const symbols = [{ key: KEYWORD_ALL, name: "All" }]; + if (isInLayer1(currentNetwork.chainId)) { + symbols.push({ key: TOKENS_SYMBOLS.WETH, name: TOKENS_SYMBOLS.ETH }); + symbols.push({ key: TOKENS_SYMBOLS.DAI, name: TOKENS_SYMBOLS.DAI }); + if (showAllVaults) { + symbols.push({ key: TOKENS_SYMBOLS.AAVE, name: TOKENS_SYMBOLS.AAVE }); + symbols.push({ key: TOKENS_SYMBOLS.LINK, name: TOKENS_SYMBOLS.LINK }); + symbols.push({ key: TOKENS_SYMBOLS.USDC, name: TOKENS_SYMBOLS.USDC }); + } + symbols.push({ key: TOKENS_SYMBOLS.WBTC, name: TOKENS_SYMBOLS.WBTC }); + } else if (isArbitrum(currentNetwork.chainId)) { + symbols.push({ key: TOKENS_SYMBOLS.WETH, name: TOKENS_SYMBOLS.ETH }); + symbols.push({ key: TOKENS_SYMBOLS.DAI, name: TOKENS_SYMBOLS.DAI }); + } else if (isOptimism(currentNetwork.chainId)) { + symbols.push({ key: TOKENS_SYMBOLS.WETH, name: TOKENS_SYMBOLS.ETH }); + symbols.push({ key: TOKENS_SYMBOLS.DAI, name: TOKENS_SYMBOLS.DAI }); + if (showAllVaults) { + symbols.push({ key: TOKENS_SYMBOLS.LINK, name: TOKENS_SYMBOLS.LINK }); + symbols.push({ key: TOKENS_SYMBOLS.UNI, name: TOKENS_SYMBOLS.UNI }); + symbols.push({ key: TOKENS_SYMBOLS.SNX, name: TOKENS_SYMBOLS.SNX }); + } + } else { + symbols.push({ key: TOKENS_SYMBOLS.MATIC, name: TOKENS_SYMBOLS.MATIC }); + symbols.push({ key: TOKENS_SYMBOLS.DAI, name: TOKENS_SYMBOLS.DAI }); + symbols.push({ key: TOKENS_SYMBOLS.WBTC, name: TOKENS_SYMBOLS.WBTC }); + } + + return symbols; + }; + + const handleItemsViewChange = (number: string) => { + confPagination(vaultList, parseInt(number), vaultsTotals.vaults); + }; + + const handleVaultOwnerFilterChange = (value: string) => { + setCurrentOwnerFilter(vaultsOwnerFilter[parseInt(value)]); + if (value === "0") { + setPagination(pagDefault); + loadVaultData(); + } else { + loadVaulsByUser(); + } + }; + + const handleFiltersChange = (newStatus: string, newToken: string) => { + if (newStatus === KEYWORD_ALL && newToken === KEYWORD_ALL) { + refetchVaults({ lastBlockTS: "0" }); + } else if (newStatus === VAULT_STATUS.liquidation) { + if (newToken !== KEYWORD_ALL) { + if (byTokenInLiqFirstLoad) { + setByTokenInLiqFirstLoad(false); + loadVaultTokenInLiq(); + } else { + refetchTokenInLiq({ lastBlockTS: "0", symbol: newToken }); + } + } else if (byInLiqFirstLoad) { + setByInLiqFirstLoad(false); + loadVaultInLiq(); + } else { + refetchInLiq({ lastBlockTS: "0" }); + } + } else if (newStatus !== KEYWORD_ALL && newToken !== KEYWORD_ALL) { + if (byTSFirstLoad) { + setByTSFirstLoad(false); + loadVaultByTS(); + } else { + refetchByTS({ lastBlockTS: "0", symbol: newToken, status: newStatus }); + } + } else if (newStatus !== KEYWORD_ALL) { + if (byStatusFirstLoad) { + setByStatusFirstLoad(false); + loadVaultByStatus(); + } else { + refetchByStatus({ lastBlockTS: "0", status: newStatus }); + } + } else if (newToken !== KEYWORD_ALL) { + if (byCollateralFirstLoad) { + setByCollateralFirstLoad(false); + loadVaultByCollateral(); + } else { + refetchByCollateral({ lastBlockTS: "0", symbol: newToken }); + } + } + }; + + const handleStatusChange = (newStatus: string) => { + setCurrentStatus(newStatus); + if (isMyVaults()) { + loadVaulsByUser(); + } else { + handleFiltersChange(newStatus, tokenSymbol); + } + }; + + const handleTokenChange = (newToken: string) => { + setTokenSymbol(newToken); + if (isMyVaults()) { + console.log("Entra aqui myyvaults "); + loadVaulsByUser(); + } else { + console.log("Entra aqui: ", newToken); + handleFiltersChange(currentStatus, newToken); + } + }; + + const handleModeChange = (newMode: string) => { + setVaultMode(newMode); + if (isMyVaults()) { + loadVaulsByUser(); + } else { + refetchVaults({ lastBlockTS: "0" }); + } + }; + + const onFilterRatioClick = () => { + if (minRatioInput && maxRatioInput) { + // @ts-ignore + const minRatio = minRatioInput.current.value; + // @ts-ignore + const maxRatio = maxRatioInput.current.value; + if (isValidRatio(minRatio) && isValidRatio(maxRatio)) { + setCurrentMinRatio(minRatio.concat("%")); + setCurrentMaxRatio(maxRatio.concat("%")); + // @ts-ignore + handleFiltersChange(currentStatus, tokenSymbol); + if (ratioRangeDropdown !== null) { + // @ts-ignore + ratioRangeDropdown.current.click(); + } + } + } + }; + + const onPageSelected = (pageNumber: number) => { + let nextPage = pageNumber + 1; + if (pageNumber === pagination.pages && pagination.pages === pagination.totalPages) { + nextPage = 0; + } + + if (pageNumber > pagination.lastDataPage) { + setLoadingMore(true); + if (tokenSymbol === KEYWORD_ALL && currentStatus === KEYWORD_ALL) { + refetchVaults({ lastBlockTS: pagination.lastId }); + } else if (currentStatus === VAULT_STATUS.liquidation) { + if (tokenSymbol !== KEYWORD_ALL) { + refetchTokenInLiq({ lastBlockTS: pagination.lastId, symbol: tokenSymbol }); + } else { + refetchInLiq({ lastBlockTS: pagination.lastId }); + } + } else if (tokenSymbol !== KEYWORD_ALL) { + refetchByCollateral({ lastBlockTS: pagination.lastId, symbol: tokenSymbol }); + } else if (currentStatus !== KEYWORD_ALL) { + refetchByStatus({ lastBlockTS: pagination.lastId, status: currentStatus }); + } + } else { + const newPagination = { + ...pagination, + previous: pageNumber === 1 ? 0 : pageNumber - 1, + current: pageNumber, + next: nextPage, + }; + setPagination(newPagination); + } + }; + + const updateLiquidatedVault = async ( + index: number, + symbol: string, + vaultId: string, + collateral: ethers.BigNumberish, + debt: ethers.BigNumberish + ) => { + const { collateralText, collateralUSD, debtText, debtUSD, ratio, minRatio, status } = + calculateVaultData( + collateral, + debt, + symbol, + vaultList[index].isHardVault, + vaultList[index].decimals + ); + const allVaults = vaultList; + const v = { + id: vaultId, + collateralSymbol: symbol, + collateralValue: collateralText, + collateralUsd: collateralUSD.toFixed(2), + debt: debtText, + debtUsd: debtUSD.toFixed(2), + ratio, + minRatio: minRatio.toString(), + decimals: vaultList[index].decimals, + isHardVault: vaultList[index].isHardVault, + netReward: 0, + status, + blockTS: vaultList[index].blockTS, + url: vaultList[index].url, + }; + allVaults[index] = Object.create(v); + setVaultList(Array.from(allVaults)); + setRenderTable(!renderTable); + }; + + const newVault = () => { + let newAssetSymbol = TOKENS_SYMBOLS.TCAP; + let newCollateralSymbol = TOKENS_SYMBOLS.ETH; + let isHardVault = false; + const createdCollaterals = []; + for (let i = 0; i < vaultList.length; i += 1) { + createdCollaterals.push(vaultList[i].collateralSymbol); + } + + if (createdCollaterals.includes(TOKENS_SYMBOLS.WETH)) { + createdCollaterals.push(TOKENS_SYMBOLS.ETH); + } + + if (isInLayer1(currentNetwork.chainId)) { + [newCollateralSymbol, isHardVault] = findNewMainnetVaultCollateral(createdCollaterals); + } + if (isOptimism(currentNetwork.chainId)) { + newCollateralSymbol = findNewOptimismVaultCollateral(createdCollaterals); + } + if (isArbitrum(currentNetwork.chainId)) { + newAssetSymbol = TOKENS_SYMBOLS.JPEGz; + newCollateralSymbol = findNewArbitrumVaultCollateral(createdCollaterals); + } + + setVaultToUpdate({ + vaultId: "0", + assetSymbol: newAssetSymbol, + collateralSymbol: newCollateralSymbol, + isHardVault, + }); + }; + + const RenderFilters = () => ( + <> +
+
+
+ <>{t("view")}: +
+ handleItemsViewChange(eventKey || "15")}> + +
+ {pagination.itemsPerPage} +
+
+ + {viewsList.map((item) => ( + + {item.name} + + ))} + +
+
+
+
+
+
+ <>{t("collateral")} +
+ handleTokenChange(eventKey || KEYWORD_ALL)} + > + +
+ + {tokenSymbol.toUpperCase()} +
+
+ + {tokensSymbols().map((item) => ( + + {item.name} + + ))} + +
+
+
+
Status
+ handleStatusChange(eventKey || KEYWORD_ALL)}> + +
+ {capitalize(currentStatus)} +
+
+ + {statusList.map((item) => ( + + {item.name} + + ))} + +
+
+ {isInLayer1(currentNetwork.chainId) && ( +
+
+ <>{t("mode")} +
+ handleModeChange(eventKey || "ALL")} + > + +
+ {capitalize(vaultMode)} +
+
+ + {modeList.map((item) => ( + + {item.name} + + ))} + +
+
+ )} +
+
Ratio Range
+ + +
+ + {currentMinRatio} {currentMaxRatio} + +
+
+ +
+ + + +
+ +
+
+
+
+
Vaults
+ handleVaultOwnerFilterChange(eventKey || "1")}> + +
+ {capitalize(currentOwnerFilter.name)} +
+
+ + + {vaultsOwnerFilter[0].name} + + + {vaultsOwnerFilter[1].name} + + +
+
+
+ +
+
+ + ); + + const isLoadingVaults = () => + loading || + loadingByUser || + loadingByCollateral || + loadingByStatus || + loadingByTS || + loadingInLiq || + loadingTokenInLiq || + filteringRatios; + + return ( +
+ + {!isMobile ? ( + + + + + + {isLoadingVaults() ? ( + + ) : ( + ) => setVaultList(v)} + currentStatus={currentStatus} + pagination={pagination} + refresh={updateLiquidatedVault} + setVaultToUpdate={setVaultToUpdate} + myVaults={currentOwnerFilter.value === "1"} + /> + )} + + {pagination.pages > 0 && !loading && ( + + )} + + + + ) : ( + <> + + + +
Filters
+
+ + + +
+
+ + {loading || filteringRatios ? ( + + ) : ( + <> + ) => setVaultList(v)} + currentStatus={currentStatus} + pagination={pagination} + refresh={updateLiquidatedVault} + setVaultToUpdate={setVaultToUpdate} + myVaults={currentOwnerFilter.value === "1"} + /> + + )} + + )} +
+ ); +}; + +export default Monitoring; diff --git a/src/components/Vaults/types.tsx b/src/components/Vaults/types.tsx index 8c66dc8..6fb3a08 100644 --- a/src/components/Vaults/types.tsx +++ b/src/components/Vaults/types.tsx @@ -8,6 +8,8 @@ export type PaginationType = { lastDataPage: number; itemsPerPage: number; itemsCount: number; + totalItems: number; + totalPages: number; lastId: string; }; diff --git a/src/hooks/index.tsx b/src/hooks/index.tsx index 13177b0..1425dc3 100644 --- a/src/hooks/index.tsx +++ b/src/hooks/index.tsx @@ -33,3 +33,5 @@ export * from "./useTokens"; export * from "./useVault"; export * from "./useVaults"; + +export * from "./useVaultsSummary"; diff --git a/src/hooks/useVaultsSummary.tsx b/src/hooks/useVaultsSummary.tsx new file mode 100644 index 0000000..188dfe0 --- /dev/null +++ b/src/hooks/useVaultsSummary.tsx @@ -0,0 +1,161 @@ +import { useEffect, useState } from "react"; +import { ethers } from "ethers"; +import { gql, useQuery } from "@apollo/client"; +import { OraclePricesType } from "./types"; +import { getCollateralPrice, VAULT_STATUS } from "../components/Vaults/common"; +import { BIG_NUMBER_ZERO } from "../utils/constants"; + +const VAULT_SUMMARY = gql` + query VaultSummary { + protocols { + id + totalCollateral + totalDebt + createdVaults + underlyingToken { + symbol + } + } + vaultSummaryByStatuses { + id + status + totalCollateral + totalDebt + vaultsAmount + underlyingToken { + symbol + } + } + } +`; + +type VaultSummary = { + id: string; + collateral: string; + collateralUsd: string; + debt: string; + vaultsAmount: number; +}; + +export const useVaultsSummary = ( + prices: OraclePricesType, + loadingPrices: boolean +): [() => {}, Array] => { + const { loading, data, refetch } = useQuery(VAULT_SUMMARY, { + fetchPolicy: "no-cache", + notifyOnNetworkStatusChange: true, + }); + const [vaultsSummary, setVaultsSummary] = useState>([]); + + const loadSummary = (protocols: any, vaultSummaryByStatuses: any) => { + const s = new Array(); + if (protocols && Array.isArray(protocols)) { + let totalCollateral = ethers.BigNumber.from("0"); + let totalCollateralUsd = 0; + let totalDebt = ethers.BigNumber.from("0"); + let vaultsAmount = ethers.BigNumber.from("0"); + + protocols.forEach((item: any) => { + const cPrice = getCollateralPrice(prices, item.underlyingToken.symbol); + const collateralUsd = + parseFloat(ethers.utils.formatEther(item.totalCollateral)) * parseFloat(cPrice); + s.push({ + id: item.id, + collateral: item.totalCollateral, + collateralUsd: collateralUsd.toFixed(2), + debt: ethers.utils.formatEther(item.totalDebt), + vaultsAmount: item.createdVaults, + }); + + totalCollateralUsd += collateralUsd; + totalCollateral = totalCollateral.add(item.totalCollateral); + totalDebt = totalDebt.add(item.totalDebt); + vaultsAmount = vaultsAmount.add(item.createdVaults); + }); + s.push({ + id: "all", + collateral: "0", + collateralUsd: totalCollateralUsd.toFixed(2), + debt: ethers.utils.formatEther(totalDebt), + vaultsAmount: vaultsAmount.toNumber(), + }); + } + + if (vaultSummaryByStatuses) { + let vEmptyAmount = 0; + let vReadyAmount = 0; + let vActiveAmount = 0; + let vReadyCollaterall = 0; + let vActiveCollaterall = 0; + let vActiveDebt = BIG_NUMBER_ZERO; + + vaultSummaryByStatuses.forEach((item: any) => { + const cPrice = getCollateralPrice(prices, item.underlyingToken.symbol); + const collateralUsd = + parseFloat(ethers.utils.formatEther(item.totalCollateral)) * parseFloat(cPrice); + + if (item.status === VAULT_STATUS.empty) { + vEmptyAmount += parseInt(item.vaultsAmount); + } else if (item.status === VAULT_STATUS.ready) { + vReadyAmount += parseInt(item.vaultsAmount); + vReadyCollaterall += collateralUsd; + } else { + vActiveAmount += parseInt(item.vaultsAmount); + vActiveCollaterall += collateralUsd; + vActiveDebt = vActiveDebt.add(item.totalDebt); + } + + s.push({ + id: item.id, + collateral: item.totalCollateral, + collateralUsd: collateralUsd.toFixed(2), + debt: ethers.utils.formatEther(item.totalDebt), + vaultsAmount: parseInt(item.vaultsAmount), + }); + }); + + s.push({ + id: VAULT_STATUS.empty, + collateral: "0", + collateralUsd: "0", + debt: "0", + vaultsAmount: vEmptyAmount, + }); + s.push({ + id: VAULT_STATUS.ready, + collateral: "0", + collateralUsd: vReadyCollaterall.toFixed(2), + debt: "0", + vaultsAmount: vReadyAmount, + }); + s.push({ + id: VAULT_STATUS.active, + collateral: "0", + collateralUsd: vActiveCollaterall.toFixed(2), + debt: ethers.utils.formatEther(vActiveDebt), + vaultsAmount: vActiveAmount, + }); + } + + setVaultsSummary(s); + }; + + useEffect( + () => { + const load = () => { + if (!loading && data && !loadingPrices) { + loadSummary(data.protocols, data.vaultSummaryByStatuses); + } + }; + load(); + }, + // eslint-disable-next-line + [loading, data, loadingPrices] + ); + + const refetchSummary = async () => { + await refetch(); + }; + + return [refetchSummary, vaultsSummary]; +}; From 62d7b7f3b0e42ce54cbedd8e296273d32c04e51d Mon Sep 17 00:00:00 2001 From: jdestephen Date: Sun, 26 Feb 2023 21:31:37 -0600 Subject: [PATCH 261/278] loading all liquidable vaults at once --- .../Vaults/monitoring/GraphqlQueries.tsx | 10 ++-- src/components/Vaults/monitoring/index2.tsx | 59 +++++++++++++------ 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/src/components/Vaults/monitoring/GraphqlQueries.tsx b/src/components/Vaults/monitoring/GraphqlQueries.tsx index 4b301d9..cffb66c 100644 --- a/src/components/Vaults/monitoring/GraphqlQueries.tsx +++ b/src/components/Vaults/monitoring/GraphqlQueries.tsx @@ -118,11 +118,12 @@ export const VAULTS_BY_TOKEN_STATUS = gql` `; export const VAULTS_IN_LIQ = gql` - query VAULTS_BY_TS($lastBlockTS: String!) { + query VAULTS_IN_LIQ($lastBlockTS: String!) { vaults( first: 1000 orderBy: blockTS - where: { blockTS_gt: $lastBlockTS, status: "active", debt_gt: 100000000 } + orderDirection: asc + where: { blockTS_gt: $lastBlockTS, status: "active", debt_gt: 1000000000000000 } ) { id vaultId @@ -144,15 +145,16 @@ export const VAULTS_IN_LIQ = gql` `; export const VAULTS_IN_LIQ_BY_TOKEN = gql` - query VAULTS_BY_TS($lastBlockTS: String!, $symbol: String!) { + query VAULTS_IN_LIQ_BY_TOKEN($lastBlockTS: String!, $symbol: String!) { vaults( first: 1000 orderBy: blockTS + orderDirection: asc where: { blockTS_gt: $lastBlockTS tokenSymbol: $symbol status: "active" - debt_gt: 100000000 + debt_gt: 1000000000000000 } ) { id diff --git a/src/components/Vaults/monitoring/index2.tsx b/src/components/Vaults/monitoring/index2.tsx index cee72c8..e9e678d 100644 --- a/src/components/Vaults/monitoring/index2.tsx +++ b/src/components/Vaults/monitoring/index2.tsx @@ -106,6 +106,7 @@ const Monitoring = ({ currentAddress, setVaultToUpdate }: props) => { const [vaultList, setVaultList] = useState>([]); const [pagination, setPagination] = useState(pagDefault); const [loadingMore, setLoadingMore] = useState(false); + const [allVaultsFirstLoad, setAllVaultsFirstLoad] = useState(true); const [byCollateralFirstLoad, setByCollateralFirstLoad] = useState(true); const [byStatusFirstLoad, setByStatusFirstLoad] = useState(true); const [byTSFirstLoad, setByTSFirstLoad] = useState(true); @@ -299,10 +300,12 @@ const Monitoring = ({ currentAddress, setVaultToUpdate }: props) => { const itemsCount = vData.length; const pages = Math.ceil(itemsCount / itemsPerPage); const lastDataPage = Math.ceil(itemsCount / itemsPerPage); + const isOneFirstPage = !(loadingMore && currentStatus !== VAULT_STATUS.liquidation); + const pag = { previous: 0, - current: loadingMore ? pagination.pages + 1 : 1, - next: loadingMore ? pagination.pages + 2 : 2, + current: isOneFirstPage ? 1 : pagination.pages + 1, + next: isOneFirstPage ? 2 : pagination.pages + 2, pages, lastDataPage, itemsPerPage, @@ -370,14 +373,15 @@ const Monitoring = ({ currentAddress, setVaultToUpdate }: props) => { const loadVaults = async (vaultsData: any, cStatus: string) => { let vData = new Array(); + let totals = { ...totalsDefault }; let vaultsAmount = 0; - console.log("vaultsData: ", vaultsData.vaults.length); + let currentLastBlockTS = pagination.lastId; if (loadingMore) { vData = vaultList; + totals = vaultsTotals; } const vLiquidables = new Array(); - const totals = { ...totalsDefault }; const minFilterRatio = getMinRangeRatio(); const maxFilterRatio = getMaxRangeRatio(); @@ -451,6 +455,8 @@ const Monitoring = ({ currentAddress, setVaultToUpdate }: props) => { totals.debtUSD = (parseFloat(totals.debtUSD) + debtUSD).toFixed(2); } } + + currentLastBlockTS = v.blockTS; } }); @@ -483,6 +489,20 @@ const Monitoring = ({ currentAddress, setVaultToUpdate }: props) => { confPagination(vData, pagination.itemsPerPage, vaultsAmount); setFilteringRatios(false); setLoadingMore(false); + + if (cStatus === VAULT_STATUS.liquidation) { + if (vaultsData.vaults.length >= 1000) { + const lastVId = currentLastBlockTS; + setLoadingMore(true); + if (tokenSymbol !== KEYWORD_ALL) { + // eslint-disable-next-line no-use-before-define + refetchTokenInLiq({ lastBlockTS: lastVId, symbol: tokenSymbol }); + } else { + // eslint-disable-next-line no-use-before-define + refetchInLiq({ lastBlockTS: lastVId }); + } + } + } }; // Graphql queries @@ -659,19 +679,14 @@ const Monitoring = ({ currentAddress, setVaultToUpdate }: props) => { confPagination(vaultList, parseInt(number), vaultsTotals.vaults); }; - const handleVaultOwnerFilterChange = (value: string) => { - setCurrentOwnerFilter(vaultsOwnerFilter[parseInt(value)]); - if (value === "0") { - setPagination(pagDefault); - loadVaultData(); - } else { - loadVaulsByUser(); - } - }; - const handleFiltersChange = (newStatus: string, newToken: string) => { if (newStatus === KEYWORD_ALL && newToken === KEYWORD_ALL) { - refetchVaults({ lastBlockTS: "0" }); + if (allVaultsFirstLoad) { + setAllVaultsFirstLoad(false); + loadVaultData(); + } else { + refetchVaults({ lastBlockTS: "0" }); + } } else if (newStatus === VAULT_STATUS.liquidation) { if (newToken !== KEYWORD_ALL) { if (byTokenInLiqFirstLoad) { @@ -710,6 +725,16 @@ const Monitoring = ({ currentAddress, setVaultToUpdate }: props) => { } }; + const handleVaultOwnerFilterChange = (value: string) => { + setCurrentOwnerFilter(vaultsOwnerFilter[parseInt(value)]); + if (value === "0") { + setPagination(pagDefault); + handleFiltersChange(currentStatus, tokenSymbol); + } else { + loadVaulsByUser(); + } + }; + const handleStatusChange = (newStatus: string) => { setCurrentStatus(newStatus); if (isMyVaults()) { @@ -722,10 +747,8 @@ const Monitoring = ({ currentAddress, setVaultToUpdate }: props) => { const handleTokenChange = (newToken: string) => { setTokenSymbol(newToken); if (isMyVaults()) { - console.log("Entra aqui myyvaults "); loadVaulsByUser(); } else { - console.log("Entra aqui: ", newToken); handleFiltersChange(currentStatus, newToken); } }; @@ -1053,7 +1076,7 @@ const Monitoring = ({ currentAddress, setVaultToUpdate }: props) => { /> )} - {pagination.pages > 0 && !loading && ( + {pagination.pages > 0 && !isLoadingVaults() && ( )} From b7f0726b1ed43935ba91725f89aaeb7107a30303 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 16 Mar 2023 18:21:57 -0600 Subject: [PATCH 262/278] checking all incentives --- src/components/Farm/UniV3Rewards/Rewards.tsx | 57 +++++++++++++++++--- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 6e5a664..3dfe7be 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -131,9 +131,14 @@ const Rewards = ({ if (p.poolAddress === ethTcapPool.id.toLowerCase()) { const position = { ...positionDefaultValues }; const incentiveId = computeIncentiveId(ethTcapPool.incentives[0]); + let incentiveIdBefore = ""; + let incentiveIdBefore2 = ""; + let incentiveIdBefore3 = ""; if (ethTcapPool.incentives.length > 1) { incentiveIdBefore = computeIncentiveId(ethTcapPool.incentives[1]); + incentiveIdBefore2 = computeIncentiveId(ethTcapPool.incentives[2]); + incentiveIdBefore3 = computeIncentiveId(ethTcapPool.incentives[3]); } position.lpTokenId = p.id; position.poolId = p.poolAddress; @@ -151,15 +156,26 @@ const Rewards = ({ const lpDepositsCall = await stakerContractRead?.deposits(p.id); const lpStakesCall = await stakerContractRead?.stakes(p.id, incentiveId); const lpStakesCallBefore = await stakerContractRead?.stakes(p.id, incentiveIdBefore); + const lpStakesCallBefore2 = await stakerContractRead?.stakes(p.id, incentiveIdBefore2); + const lpStakesCallBefore3 = await stakerContractRead?.stakes(p.id, incentiveIdBefore3); // @ts-ignore - const [nfpAddress, depositsEth, stakesEth, stakesEthBefore] = - await signer.ethcallProvider?.all([ - nfpCall, - lpDepositsCall, - lpStakesCall, - lpStakesCallBefore, - ]); + const [ + nfpAddress, + depositsEth, + stakesEth, + stakesEthBefore, + stakesEthBefore2, + stakesEthBefore3, + ] = await signer.ethcallProvider?.all([ + nfpCall, + lpDepositsCall, + lpStakesCall, + lpStakesCallBefore, + lpStakesCallBefore2, + lpStakesCallBefore3, + ]); + if ( depositsEth.owner === ownerAddress && depositsEth.tickLower === position.tickLower && @@ -167,7 +183,31 @@ const Rewards = ({ ) { position.status = StakeStatus.deposited; // Check if it is staked on the previous Incentive - if (stakesEthBefore.liquidity > BigNumber.from("0")) { + if (stakesEthBefore3.liquidity > BigNumber.from("0")) { + position.status = StakeStatus.staked; + position.incetiveId = incentiveIdBefore3; + position.incentiveIndex = 3; + const rewardInfoCall = await stakerContractRead?.getRewardInfo( + ethTcapPool.incentives[3], + p.id + ); + // @ts-ignore + const [rewardInfo] = await signer.ethcallProvider?.all([rewardInfoCall]); + position.reward = parseFloat(ethers.utils.formatEther(rewardInfo.reward)); + } else if (stakesEthBefore2.liquidity > BigNumber.from("0")) { + // Check if it is staked on the previous Incentive + position.status = StakeStatus.staked; + position.incetiveId = incentiveIdBefore2; + position.incentiveIndex = 2; + const rewardInfoCall = await stakerContractRead?.getRewardInfo( + ethTcapPool.incentives[2], + p.id + ); + // @ts-ignore + const [rewardInfo] = await signer.ethcallProvider?.all([rewardInfoCall]); + position.reward = parseFloat(ethers.utils.formatEther(rewardInfo.reward)); + } else if (stakesEthBefore.liquidity > BigNumber.from("0")) { + // Check if it is staked on the previous Incentive position.status = StakeStatus.staked; position.incetiveId = incentiveIdBefore; position.incentiveIndex = 1; @@ -179,6 +219,7 @@ const Rewards = ({ const [rewardInfo] = await signer.ethcallProvider?.all([rewardInfoCall]); position.reward = parseFloat(ethers.utils.formatEther(rewardInfo.reward)); } else if (stakesEth.liquidity > BigNumber.from("0")) { + console.log("Entra incentive 0"); position.status = StakeStatus.staked; const rewardInfoCall = await stakerContractRead?.getRewardInfo( ethTcapPool.incentives[0], From bd0400ee98840abedb9a9bd3b70675086f67e535 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 17 Mar 2023 08:26:24 -0600 Subject: [PATCH 263/278] cleaning .log --- src/components/Farm/UniV3Rewards/Rewards.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 3dfe7be..62a1351 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -97,7 +97,6 @@ const Rewards = ({ ethTcapPool = UNIV3.mainnet.tcapPool; break; } - // console.log(computeIncentiveId(ethTcapPool.incentives[0])); setEthTcapIncentive(ethTcapPool.incentives); return ethTcapPool; From 4fad0ba2dd8e5abdb31a95ad66834ba84d2be327 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Fri, 17 Mar 2023 08:30:14 -0600 Subject: [PATCH 264/278] cleaning logs --- src/components/Farm/UniV3Rewards/Rewards.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 62a1351..310d724 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -218,7 +218,6 @@ const Rewards = ({ const [rewardInfo] = await signer.ethcallProvider?.all([rewardInfoCall]); position.reward = parseFloat(ethers.utils.formatEther(rewardInfo.reward)); } else if (stakesEth.liquidity > BigNumber.from("0")) { - console.log("Entra incentive 0"); position.status = StakeStatus.staked; const rewardInfoCall = await stakerContractRead?.getRewardInfo( ethTcapPool.incentives[0], From 46314a175b6402eb67fde75f0342cdb0bafa6215 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 3 Oct 2023 11:06:49 -0600 Subject: [PATCH 265/278] testing --- src/components/Governance/StakerStats.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index a04e2ba..68f7880 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -53,6 +53,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro currentWaitTimeCall, currentPeriodEndsCall, ]); + setTotalStaked(ethers.utils.formatEther(totalSupply)); setStake(ethers.utils.formatEther(currentStake)); setRewards(ethers.utils.formatEther(currentReward)); From b143d4ae2e92801b5c1a1251a284e51e65bcc254 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 3 Oct 2023 11:13:49 -0600 Subject: [PATCH 266/278] changing api endpoint --- src/utils/constants.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 42024ec..22e47f8 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -95,7 +95,7 @@ export const NETWORKS = { }, }; -export const API_ENDPOINT = "https://test-api.cryptex.finance"; +export const API_ENDPOINT = "https://api.cryptex.finance"; export const GRAPHQL_ENDPOINT = { mainnet: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-graph", From d421594d4c7bb0be678115bcb95ff7cf03016730 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 9 May 2024 15:43:58 -0600 Subject: [PATCH 267/278] show info when wallet not connected --- src/components/Governance/StakerStats.tsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 68f7880..7da2952 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -32,15 +32,25 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro useEffect(() => { async function load() { let currentWT = waitTime; - if (signer.signer && isInLayer1(currentNetwork.chainId) && governance.delegatorFactoryRead) { - const currentSignerAddress = await signer.signer.getAddress(); + if ( + signer.ethcallProvider && + isInLayer1(currentNetwork.chainId) && + governance.delegatorFactoryRead + ) { + let currentSignerAddress = "0x0000000000000000000000000000000000000000"; + if (signer.signer) { + currentSignerAddress = await signer.signer.getAddress(); + } + const totalSupplyCall = await governance.delegatorFactoryRead?.totalSupply(); + const currentStakeCall = await governance.delegatorFactoryRead?.balanceOf( currentSignerAddress ); const currentRewardCall = await governance.delegatorFactoryRead?.earned( currentSignerAddress ); + const currentWaitTimeCall = await governance.delegatorFactoryRead?.waitTime(); const currentPeriodEndsCall = await governance.delegatorFactoryRead?.periodFinish(); @@ -59,6 +69,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro setRewards(ethers.utils.formatEther(currentReward)); currentWT = parseInt(currentWaitTime.toString()); setWaitTime(currentWT); + setPeriodEnds(new Date(currentPeriodEnds.toNumber() * 1000)); } } From df02b9dab6a8709d777eb401c44fa4dc62efc99a Mon Sep 17 00:00:00 2001 From: Jorge Destephen Lavaire Date: Mon, 13 May 2024 12:37:13 -0600 Subject: [PATCH 268/278] Update KeeperForm.tsx --- src/components/Governance/KeeperForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Governance/KeeperForm.tsx b/src/components/Governance/KeeperForm.tsx index 7b0eb55..518998f 100644 --- a/src/components/Governance/KeeperForm.tsx +++ b/src/components/Governance/KeeperForm.tsx @@ -175,7 +175,7 @@ const KeeperForm = ({ }; const isDiscordValid = (value: string): boolean => { - const re = /^.{3,32}#[0-9]{4}$/; + const re = /^.{3,35}$/; if (value.trim().length > 0) { if (!re.test(value.trim())) { setDiscordError(t("governance.errors.invalid-discord")); From 85374fa83901690c3814abb62e387b5dbfee12a8 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 14 May 2024 15:18:20 -0600 Subject: [PATCH 269/278] upgtrading --- .eslintrc | 171 - package.json | 29 +- src/App.tsx | 54 +- src/components/Header.tsx | 19 +- src/state/Web3ModalContext.tsx | 79 - src/state/index.tsx | 2 - yarn.lock | 15176 ++++++++++++++----------------- 7 files changed, 6924 insertions(+), 8606 deletions(-) delete mode 100644 .eslintrc delete mode 100644 src/state/Web3ModalContext.tsx diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 40581f9..0000000 --- a/.eslintrc +++ /dev/null @@ -1,171 +0,0 @@ -{ - "extends": [ - "airbnb", - "plugin:react/recommended", - "plugin:jsx-a11y/strict", - "plugin:prettier/recommended", - "prettier/react" - ], - "parser": "babel-eslint", - "settings": { - "import/resolver": { - "node": { - "extensions": [ - ".js", - ".jsx", - ".ts", - ".tsx" - ] - } - } - }, - "parserOptions": { - "ecmaVersion": 2018, - // Can I remove these now? - "ecmaFeatures": { - "impliedStrict": true, - "classes": true - } - }, - "env": { - "browser": true, - "node": true, - "jquery": true, - "jest": true - }, - "rules": { - "no-debugger": 0, - "no-alert": 0, - "no-await-in-loop": 0, - "react/prop-types": "off", - "no-return-assign": [ - "error", - "except-parens" - ], - "no-restricted-syntax": [ - 2, - "ForInStatement", - "LabeledStatement", - "WithStatement" - ], - "no-unused-vars": [ - 1, - { - "vars": "all", - "ignoreRestSiblings": true, - "args": "all" - } - ], - "prefer-const": [ - "error", - { - "destructuring": "all" - } - ], - "arrow-body-style": [ - 2, - "as-needed" - ], - "no-unused-expressions": [ - 2, - { - "allowTaggedTemplates": true - } - ], - "no-param-reassign": [ - 2, - { - "props": false - } - ], - "no-array-constructor": "off", - "no-console": 0, - "import/prefer-default-export": 0, - "import": 0, - "func-names": 0, - "space-before-function-paren": 0, - "comma-dangle": 0, - "max-len": 0, - "import/extensions": 0, - "no-underscore-dangle": 0, - "consistent-return": 0, - "react/display-name": 1, - "react/no-array-index-key": 0, - "react/react-in-jsx-scope": 0, - "react/prefer-stateless-function": 0, - "react/forbid-prop-types": 0, - "react/no-unescaped-entities": 0, - "jsx-a11y/accessible-emoji": 0, - "react/require-default-props": 0, - "react/jsx-filename-extension": [ - 1, - { - "extensions": [ - ".js", - ".jsx", - ".ts", - ".tsx" - ] - } - ], - "radix": 0, - "no-shadow": [ - 2, - { - "hoist": "all", - "allow": [ - "resolve", - "reject", - "done", - "next", - "err", - "error" - ] - } - ], - "quotes": [ - 2, - "double", - { - "avoidEscape": true, - "allowTemplateLiterals": true - } - ], - "prettier/prettier": [ - "error", - { - "trailingComma": "es5", - "singleQuote": false - } - ], - "jsx-a11y/href-no-hash": "off", - "jsx-a11y/anchor-is-valid": [ - "warn", - { - "aspects": [ - "invalidHref" - ] - } - ], - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "warn", - "react/destructuring-assignment": "off", - "react/jsx-props-no-spreading": [ - "error", - { - "html": "enforce", - "custom": "enforce", - "exceptions": [ - "Container" - ] - } - ], - "react/jsx-no-bind": 0 - }, - "plugins": [ - "html", - "prettier", - "react-hooks", - "@typescript-eslint" - ] -} \ No newline at end of file diff --git a/package.json b/package.json index 37d1164..1620394 100644 --- a/package.json +++ b/package.json @@ -13,13 +13,12 @@ "@testing-library/user-event": "^12.1.10", "@typeform/embed-react": "^2.1.0", "@types/jest": "^26.0.15", - "@types/node": "^14.14.2", "@types/react": "^18.0.24", "@types/react-dom": "^18.0.8", - "@walletconnect/web3-provider": "^1.3.6", + "@web3modal/ethers5": "^4.1.11", "bootstrap": "^4.5.3", "compressorjs": "1.1.1", - "ethers": "^5.5.2", + "ethers": "5.7.2", "ethers-multicall": "^0.2.1", "graphql": "^15.4.0", "i18next": "^21.6.6", @@ -27,7 +26,6 @@ "i18next-http-backend": "^1.3.1", "keccak256": "^1.0.6", "merkletreejs": "^0.2.32", - "node-sass": "^4.14.1", "qs": "^6.11.0", "react": "^18.0.0", "react-bootstrap": "^2.5.0", @@ -37,35 +35,24 @@ "react-number-format": "^4.4.1", "react-responsive": "^9.0.2", "react-router-dom": "^5.2.0", - "react-scripts": "4.0.0", + "react-scripts": "5.0.1", "react-swipeable": "^6.1.0", - "react-toastify": "^6.1.0", + "react-toastify": "^10.0.5", "resolve-url-loader": "^3.1.2", - "sass": "^1.57.1", - "sass-loader": "^10.0.4", + "sass": "^1.58.3", + "sass-loader": "^13.2.0", "sourcemap-codec": "^1.4.8", "typescript": "4.0.5", "walletlink": "^2.4.2", - "web-vitals": "^0.2.4", - "web3modal": "^1.9.8" + "web-vitals": "^2.1.0" }, "devDependencies": { "@babel/core": "7.12.3", "@babel/preset-env": "7.12.1", "@types/react-router-dom": "^5.1.6", "@typescript-eslint/parser": "^4.5.0", - "babel-eslint": "^10.1.0", "dotenv": "8.2.0", - "eslint": "7.12.0", - "eslint-config-airbnb": "^18.2.0", - "eslint-config-prettier": "^6.14.0", - "eslint-plugin-flowtype": "5.2.0", - "eslint-plugin-html": "^6.1.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-jsx-a11y": "^6.3.1", - "eslint-plugin-prettier": "^3.1.4", - "eslint-plugin-react": "^7.21.5", - "eslint-plugin-react-hooks": "4.2.0", + "postcss-normalize": "^10.0.1", "prettier": "^2.1.2", "pretty-quick": "3.1.0", "ts-node": "9.0.0" diff --git a/src/App.tsx b/src/App.tsx index 9609adb..b99bbd5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,7 +5,8 @@ import { ethers } from "ethers"; import { Provider, Contract, setMulticallAddress } from "ethers-multicall"; import { ToastContainer } from "react-toastify"; import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; -import { getProviderInfo } from "web3modal"; +import { createWeb3Modal, defaultConfig } from '@web3modal/ethers5/react' + import "./i18n"; import "react-toastify/dist/ReactToastify.css"; import "./styles/toast.scss"; @@ -33,7 +34,6 @@ import { signerContext, tokensContext, vaultsContext, - Web3ModalContext, } from "./state"; import cryptexJson from "./contracts/cryptex.json"; import ERC20 from "./contracts/ERC20.json"; @@ -58,9 +58,48 @@ const clientOracle = (graphqlEndpoint: string) => cache: new InMemoryCache(), }); + +const projectId = process.env.REACT_APP_WALLET_CONNECT_ID || ""; + +const mainnet = { + chainId: 1, + name: 'Ethereum', + currency: 'ETH', + explorerUrl: 'https://etherscan.io', + rpcUrl: 'https://cloudflare-eth.com' +} + +const arbitrum = { + chainId: 42161, + name: 'Arbitrum One', + currency: 'ETH', + explorerUrl: 'https://arbiscan.io/', + rpcUrl: 'https://arb1.arbitrum.io/' +} + +const metadata = { + name: 'Cryptex Finance V1', + description: 'Building innovative, open-source index tokens that empower the crypto and NFT community.', + url: 'https://cryptex.finance/', // origin must match your domain & subdomain + icons: ['https://avatars.mywebsite.com/'] +} + +/* +const ethersConfig = defaultConfig({ + metadata, + defaultChainId: 1, // used for the Coinbase SDK +}) + +createWeb3Modal({ + ethersConfig, + chains: [mainnet, arbitrum], + projectId, + enableAnalytics: true // Optional - defaults to your Cloud configuration +}) +*/ + const App = () => { const signer = hooks.useSigner(); - const web3Modal = useContext(Web3ModalContext); const [isLoadingContracts, setLoadingContracts] = useState(false); const [invalidNetwork, setInvalidNetwork] = useState(false); const isMobile = useMediaQuery("only screen and (max-width: 600px)"); @@ -888,7 +927,7 @@ const App = () => { } }; - web3Modal.on("connect", async (networkProvider) => { + /* web3Modal.on("connect", async (networkProvider) => { setLoadingContracts(true); const currentProvider = new ethers.providers.Web3Provider(networkProvider); const network = await currentProvider.getNetwork(); @@ -934,13 +973,14 @@ const App = () => { } setLoadingContracts(false); - }); + }); */ useEffect(() => { async function loadProvider() { - if (web3Modal.cachedProvider && !signer.signer) { + // if (web3Modal.cachedProvider && !signer.signer) { + if (!signer.signer) { if (!isLoadingContracts) { - await web3Modal.connect(); + // await web3Modal.connect(); } } else { setLoadingContracts(true); diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 71182b3..77b3611 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -7,7 +7,7 @@ import Tooltip from "react-bootstrap/esm/Tooltip"; import { useTranslation } from "react-i18next"; import "../styles/header.scss"; import Davatar from "@davatar/react"; -import { networkContext, signerContext, Web3ModalContext } from "../state"; +import { networkContext, signerContext } from "../state"; import { makeShortAddress, getENS, @@ -33,7 +33,6 @@ type props = { const Header = ({ signerAddress, isMobile }: props) => { const { t } = useTranslation(); - const web3Modal = useContext(Web3ModalContext); const signer = useContext(signerContext); const currentNetwork = useContext(networkContext); const [address, setAddress] = useState("0x0000000000000000000000000000000000000000"); @@ -302,21 +301,12 @@ const Header = ({ signerAddress, isMobile }: props) => {
- - {/* */} +
) : ( <> + {/* - {/* */} + */} )} diff --git a/src/state/Web3ModalContext.tsx b/src/state/Web3ModalContext.tsx deleted file mode 100644 index 04d5ace..0000000 --- a/src/state/Web3ModalContext.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import React from "react"; - -import Web3Modal from "web3modal"; -import WalletConnectProvider from "@walletconnect/web3-provider"; -import WalletLink from "walletlink"; -import okxImage from "../assets/images/okx.png"; - -let network = "mainnet"; - -switch (process.env.REACT_APP_NETWORK_ID) { - case "1": - network = "mainnet"; - break; - case "3": - network = "ropsten"; - break; - case "4": - network = "rinkeby"; - break; - case "5": - network = "goerli"; - break; - case "69": - network = "optimism-kovan"; - break; - case "137": - network = "polygon"; - break; - default: - break; -} - -const providerOptions = { - injected: { - package: null, - options: { - infuraId: process.env.REACT_APP_INFURA_ID, - }, - }, - walletlink: { - package: WalletLink, // Required - options: { - appName: "Cryptex Finance", // Required - infuraId: process.env.REACT_APP_INFURA_ID, - }, - }, - walletconnect: { - package: WalletConnectProvider, // required - options: { - infuraId: process.env.REACT_APP_INFURA_ID, // required - }, - }, - burnerconnect: { - display: { - logo: okxImage, - name: "OKX", - description: "Scan with OKX mobile app to connect", - }, - package: WalletConnectProvider, // required - options: { - infuraId: process.env.REACT_APP_INFURA_ID, // required - }, - }, -}; - -const web3Modal = new Web3Modal({ - network, - cacheProvider: true, // optional - providerOptions, // required - theme: { - background: "#1d1d3c", - main: "white", - secondary: "#f5f5f5", - border: "#e440f2", - hover: "rgba(241, 36, 255, 0.0)", - }, -}); - -export const Web3ModalContext = React.createContext(web3Modal); diff --git a/src/state/index.tsx b/src/state/index.tsx index c988b2f..a685e01 100644 --- a/src/state/index.tsx +++ b/src/state/index.tsx @@ -21,5 +21,3 @@ export * from "./SignerContext"; export * from "./TokensContext"; export * from "./VaultsContext"; - -export * from "./Web3ModalContext"; diff --git a/yarn.lock b/yarn.lock index c9121fe..5bfd634 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,62 +3,64 @@ "@adobe/css-tools@^4.0.1": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.1.0.tgz#417fef4a143f4396ad0b3b4351fee21323f15aa8" - integrity sha512-mMVJ/j/GbZ/De4ZHWbQAQO1J6iVnjtZLc9WEdkUQb8S/Bu2cAF2bETXUgMAdvMG3/ngtKmcNBe+Zms9bg6jnQQ== + version "4.3.3" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.3.tgz#90749bde8b89cd41764224f5aac29cd4138f75ff" + integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@apideck/better-ajv-errors@^0.3.1": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz#957d4c28e886a64a8141f7522783be65733ff097" + integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" "@apollo/client@^3.7.1": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.7.tgz#5eb6e8af24fb809c97c8f66c3faf9524f83c412b" - integrity sha512-Rp/pCWuJSjLN7Xl5Qi2NoeURmZYEU/TIUz0n/LOwEo1tGdU2W7/fGVZ8+5um58JeVYq4UoTGBKFxSVeG4s411A== + version "3.10.3" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.10.3.tgz#07b90daea8a2cc83b1aca992caed55e5e9572c9d" + integrity sha512-4EIgZnFmRO1laWv3NCxlVIxcvimG63djuAXvyXhpQH3wkNMv9SykrasKRN08+z+cn/fVisBOLmkSRdyNyP9f4A== dependencies: "@graphql-typed-document-node/core" "^3.1.1" - "@wry/context" "^0.7.0" - "@wry/equality" "^0.5.0" - "@wry/trie" "^0.3.0" + "@wry/caches" "^1.0.0" + "@wry/equality" "^0.5.6" + "@wry/trie" "^0.5.0" graphql-tag "^2.12.6" hoist-non-react-statics "^3.3.2" - optimism "^0.16.1" + optimism "^0.18.0" prop-types "^15.7.2" + rehackt "^0.1.0" response-iterator "^0.2.6" symbol-observable "^4.0.0" ts-invariant "^0.10.3" tslib "^2.3.0" zen-observable-ts "^1.2.5" -"@babel/code-frame@7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.5.5": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2", "@babel/code-frame@^7.8.3": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" -"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.20.14" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" - integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" + integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== "@babel/core@7.12.3": version "7.12.3" @@ -82,271 +84,283 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.5", "@babel/core@^7.8.4", "@babel/core@^7.9.0": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" - integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helpers" "^7.20.7" - "@babel/parser" "^7.20.7" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.12" - "@babel/types" "^7.20.7" - convert-source-map "^1.7.0" +"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" + integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.24.5" + "@babel/helpers" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.12.1", "@babel/generator@^7.20.7": - version "7.20.14" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" - integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== - dependencies: - "@babel/types" "^7.20.7" - "@jridgewell/gen-mapping" "^0.3.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/eslint-parser@^7.16.3": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz#3b0f7d383a540329a30a6a9937cfc89461d26217" + integrity sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.1" + +"@babel/generator@^7.12.1", "@babel/generator@^7.24.5", "@babel/generator@^7.7.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== + dependencies: + "@babel/types" "^7.24.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== +"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.12", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" - integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" - integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.2.1" - -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" + integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.24.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.24.5" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" - integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== - dependencies: - "@babel/types" "^7.20.7" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/types" "^7.20.2" + "@babel/types" "^7.22.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== +"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" + integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== dependencies: - "@babel/types" "^7.20.0" + "@babel/types" "^7.24.5" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== + dependencies: + "@babel/types" "^7.24.0" -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" + integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-simple-access" "^7.24.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/helper-validator-identifier" "^7.24.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" + integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== + +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" + integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5", "@babel/helper-simple-access@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" + integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== + dependencies: + "@babel/types" "^7.24.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" + integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== + dependencies: + "@babel/types" "^7.24.5" + +"@babel/helper-string-parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + +"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== + +"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helper-wrap-function@^7.22.20": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" + integrity sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw== + dependencies: + "@babel/helper-function-name" "^7.23.0" + "@babel/template" "^7.24.0" + "@babel/types" "^7.24.5" + +"@babel/helpers@^7.12.1", "@babel/helpers@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" + integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" + +"@babel/highlight@^7.24.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" + integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" +"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" + integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== -"@babel/helpers@^7.12.1", "@babel/helpers@^7.20.7": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" - integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" + integrity sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw== dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.13" - "@babel/types" "^7.20.7" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.5" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" + integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7", "@babel/parser@^7.7.0": - version "7.20.15" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" - integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" + integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.24.1" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" + integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.20.1": +"@babel/plugin-proposal-async-generator-functions@^7.12.1": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== @@ -356,7 +370,7 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": +"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.16.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -364,27 +378,16 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" - integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-proposal-decorators@^7.16.4": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.13.tgz#b6bea3b18e88443688fa7ed2cc06d2c60da9f4a7" - integrity sha512-7T6BKHa9Cpd7lCueHBBzP0nkXNina+h5giOZw+a8ZpMfPFY19VjJAjIxyFHuWkhCWgL6QMqRiY/wB1fLXzm6Mw== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz#bab2b9e174a2680f0a80f341f3ec70f809f8bb4b" + integrity sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.12" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/plugin-syntax-decorators" "^7.19.0" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-decorators" "^7.24.1" -"@babel/plugin-proposal-dynamic-import@^7.12.1", "@babel/plugin-proposal-dynamic-import@^7.18.6": +"@babel/plugin-proposal-dynamic-import@^7.12.1": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== @@ -392,7 +395,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.1", "@babel/plugin-proposal-export-namespace-from@^7.18.9": +"@babel/plugin-proposal-export-namespace-from@^7.12.1": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== @@ -400,7 +403,7 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.12.1", "@babel/plugin-proposal-json-strings@^7.18.6": +"@babel/plugin-proposal-json-strings@^7.12.1": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== @@ -408,7 +411,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.12.1", "@babel/plugin-proposal-logical-assignment-operators@^7.18.9": +"@babel/plugin-proposal-logical-assignment-operators@^7.12.1": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== @@ -416,7 +419,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -424,7 +427,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.1", "@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.18.6": +"@babel/plugin-proposal-numeric-separator@^7.12.1", "@babel/plugin-proposal-numeric-separator@^7.16.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== @@ -432,7 +435,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.20.2": +"@babel/plugin-proposal-object-rest-spread@^7.12.1": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -443,7 +446,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.20.7" -"@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": +"@babel/plugin-proposal-optional-catch-binding@^7.12.1": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== @@ -451,16 +454,16 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" - integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== +"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.16.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": +"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.16.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== @@ -468,17 +471,12 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" - integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== -"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== @@ -514,12 +512,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz#5f13d1d8fce96951bea01a10424463c9a5b3a599" - integrity sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ== +"@babel/plugin-syntax-decorators@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz#71d9ad06063a6ac5430db126b5df48c70ee885fa" + integrity sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -535,21 +533,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" - integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== +"@babel/plugin-syntax-flow@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz#875c25e3428d7896c87589765fc8b9d32f24bd8d" + integrity sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-import-assertions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" + integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-attributes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" + integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -563,12 +568,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== +"@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -626,332 +631,477 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== +"@babel/plugin-syntax-typescript@^7.24.1", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" + integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-async-generator-functions@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" + integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz#3e1b2aa9cbbe1eb8d644c823141a9c5c2a22392d" - integrity sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA== +"@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" + integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-imports" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-remap-async-to-generator" "^7.22.20" -"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" - integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== +"@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" + integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz#89574191397f85661d6f748d4b89ee4d9ee69a2a" + integrity sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.5" + +"@babel/plugin-transform-class-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" + integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-class-static-block@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" + integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.24.4" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz#05e04a09df49a46348299a0e24bfd7e901129339" + integrity sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-split-export-declaration" "^7.24.5" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== +"@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" + integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/template" "^7.24.0" -"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" - integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz#80843ee6a520f7362686d1a97a7b53544ede453c" + integrity sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.24.5" -"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.24.1", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" + integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-duplicate-keys@^7.12.1", "@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.12.1", "@babel/plugin-transform-duplicate-keys@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" + integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-exponentiation-operator@^7.12.1", "@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-dynamic-import@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" + integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.12.1", "@babel/plugin-transform-exponentiation-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" + integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-export-namespace-from@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" + integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-transform-flow-strip-types@^7.16.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" - integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz#fa8d0a146506ea195da1671d38eed459242b2dcc" + integrity sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-flow" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-flow" "^7.24.1" -"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== +"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" + integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-function-name@^7.12.1", "@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-function-name@^7.12.1", "@babel/plugin-transform-function-name@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" + integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-literals@^7.12.1", "@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-json-strings@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" + integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-member-expression-literals@^7.12.1", "@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-literals@^7.12.1", "@babel/plugin-transform-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" + integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== +"@babel/plugin-transform-logical-assignment-operators@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" + integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" - integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== +"@babel/plugin-transform-member-expression-literals@^7.12.1", "@babel/plugin-transform-member-expression-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" + integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== +"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" + integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" + integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== +"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" + integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-identifier" "^7.22.20" -"@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" + integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-object-super@^7.12.1", "@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" - integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== +"@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" + integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" + integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-react-constant-elements@^7.9.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" - integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== +"@babel/plugin-transform-numeric-separator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" + integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== +"@babel/plugin-transform-object-rest-spread@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz#f91bbcb092ff957c54b4091c86bda8372f0b10ef" + integrity sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.24.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.24.5" -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== +"@babel/plugin-transform-object-super@^7.12.1", "@babel/plugin-transform-object-super@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" + integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-replace-supers" "^7.24.1" -"@babel/plugin-transform-react-jsx@^7.18.6": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz#f950f0b0c36377503d29a712f16287cedf886cbb" - integrity sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw== +"@babel/plugin-transform-optional-catch-binding@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" + integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.20.7" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== +"@babel/plugin-transform-optional-chaining@^7.24.1", "@babel/plugin-transform-optional-chaining@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz#a6334bebd7f9dd3df37447880d0bd64b778e600f" + integrity sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" + integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - regenerator-transform "^0.15.1" + "@babel/helper-plugin-utils" "^7.24.5" -"@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-private-methods@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" + integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-private-property-in-object@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz#f5d1fcad36e30c960134cb479f1ca98a5b06eda5" + integrity sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" + integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz#d493a0918b9fdad7540f5afd9b5eb5c52500d18d" + integrity sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" + integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" + +"@babel/plugin-transform-react-pure-annotations@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" + integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" + integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" + integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-runtime@^7.16.4", "@babel/plugin-transform-runtime@^7.5.5": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" - integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f" + integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ== + dependencies: + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-plugin-utils" "^7.24.0" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.1" + babel-plugin-polyfill-regenerator "^0.6.1" + semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" + integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.19.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" + integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.12.1", "@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-sticky-regex@^7.12.1", "@babel/plugin-transform-sticky-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" + integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" + integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-typeof-symbol@^7.12.1", "@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-typeof-symbol@^7.12.1", "@babel/plugin-transform-typeof-symbol@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz#703cace5ef74155fb5eecab63cbfc39bdd25fe12" + integrity sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.5" -"@babel/plugin-transform-typescript@^7.18.6": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz#e3581b356b8694f6ff450211fe6774eaff8d25ab" - integrity sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA== +"@babel/plugin-transform-typescript@^7.24.1": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz#bcba979e462120dc06a75bd34c473a04781931b8" + integrity sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.12" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.5" + "@babel/plugin-syntax-typescript" "^7.24.1" -"@babel/plugin-transform-unicode-escapes@^7.12.1", "@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-unicode-escapes@^7.12.1", "@babel/plugin-transform-unicode-escapes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" + integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-unicode-regex@^7.12.1", "@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-unicode-property-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" + integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-unicode-regex@^7.12.1", "@babel/plugin-transform-unicode-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" + integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-unicode-sets-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" + integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/preset-env@7.12.1": version "7.12.1" @@ -1025,38 +1175,28 @@ core-js-compat "^3.6.2" semver "^5.5.0" -"@babel/preset-env@^7.16.4", "@babel/preset-env@^7.8.4", "@babel/preset-env@^7.9.5": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.5.tgz#6a9ac90bd5a5a9dae502af60dfc58c190551bbcd" + integrity sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ== + dependencies: + "@babel/compat-data" "^7.24.4" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-assertions" "^7.24.1" + "@babel/plugin-syntax-import-attributes" "^7.24.1" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -1066,50 +1206,75 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.24.1" + "@babel/plugin-transform-async-generator-functions" "^7.24.3" + "@babel/plugin-transform-async-to-generator" "^7.24.1" + "@babel/plugin-transform-block-scoped-functions" "^7.24.1" + "@babel/plugin-transform-block-scoping" "^7.24.5" + "@babel/plugin-transform-class-properties" "^7.24.1" + "@babel/plugin-transform-class-static-block" "^7.24.4" + "@babel/plugin-transform-classes" "^7.24.5" + "@babel/plugin-transform-computed-properties" "^7.24.1" + "@babel/plugin-transform-destructuring" "^7.24.5" + "@babel/plugin-transform-dotall-regex" "^7.24.1" + "@babel/plugin-transform-duplicate-keys" "^7.24.1" + "@babel/plugin-transform-dynamic-import" "^7.24.1" + "@babel/plugin-transform-exponentiation-operator" "^7.24.1" + "@babel/plugin-transform-export-namespace-from" "^7.24.1" + "@babel/plugin-transform-for-of" "^7.24.1" + "@babel/plugin-transform-function-name" "^7.24.1" + "@babel/plugin-transform-json-strings" "^7.24.1" + "@babel/plugin-transform-literals" "^7.24.1" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" + "@babel/plugin-transform-member-expression-literals" "^7.24.1" + "@babel/plugin-transform-modules-amd" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-modules-systemjs" "^7.24.1" + "@babel/plugin-transform-modules-umd" "^7.24.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.24.1" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" + "@babel/plugin-transform-numeric-separator" "^7.24.1" + "@babel/plugin-transform-object-rest-spread" "^7.24.5" + "@babel/plugin-transform-object-super" "^7.24.1" + "@babel/plugin-transform-optional-catch-binding" "^7.24.1" + "@babel/plugin-transform-optional-chaining" "^7.24.5" + "@babel/plugin-transform-parameters" "^7.24.5" + "@babel/plugin-transform-private-methods" "^7.24.1" + "@babel/plugin-transform-private-property-in-object" "^7.24.5" + "@babel/plugin-transform-property-literals" "^7.24.1" + "@babel/plugin-transform-regenerator" "^7.24.1" + "@babel/plugin-transform-reserved-words" "^7.24.1" + "@babel/plugin-transform-shorthand-properties" "^7.24.1" + "@babel/plugin-transform-spread" "^7.24.1" + "@babel/plugin-transform-sticky-regex" "^7.24.1" + "@babel/plugin-transform-template-literals" "^7.24.1" + "@babel/plugin-transform-typeof-symbol" "^7.24.5" + "@babel/plugin-transform-unicode-escapes" "^7.24.1" + "@babel/plugin-transform-unicode-property-regex" "^7.24.1" + "@babel/plugin-transform-unicode-regex" "^7.24.1" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" -"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== +"@babel/preset-modules@^0.1.3": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6.tgz#31bcdd8f19538437339d17af00d177d854d9d458" + integrity sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -1117,98 +1282,213 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.16.0", "@babel/preset-react@^7.9.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== +"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" + integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.18.6" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-transform-react-display-name" "^7.24.1" + "@babel/plugin-transform-react-jsx" "^7.23.4" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.24.1" "@babel/preset-typescript@^7.16.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz#89bdf13a3149a17b3b2a2c9c62547f06db8845ec" + integrity sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-typescript" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-syntax-jsx" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-typescript" "^7.24.1" -"@babel/runtime-corejs3@^7.10.2": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.13.tgz#ad012857db412ab0b5ccf184b67be2cfcc2a1dcf" - integrity sha512-p39/6rmY9uvlzRiLZBIB3G9/EBr66LBMcYm7fIDeSBNdRjF2AGD3rFZucUyAgGHC2N+7DdLvVi33uTjSE44FIw== - dependencies: - core-js-pure "^3.25.1" - regenerator-runtime "^0.13.11" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.19.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" - integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== - dependencies: - regenerator-runtime "^0.13.11" +"@babel/runtime-corejs3@^7.10.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.24.5.tgz#d2a5f46a088caf8f3899ad095054f83b0a686194" + integrity sha512-GWO0mgzNMLWaSYM4z4NVIuY0Cd1fl8cPnuetuddu5w/qGuvt5Y7oUi/kvvQGK9xgOkFJDQX2heIvTRn/OQ1XTg== + dependencies: + core-js-pure "^3.30.2" + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.19.0", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" + integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.10.4", "@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + +"@babel/traverse@^7.12.1", "@babel/traverse@^7.24.5", "@babel/traverse@^7.7.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" + integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== + dependencies: + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/types" "^7.24.5" + debug "^4.3.1" + globals "^11.1.0" -"@babel/template@^7.10.4", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" - integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.13" - "@babel/types" "^7.20.7" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" + to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== +"@coinbase/wallet-sdk@3.9.1": + version "3.9.1" + resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.9.1.tgz#503a14671bb392d653623ef2340934e213ac971f" + integrity sha512-cGUE8wm1/cMI8irRMVOqbFWYcnNugqCtuy2lnnHfgloBg+GRLs9RsrkOUDMdv/StfUeeKhCDyYudsXXvcL1xIA== dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" + bn.js "^5.2.1" + buffer "^6.0.3" + clsx "^1.2.1" + eth-block-tracker "^7.1.0" + eth-json-rpc-filters "^6.0.0" + eventemitter3 "^5.0.1" + keccak "^3.0.3" + preact "^10.16.0" + sha.js "^2.4.11" + +"@csstools/normalize.css@*": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.1.1.tgz#f0ad221b7280f3fc814689786fd9ee092776ef8f" + integrity sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ== + +"@csstools/postcss-cascade-layers@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz#8a997edf97d34071dd2e37ea6022447dd9e795ad" + integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== + dependencies: + "@csstools/selector-specificity" "^2.0.2" + postcss-selector-parser "^6.0.10" -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" - integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== +"@csstools/postcss-color-function@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" + integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" -"@csstools/normalize.css@^10.1.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" - integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== +"@csstools/postcss-font-format-keywords@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" + integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-hwb-function@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" + integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" + integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" + integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-nested-calc@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" + integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" + integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" + integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" + integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-stepped-value-functions@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" + integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-text-decoration-shorthand@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" + integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" + integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" + integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== + +"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" + integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== "@davatar/react@^1.8.1": version "1.11.1" @@ -1226,58 +1506,69 @@ mersenne-twister "^1.1.0" react-blockies "^1.4.1" -"@emotion/is-prop-valid@^1.1.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" - integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: - "@emotion/memoize" "^0.8.0" - -"@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + eslint-visitor-keys "^3.3.0" -"@emotion/stylis@^0.8.4": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@emotion/unitless@^0.7.4": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@eslint/eslintrc@^0.2.0": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" - integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^12.1.0" - ignore "^4.0.6" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^3.13.1" - lodash "^4.17.19" - minimatch "^3.0.4" + js-yaml "^4.1.0" + minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@ethereumjs/common@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-3.2.0.tgz#b71df25845caf5456449163012074a55f048e0a0" + integrity sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA== dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" + "@ethereumjs/util" "^8.1.0" + crc-32 "^1.2.0" + +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/tx@^4.1.2", "@ethereumjs/tx@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-4.2.0.tgz#5988ae15daf5a3b3c815493bc6b495e76009e853" + integrity sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw== + dependencies: + "@ethereumjs/common" "^3.2.0" + "@ethereumjs/rlp" "^4.0.1" + "@ethereumjs/util" "^8.1.0" + ethereum-cryptography "^2.0.0" + +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" "@ethersproject/abi@5.0.0": version "5.0.0" @@ -1636,61 +1927,41 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@gar/promisify@^1.0.1": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - "@graphql-typed-document-node/core@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052" - integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== - -"@hapi/address@2.x.x": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" - integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== - -"@hapi/bourne@1.x.x": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" - integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== - -"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": - version "8.5.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" - integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== + version "3.2.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" + integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== -"@hapi/joi@^15.1.0": - version "15.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" - integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@hapi/address" "2.x.x" - "@hapi/bourne" "1.x.x" - "@hapi/hoek" "8.x.x" - "@hapi/topo" "3.x.x" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" -"@hapi/topo@3.x.x": - version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" - integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== - dependencies: - "@hapi/hoek" "^8.3.0" +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -1708,181 +1979,208 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" - integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^27.5.1" + jest-util "^27.5.1" slash "^3.0.0" -"@jest/core@^26.6.0", "@jest/core@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" - integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== dependencies: - "@jest/console" "^26.6.2" - "@jest/reporters" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" + emittery "^0.8.1" exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^26.6.2" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-resolve-dependencies "^26.6.3" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - jest-watcher "^26.6.2" - micromatch "^4.0.2" - p-each-series "^2.1.0" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^26.6.0", "@jest/environment@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== dependencies: - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" - jest-mock "^26.6.2" + jest-mock "^27.5.1" -"@jest/expect-utils@^29.4.1": - version "29.4.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.1.tgz#105b9f3e2c48101f09cae2f0a4d79a1b3a419cbb" - integrity sha512-w6YJMn5DlzmxjO00i9wu2YSozUYRBhIoJ6nQwpMYcBMtiqMGJm1QBzOf6DDgRao8dbtpDoaqLg6iiQTvv0UHhQ== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: - jest-get-type "^29.2.0" + jest-get-type "^29.6.3" -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== dependencies: - "@jest/types" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" -"@jest/globals@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" - integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== dependencies: - "@jest/environment" "^26.6.2" - "@jest/types" "^26.6.2" - expect "^26.6.2" + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" -"@jest/reporters@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" - integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.2" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" + istanbul-lib-instrument "^5.1.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^26.6.2" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" slash "^3.0.0" source-map "^0.6.0" string-length "^4.0.1" terminal-link "^2.0.0" - v8-to-istanbul "^7.0.0" - optionalDependencies: - node-notifier "^8.0.0" + v8-to-istanbul "^8.1.0" -"@jest/schemas@^29.4.0": - version "29.4.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.0.tgz#0d6ad358f295cc1deca0b643e6b4c86ebd539f17" - integrity sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ== +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== dependencies: - "@sinclair/typebox" "^0.25.16" + "@sinclair/typebox" "^0.24.1" -"@jest/source-map@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" - integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== dependencies: callsites "^3.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" source-map "^0.6.0" -"@jest/test-result@^26.6.0", "@jest/test-result@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" - integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== dependencies: - "@jest/console" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== dependencies: - "@jest/test-result" "^26.6.2" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - babel-plugin-istanbul "^6.0.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" slash "^3.0.0" source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^26.6.0", "@jest/types@^26.6.2": +"@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== @@ -1893,71 +2191,260 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@jest/types@^29.4.1": - version "29.4.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.1.tgz#f9f83d0916f50696661da72766132729dcb82ecb" - integrity sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA== +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== dependencies: - "@jest/schemas" "^29.4.0" + "@jest/schemas" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== + +"@lit-labs/ssr-dom-shim@^1.0.0", "@lit-labs/ssr-dom-shim@^1.1.0", "@lit-labs/ssr-dom-shim@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz#353ce4a76c83fadec272ea5674ede767650762fd" + integrity sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g== + +"@lit/reactive-element@^1.3.0", "@lit/reactive-element@^1.6.0": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-1.6.3.tgz#25b4eece2592132845d303e091bad9b04cdcfe03" + integrity sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@lit-labs/ssr-dom-shim" "^1.0.0" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@lit/reactive-element@^2.0.0", "@lit/reactive-element@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-2.0.4.tgz#8f2ed950a848016383894a26180ff06c56ae001b" + integrity sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ== + dependencies: + "@lit-labs/ssr-dom-shim" "^1.2.0" + +"@metamask/eth-json-rpc-provider@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz#3fd5316c767847f4ca107518b611b15396a5a32c" + integrity sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA== + dependencies: + "@metamask/json-rpc-engine" "^7.0.0" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^5.0.1" + +"@metamask/json-rpc-engine@^7.0.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.3.tgz#f2b30a2164558014bfcca45db10f5af291d989af" + integrity sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg== + dependencies: + "@metamask/rpc-errors" "^6.2.1" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^8.3.0" -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@metamask/rpc-errors@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@metamask/rpc-errors/-/rpc-errors-6.2.1.tgz#f5daf429ededa7cb83069dc621bd5738fe2a1d80" + integrity sha512-VTgWkjWLzb0nupkFl1duQi9Mk8TGT9rsdnQg6DeRrYEFxtFOh0IF8nAwxM/4GWqDl6uIB06lqUBgUrAVWl62Bw== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@metamask/utils" "^8.3.0" + fast-safe-stringify "^2.0.6" "@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== +"@metamask/safe-event-emitter@^3.0.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.1.tgz#e89b840a7af8097a8ed4953d8dc8470d1302d3ef" + integrity sha512-ihb3B0T/wJm1eUuArYP4lCTSEoZsClHhuWyfo/kMX3m/odpqNcPfsz5O2A3NT7dXCAgWPGDQGPqygCpgeniKMw== + +"@metamask/utils@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-5.0.2.tgz#140ba5061d90d9dac0280c19cab101bc18c8857c" + integrity sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g== + dependencies: + "@ethereumjs/tx" "^4.1.2" + "@types/debug" "^4.1.7" + debug "^4.3.4" + semver "^7.3.8" + superstruct "^1.0.3" + +"@metamask/utils@^8.3.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-8.4.0.tgz#f44812c96467a4e1b70b2edff6ee89a9caa4e354" + integrity sha512-dbIc3C7alOe0agCuBHM1h71UaEaEqOk2W8rAtEn8QGz4haH2Qq7MoK6i7v2guzvkJVVh79c+QCzIqphC3KvrJg== + dependencies: + "@ethereumjs/tx" "^4.2.0" + "@noble/hashes" "^1.3.1" + "@scure/base" "^1.1.3" + "@types/debug" "^4.1.7" + debug "^4.3.4" + pony-cause "^2.1.10" + semver "^7.5.4" + superstruct "^1.0.3" + uuid "^9.0.1" + +"@motionone/animation@^10.15.1", "@motionone/animation@^10.17.0": + version "10.17.0" + resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.17.0.tgz#7633c6f684b5fee2b61c405881b8c24662c68fca" + integrity sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg== + dependencies: + "@motionone/easing" "^10.17.0" + "@motionone/types" "^10.17.0" + "@motionone/utils" "^10.17.0" + tslib "^2.3.1" + +"@motionone/dom@^10.16.2", "@motionone/dom@^10.16.4": + version "10.17.0" + resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.17.0.tgz#519dd78aab0750a94614c69a82da5290cd617383" + integrity sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q== + dependencies: + "@motionone/animation" "^10.17.0" + "@motionone/generators" "^10.17.0" + "@motionone/types" "^10.17.0" + "@motionone/utils" "^10.17.0" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@motionone/easing@^10.17.0": + version "10.17.0" + resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.17.0.tgz#d66cecf7e3ee30104ad00389fb3f0b2282d81aa9" + integrity sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg== + dependencies: + "@motionone/utils" "^10.17.0" + tslib "^2.3.1" + +"@motionone/generators@^10.17.0": + version "10.17.0" + resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.17.0.tgz#878d292539c41434c13310d5f863a87a94e6e689" + integrity sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ== + dependencies: + "@motionone/types" "^10.17.0" + "@motionone/utils" "^10.17.0" + tslib "^2.3.1" + +"@motionone/svelte@^10.16.2": + version "10.16.4" + resolved "https://registry.yarnpkg.com/@motionone/svelte/-/svelte-10.16.4.tgz#5daf117cf5b2576fc6dd487c5e0500938a742470" + integrity sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA== + dependencies: + "@motionone/dom" "^10.16.4" + tslib "^2.3.1" + +"@motionone/types@^10.15.1", "@motionone/types@^10.17.0": + version "10.17.0" + resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.17.0.tgz#179571ce98851bac78e19a1c3974767227f08ba3" + integrity sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA== + +"@motionone/utils@^10.15.1", "@motionone/utils@^10.17.0": + version "10.17.0" + resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.17.0.tgz#cc0ba8acdc6848ff48d8c1f2d0d3e7602f4f942e" + integrity sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg== + dependencies: + "@motionone/types" "^10.17.0" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@motionone/vue@^10.16.2": + version "10.16.4" + resolved "https://registry.yarnpkg.com/@motionone/vue/-/vue-10.16.4.tgz#07d09e3aa5115ca0bcc0076cb9e5322775277c09" + integrity sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg== + dependencies: + "@motionone/dom" "^10.16.4" + tslib "^2.3.1" + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + +"@noble/curves@1.3.0", "@noble/curves@~1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" + integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== + dependencies: + "@noble/hashes" "1.3.3" + +"@noble/hashes@1.3.3", "@noble/hashes@~1.3.2": + 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== + +"@noble/hashes@^1.3.1", "@noble/hashes@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + "@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" @@ -1971,7 +2458,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -1979,85 +2466,176 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/fs@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" - integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== +"@parcel/watcher-android-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84" + integrity sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg== + +"@parcel/watcher-darwin-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz#c817c7a3b4f3a79c1535bfe54a1c2818d9ffdc34" + integrity sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA== + +"@parcel/watcher-darwin-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz#1a3f69d9323eae4f1c61a5f480a59c478d2cb020" + integrity sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg== + +"@parcel/watcher-freebsd-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz#0d67fef1609f90ba6a8a662bc76a55fc93706fc8" + integrity sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w== + +"@parcel/watcher-linux-arm-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz#ce5b340da5829b8e546bd00f752ae5292e1c702d" + integrity sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA== + +"@parcel/watcher-linux-arm64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz#6d7c00dde6d40608f9554e73998db11b2b1ff7c7" + integrity sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA== + +"@parcel/watcher-linux-arm64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz#bd39bc71015f08a4a31a47cd89c236b9d6a7f635" + integrity sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA== + +"@parcel/watcher-linux-x64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz#0ce29966b082fb6cdd3de44f2f74057eef2c9e39" + integrity sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg== + +"@parcel/watcher-linux-x64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz#d2ebbf60e407170bb647cd6e447f4f2bab19ad16" + integrity sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ== + +"@parcel/watcher-wasm@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-wasm/-/watcher-wasm-2.4.1.tgz#c4353e4fdb96ee14389856f7f6f6d21b7dcef9e1" + integrity sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA== dependencies: - "@gar/promisify" "^1.0.1" - semver "^7.3.5" + is-glob "^4.0.3" + micromatch "^4.0.5" + napi-wasm "^1.1.0" -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== +"@parcel/watcher-win32-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz#eb4deef37e80f0b5e2f215dd6d7a6d40a85f8adc" + integrity sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg== + +"@parcel/watcher-win32-ia32@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz#94fbd4b497be39fd5c8c71ba05436927842c9df7" + integrity sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw== + +"@parcel/watcher-win32-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz#4bf920912f67cae5f2d264f58df81abfea68dadf" + integrity sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A== + +"@parcel/watcher@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.4.1.tgz#a50275151a1bb110879c6123589dba90c19f1bf8" + integrity sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA== dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.4.1" + "@parcel/watcher-darwin-arm64" "2.4.1" + "@parcel/watcher-darwin-x64" "2.4.1" + "@parcel/watcher-freebsd-x64" "2.4.1" + "@parcel/watcher-linux-arm-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-musl" "2.4.1" + "@parcel/watcher-linux-x64-glibc" "2.4.1" + "@parcel/watcher-linux-x64-musl" "2.4.1" + "@parcel/watcher-win32-arm64" "2.4.1" + "@parcel/watcher-win32-ia32" "2.4.1" + "@parcel/watcher-win32-x64" "2.4.1" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@pmmmwh/react-refresh-webpack-plugin@0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.2.tgz#1f9741e0bde9790a0e13272082ed7272a083620d" - integrity sha512-Loc4UDGutcZ+Bd56hBInkm6JyjyCwWy4t2wcDXzN8EDPANgVRj0VP8Nxn0Zq2pc+WKauZwEivQgbDGg4xZO20A== +"@pmmmwh/react-refresh-webpack-plugin@^0.5.3": + version "0.5.13" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.13.tgz#02338a92a92f541a5189b97e922caf3215221e49" + integrity sha512-odZVYXly+JwzYri9rKqqUAk0cY6zLpv4dxoKinhoJNShV36Gpxf+CyDIILJ4tYsJ1ZxIWs233Y39iVnynvDA/g== dependencies: - ansi-html "^0.0.7" + ansi-html-community "^0.0.8" + core-js-pure "^3.23.3" error-stack-parser "^2.0.6" - html-entities "^1.2.1" - native-url "^0.2.6" - schema-utils "^2.6.5" + html-entities "^2.1.0" + loader-utils "^2.0.4" + schema-utils "^3.0.0" source-map "^0.7.3" "@popperjs/core@^2.11.6": - version "2.11.6" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" - integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@react-aria/ssr@^3.4.1": - version "3.4.1" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.4.1.tgz#79e8bb621487e8f52890c917d3c734f448ba95e7" - integrity sha512-NmhoilMDyIfQiOSdQgxpVH2tC2u85Y0mVijtBNbI9kcDYLEiW/r6vKYVKtkyU+C4qobXhGMPfZ70PTc0lysSVA== +"@react-aria/ssr@^3.5.0": + version "3.9.3" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.3.tgz#9e7d4e019965aaf86cec3da2411a392be49ac2b3" + integrity sha512-5bUZ93dmvHFcmfUcEN7qzYe8yQQ8JY+nHN6m9/iSDCQ/QmCiE0kWXYwhurjw5ch6I8WokQzx66xKIMHBAa4NNA== dependencies: - "@swc/helpers" "^0.4.14" + "@swc/helpers" "^0.5.0" "@react-hook/media-query@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@react-hook/media-query/-/media-query-1.1.1.tgz#7fc4e52591784a39be924b62b4270ae3e18ec578" integrity sha512-VM14wDOX5CW5Dn6b2lTiMd79BFMTut9AZj2+vIRT3LCKgMCYmdqruTtzDPSnIVDQdtxdPgtOzvU9oK20LopuOw== -"@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7": - version "0.4.8" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.8.tgz#67ada92e36527956865ab9b1ddfb87d37aa1db42" - integrity sha512-Ivvp1FZ0Lja80iUTYAhbzy+stxwO7FbPHP95ypCtIh0wyOLiayQywXhVJ2ZYP5S1AjW2GmKHeRU4UglMwTG2sA== +"@restart/hooks@^0.4.9": + version "0.4.16" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.16.tgz#95ae8ac1cc7e2bd4fed5e39800ff85604c6d59fb" + integrity sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w== dependencies: - dequal "^2.0.2" + dequal "^2.0.3" -"@restart/ui@^1.4.1": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.5.4.tgz#2537e1b7495f7ed4257dae3676c8d2b91e664e03" - integrity sha512-ziNtXY2PrjXrRUfR1D/ry1v1i5IF+kfMcH9d1kIcU2lOELfmDsVb+fzbyEDz3yKvKuqkphTunVDuLdYRJ0YsAg== +"@restart/ui@^1.6.8": + version "1.6.9" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.6.9.tgz#05ec905a56486fa39b62f29c09b3917e57acd62f" + integrity sha512-mUbygUsJcRurjZCt1f77gg4DpheD1D+Sc7J3JjAkysUj7t8m4EBJVOqWC9788Qtbc69cJ+HlJc6jBguKwS8Mcw== dependencies: - "@babel/runtime" "^7.20.7" + "@babel/runtime" "^7.21.0" "@popperjs/core" "^2.11.6" - "@react-aria/ssr" "^3.4.1" - "@restart/hooks" "^0.4.7" + "@react-aria/ssr" "^3.5.0" + "@restart/hooks" "^0.4.9" "@types/warning" "^3.0.0" dequal "^2.0.3" dom-helpers "^5.2.0" - uncontrollable "^7.2.1" + uncontrollable "^8.0.1" warning "^4.0.3" -"@rollup/plugin-node-resolve@^7.1.1": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" - integrity sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q== +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== dependencies: - "@rollup/pluginutils" "^3.0.8" - "@types/resolve" "0.0.8" - builtin-modules "^3.1.0" + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" is-module "^1.0.0" - resolve "^1.14.2" + resolve "^1.19.0" -"@rollup/plugin-replace@^2.3.1": +"@rollup/plugin-replace@^2.4.1": version "2.4.2" resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== @@ -2065,7 +2643,7 @@ "@rollup/pluginutils" "^3.1.0" magic-string "^0.25.7" -"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": +"@rollup/pluginutils@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== @@ -2074,10 +2652,42 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@sinclair/typebox@^0.25.16": - version "0.25.21" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" - integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== +"@rushstack/eslint-patch@^1.1.0": + version "1.10.2" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda" + integrity sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw== + +"@scure/base@^1.1.3", "@scure/base@~1.1.4": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.6.tgz#8ce5d304b436e4c84f896e0550c83e4d88cb917d" + integrity sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g== + +"@scure/bip32@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.3.tgz#a9624991dc8767087c57999a5d79488f48eae6c8" + integrity sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ== + dependencies: + "@noble/curves" "~1.3.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.4" + +"@scure/bip39@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.2.tgz#f3426813f4ced11a47489cbcf7294aa963966527" + integrity sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA== + dependencies: + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.4" + +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^1.7.0": version "1.8.6" @@ -2086,20 +2696,156 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== dependencies: "@sinonjs/commons" "^1.7.0" -"@surma/rollup-plugin-off-main-thread@^1.1.1": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58" - integrity sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A== +"@stablelib/aead@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/aead/-/aead-1.0.1.tgz#c4b1106df9c23d1b867eb9b276d8f42d5fc4c0c3" + integrity sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg== + +"@stablelib/binary@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/binary/-/binary-1.0.1.tgz#c5900b94368baf00f811da5bdb1610963dfddf7f" + integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== + dependencies: + "@stablelib/int" "^1.0.1" + +"@stablelib/bytes@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/bytes/-/bytes-1.0.1.tgz#0f4aa7b03df3080b878c7dea927d01f42d6a20d8" + integrity sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== + +"@stablelib/chacha20poly1305@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz#de6b18e283a9cb9b7530d8767f99cde1fec4c2ee" + integrity sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA== + dependencies: + "@stablelib/aead" "^1.0.1" + "@stablelib/binary" "^1.0.1" + "@stablelib/chacha" "^1.0.1" + "@stablelib/constant-time" "^1.0.1" + "@stablelib/poly1305" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/chacha@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha/-/chacha-1.0.1.tgz#deccfac95083e30600c3f92803a3a1a4fa761371" + integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/constant-time@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/constant-time/-/constant-time-1.0.1.tgz#bde361465e1cf7b9753061b77e376b0ca4c77e35" + integrity sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg== + +"@stablelib/ed25519@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/ed25519/-/ed25519-1.0.3.tgz#f8fdeb6f77114897c887bb6a3138d659d3f35996" + integrity sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg== + dependencies: + "@stablelib/random" "^1.0.2" + "@stablelib/sha512" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hash@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hash/-/hash-1.0.1.tgz#3c944403ff2239fad8ebb9015e33e98444058bc5" + integrity sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg== + +"@stablelib/hkdf@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hkdf/-/hkdf-1.0.1.tgz#b4efd47fd56fb43c6a13e8775a54b354f028d98d" + integrity sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g== + dependencies: + "@stablelib/hash" "^1.0.1" + "@stablelib/hmac" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hmac@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hmac/-/hmac-1.0.1.tgz#3d4c1b8cf194cb05d28155f0eed8a299620a07ec" + integrity sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/int@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/int/-/int-1.0.1.tgz#75928cc25d59d73d75ae361f02128588c15fd008" + integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== + +"@stablelib/keyagreement@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz#4612efb0a30989deb437cd352cee637ca41fc50f" + integrity sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg== + dependencies: + "@stablelib/bytes" "^1.0.1" + +"@stablelib/poly1305@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/poly1305/-/poly1305-1.0.1.tgz#93bfb836c9384685d33d70080718deae4ddef1dc" + integrity sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.2.tgz#2dece393636489bf7e19c51229dd7900eddf742c" + integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha256@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha256/-/sha256-1.0.1.tgz#77b6675b67f9b0ea081d2e31bda4866297a3ae4f" + integrity sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha512@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha512/-/sha512-1.0.1.tgz#6da700c901c2c0ceacbd3ae122a38ac57c72145f" + integrity sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/wipe@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" + integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== + +"@stablelib/x25519@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" + integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== dependencies: - ejs "^2.6.1" + "@stablelib/keyagreement" "^1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/wipe" "^1.0.1" + +"@surma/rollup-plugin-off-main-thread@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== + dependencies: + ejs "^3.1.6" + json5 "^2.2.0" magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" "@svgr/babel-plugin-add-jsx-attribute@^5.4.0": version "5.4.0" @@ -2155,7 +2901,7 @@ "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" "@svgr/babel-plugin-transform-svg-component" "^5.5.0" -"@svgr/core@^5.4.0": +"@svgr/core@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== @@ -2171,7 +2917,7 @@ dependencies: "@babel/types" "^7.12.6" -"@svgr/plugin-jsx@^5.4.0", "@svgr/plugin-jsx@^5.5.0": +"@svgr/plugin-jsx@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== @@ -2181,7 +2927,7 @@ "@svgr/hast-util-to-babel-ast" "^5.5.0" svg-parser "^2.0.2" -"@svgr/plugin-svgo@^5.4.0": +"@svgr/plugin-svgo@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== @@ -2190,24 +2936,24 @@ deepmerge "^4.2.2" svgo "^1.2.2" -"@svgr/webpack@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.4.0.tgz#b68bc86e29cf007292b96ced65f80971175632e0" - integrity sha512-LjepnS/BSAvelnOnnzr6Gg0GcpLmnZ9ThGFK5WJtm1xOqdBE/1IACZU7MMdVzjyUkfFqGz87eRE4hFaSLiUwYg== - dependencies: - "@babel/core" "^7.9.0" - "@babel/plugin-transform-react-constant-elements" "^7.9.0" - "@babel/preset-env" "^7.9.5" - "@babel/preset-react" "^7.9.4" - "@svgr/core" "^5.4.0" - "@svgr/plugin-jsx" "^5.4.0" - "@svgr/plugin-svgo" "^5.4.0" +"@svgr/webpack@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" -"@swc/helpers@^0.4.14": - version "0.4.14" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" - integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== +"@swc/helpers@^0.5.0": + version "0.5.11" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.11.tgz#5bab8c660a6e23c13b2d23fcd1ee44a2db1b0cb7" + integrity sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A== dependencies: tslib "^2.4.0" @@ -2226,9 +2972,9 @@ pretty-format "^26.6.2" "@testing-library/jest-dom@^5.11.4": - version "5.16.5" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" - integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== + version "5.17.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz#5e97c8f9a15ccf4656da00fecab505728de81e0c" + integrity sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg== dependencies: "@adobe/css-tools" "^4.0.1" "@babel/runtime" "^7.9.2" @@ -2260,28 +3006,33 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + "@typeform/embed-react@^2.1.0": - version "2.15.0" - resolved "https://registry.yarnpkg.com/@typeform/embed-react/-/embed-react-2.15.0.tgz#4f283c311ae8a5f75a563291747faebbd4f2e5a4" - integrity sha512-OO3gT96yMv+vMflXjYbsSS84qizjfkdCO39Y5kPalpRVvydCgT3KoxM+tdrWY6L2ciD1q+yQs1NZbYh63xFkuw== + version "2.31.0" + resolved "https://registry.yarnpkg.com/@typeform/embed-react/-/embed-react-2.31.0.tgz#60bd5c5d174d120a6c81dec14f0f6735f89fa6ab" + integrity sha512-DZKxt38/mi9cUDAwc5sofl7pMok2t5t8xX8RsxqG7m+2ytX7C3T/ih7zrP5tReBBM2u9mt3y3/llLSvASncqrw== dependencies: - "@typeform/embed" "2.8.0" + "@typeform/embed" "2.16.1" fast-deep-equal "^3.1.3" -"@typeform/embed@2.8.0": - version "2.8.0" - resolved "https://registry.yarnpkg.com/@typeform/embed/-/embed-2.8.0.tgz#45456b47103d27e818e426d782e0af0976909db8" - integrity sha512-+64uxHXbOefA9euw9gQUZ3WAvh+61wH6Vbl3x9WYQ3tAY2iM9gPTYhfxPDMdx/79KuRMIbHUKWpTD6PflaWy8w== +"@typeform/embed@2.16.1": + version "2.16.1" + resolved "https://registry.yarnpkg.com/@typeform/embed/-/embed-2.16.1.tgz#1c40330c10941b80af7800648eaee625071af038" + integrity sha512-CId70qZjKs//Y/MP69U3di/HT6zUR609+QImsgm0gaFodKHAxBZ1bbeg1VkLDD2q5jPbnb+D0KBhE4B28lsOWQ== "@types/aria-query@^4.2.0": version "4.2.2" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" - integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -2290,26 +3041,26 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" - integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.20.7" "@types/bn.js@^4.11.3": version "4.11.6" @@ -2318,43 +3069,93 @@ dependencies: "@types/node" "*" -"@types/bn.js@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" - integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" -"@types/eslint@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78" - integrity sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng== +"@types/debug@^4.1.7": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": + version "8.56.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" + integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== +"@types/estree@*", "@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz#3ae8ab3767d98d0b682cda063c3339e1e86ccfaa" + integrity sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ== dependencies: - "@types/minimatch" "*" "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" "@types/graceful-fs@^4.1.2": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" @@ -2363,34 +3164,46 @@ resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== -"@types/html-minifier-terser@^5.0.0": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" - integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": +"@types/http-errors@*": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/http-proxy@^1.17.8": + version "1.17.14" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@*": - version "29.4.0" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" - integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2403,79 +3216,93 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/minimatch@^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== -"@types/node@*": - version "18.11.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.19.tgz#35e26df9ec441ab99d73e99e9aca82935eea216d" - integrity sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw== +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== -"@types/node@^14.14.2": - version "14.18.36" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.36.tgz#c414052cb9d43fab67d679d5f3c641be911f5835" - integrity sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ== +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/node@*": + version "20.12.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.11.tgz#c4ef00d3507000d17690643278a60dc55a9dc9be" + integrity sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw== + dependencies: + undici-types "~5.26.4" "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/pbkdf2@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" - integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== dependencies: "@types/node" "*" -"@types/prettier@^2.0.0": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== +"@types/prettier@^2.1.5": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== "@types/q@^1.5.1": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" - integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + version "1.5.8" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.8.tgz#95f6c6a08f2ad868ba230ead1d2d7f7be3db3837" + integrity sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw== + +"@types/qs@*": + version "6.9.15" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" + integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/react-blockies@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@types/react-blockies/-/react-blockies-1.4.1.tgz#d5f6fff8ece3e90f2e7708f8f3156c87333312df" - integrity sha512-aDX0g0hwzdodkGLSDNUQr6gXxwclGjnhS8jhsR8uQhAfe/7i3GZD/NDcSlQ2SiQiLhfRxX3NlY+nvBwf5Y0tTg== + version "1.4.4" + resolved "https://registry.yarnpkg.com/@types/react-blockies/-/react-blockies-1.4.4.tgz#17c3650b89fdc267a4a9a9668dbb35ed7834c7dd" + integrity sha512-7QfFeT1y/izwP/Wxmnl9Ii73udFQIBsfI/IvG+841sPxqc7Pf79ZDZP3XQsmYzAjDXdoZXquLgI/Q/tmAZwB0w== dependencies: "@types/react" "*" "@types/react-dom@^18.0.8": - version "18.0.10" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.10.tgz#3b66dec56aa0f16a6cc26da9e9ca96c35c0b4352" - integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg== + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" @@ -2496,151 +3323,153 @@ "@types/history" "^4.7.11" "@types/react" "*" -"@types/react-transition-group@^4.4.4": - version "4.4.5" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" - integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== +"@types/react-transition-group@^4.4.6": + version "4.4.10" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac" + integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== dependencies: "@types/react" "*" "@types/react@*", "@types/react@>=16.9.11", "@types/react@^18.0.24": - version "18.0.27" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.27.tgz#d9425abe187a00f8a5ec182b010d4fd9da703b71" - integrity sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA== + version "18.3.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.2.tgz#462ae4904973bc212fa910424d901e3d137dbfcd" + integrity sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" -"@types/resolve@0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" - integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== dependencies: "@types/node" "*" -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/secp256k1@^4.0.1": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" - integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" + integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== dependencies: "@types/node" "*" -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== +"@types/semver@^7.3.12": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" -"@types/tapable@^1", "@types/tapable@^1.0.5": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" - integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== +"@types/serve-index@^1.9.1": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== + dependencies: + "@types/express" "*" -"@types/testing-library__jest-dom@^5.9.1": - version "5.14.5" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" - integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: - "@types/jest" "*" + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" -"@types/uglify-js@*": - version "3.17.1" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.1.tgz#e0ffcef756476410e5bce2cb01384ed878a195b5" - integrity sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g== +"@types/sockjs@^0.3.33": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== dependencies: - source-map "^0.6.1" + "@types/node" "*" -"@types/warning@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" - integrity sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA== +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== -"@types/webpack-sources@*": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" - integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== +"@types/testing-library__jest-dom@^5.9.1": + version "5.14.9" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz#0fb1e6a0278d87b6737db55af5967570b67cb466" + integrity sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw== dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.7.3" + "@types/jest" "*" + +"@types/trusted-types@^2.0.2": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + +"@types/warning@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798" + integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== -"@types/webpack@^4.41.8": - version "4.41.33" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.33.tgz#16164845a5be6a306bcbe554a8e67f9cac215ffc" - integrity sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g== +"@types/ws@^8.5.5": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== dependencies: "@types/node" "*" - "@types/tapable" "^1" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - anymatch "^3.0.0" - source-map "^0.6.0" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^15.0.0": - version "15.0.15" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" - integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + version "15.0.19" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" + integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA== dependencies: "@types/yargs-parser" "*" -"@types/yargs@^17.0.8": - version "17.0.22" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" - integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== +"@types/yargs@^16.0.0": + version "16.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e" + integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^4.5.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" - integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== dependencies: - "@typescript-eslint/experimental-utils" "4.33.0" - "@typescript-eslint/scope-manager" "4.33.0" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.1.0" - semver "^7.3.5" - tsutils "^3.21.0" + "@types/yargs-parser" "*" -"@typescript-eslint/experimental-utils@4.33.0", "@typescript-eslint/experimental-utils@^4.0.1": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" - integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== - dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" +"@typescript-eslint/eslint-plugin@^5.5.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@^3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" - integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz#14559bf73383a308026b427a4a6129bae2146741" + integrity sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw== dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" + "@typescript-eslint/utils" "5.62.0" "@typescript-eslint/parser@^4.5.0": version "4.33.0" @@ -2652,6 +3481,16 @@ "@typescript-eslint/typescript-estree" "4.33.0" debug "^4.3.1" +"@typescript-eslint/parser@^5.5.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + "@typescript-eslint/scope-manager@4.33.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" @@ -2660,29 +3499,33 @@ "@typescript-eslint/types" "4.33.0" "@typescript-eslint/visitor-keys" "4.33.0" -"@typescript-eslint/types@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" - integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" "@typescript-eslint/types@4.33.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== -"@typescript-eslint/typescript-estree@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" - integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== - dependencies: - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/visitor-keys" "3.10.1" - debug "^4.1.1" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== "@typescript-eslint/typescript-estree@4.33.0": version "4.33.0" @@ -2697,12 +3540,32 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" - integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" "@typescript-eslint/visitor-keys@4.33.0": version "4.33.0" @@ -2712,353 +3575,550 @@ "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" -"@walletconnect/browser-utils@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.8.0.tgz#33c10e777aa6be86c713095b5206d63d32df0951" - integrity sha512-Wcqqx+wjxIo9fv6eBUFHPsW1y/bGWWRboni5dfD8PtOmrihrEpOCmvRJe4rfl7xgJW8Ea9UqKEaq0bIRLHlK4A== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@walletconnect/safe-json" "1.0.0" - "@walletconnect/types" "^1.8.0" - "@walletconnect/window-getters" "1.0.0" - "@walletconnect/window-metadata" "1.0.0" - detect-browser "5.2.0" + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" -"@walletconnect/client@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.8.0.tgz#6f46b5499c7c861c651ff1ebe5da5b66225ca696" - integrity sha512-svyBQ14NHx6Cs2j4TpkQaBI/2AF4+LXz64FojTjMtV4VMMhl81jSO1vNeg+yYhQzvjcGH/GpSwixjyCW0xFBOQ== - dependencies: - "@walletconnect/core" "^1.8.0" - "@walletconnect/iso-crypto" "^1.8.0" - "@walletconnect/types" "^1.8.0" - "@walletconnect/utils" "^1.8.0" +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@walletconnect/core@2.11.1": + version "2.11.1" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.11.1.tgz#da2be26b8b6514c74f06dc9a5ffb450bdec3456d" + integrity sha512-T57Vd7YdbHPsy3tthBuwrhaZNafN0+PqjISFRNeJy/bsKdXxpJg2hGSARuOTpCO7V6VcaatqlaSMuG3DrnG5rA== + dependencies: + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/jsonrpc-ws-connection" "1.0.14" + "@walletconnect/keyvaluestorage" "^1.1.1" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/relay-auth" "^1.0.4" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.11.1" + "@walletconnect/utils" "2.11.1" + events "^3.3.0" + isomorphic-unfetch "3.1.0" + lodash.isequal "4.5.0" + uint8arrays "^3.1.0" -"@walletconnect/core@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.8.0.tgz#6b2748b90c999d9d6a70e52e26a8d5e8bfeaa81e" - integrity sha512-aFTHvEEbXcZ8XdWBw6rpQDte41Rxwnuk3SgTD8/iKGSRTni50gI9S3YEzMj05jozSiOBxQci4pJDMVhIUMtarw== +"@walletconnect/environment@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7" + integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== dependencies: - "@walletconnect/socket-transport" "^1.8.0" - "@walletconnect/types" "^1.8.0" - "@walletconnect/utils" "^1.8.0" + tslib "1.14.1" -"@walletconnect/crypto@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.3.tgz#7b8dd4d7e2884fe3543c7c07aea425eef5ef9dd4" - integrity sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g== +"@walletconnect/ethereum-provider@2.11.1": + version "2.11.1" + resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.11.1.tgz#6e0174ec9026940eaadeedc53417e222eb45f5aa" + integrity sha512-UfQH0ho24aa2M1xYmanbJv2ggQPebKmQytp2j20QEvURJ2R0v7YKWZ+0PfwOs6o6cuGw6gGxy/0WQXQRZSAsfg== + dependencies: + "@walletconnect/jsonrpc-http-connection" "^1.0.7" + "@walletconnect/jsonrpc-provider" "^1.0.13" + "@walletconnect/jsonrpc-types" "^1.0.3" + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/modal" "^2.6.2" + "@walletconnect/sign-client" "2.11.1" + "@walletconnect/types" "2.11.1" + "@walletconnect/universal-provider" "2.11.1" + "@walletconnect/utils" "2.11.1" + events "^3.3.0" + +"@walletconnect/events@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/events/-/events-1.0.1.tgz#2b5f9c7202019e229d7ccae1369a9e86bda7816c" + integrity sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ== dependencies: - "@walletconnect/encoding" "^1.0.2" - "@walletconnect/environment" "^1.0.1" - "@walletconnect/randombytes" "^1.0.3" - aes-js "^3.1.2" - hash.js "^1.1.7" + keyvaluestorage-interface "^1.0.0" tslib "1.14.1" -"@walletconnect/encoding@^1.0.1", "@walletconnect/encoding@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.2.tgz#cb3942ad038d6a6bf01158f66773062dd25724da" - integrity sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag== +"@walletconnect/heartbeat@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.1.tgz#afaa3a53232ae182d7c9cff41c1084472d8f32e9" + integrity sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q== dependencies: - is-typedarray "1.0.0" + "@walletconnect/events" "^1.0.1" + "@walletconnect/time" "^1.0.2" tslib "1.14.1" - typedarray-to-buffer "3.1.5" -"@walletconnect/environment@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7" - integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== +"@walletconnect/jsonrpc-http-connection@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz#2f4c3948f074960a3edd07909560f3be13e2c7ae" + integrity sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw== dependencies: - tslib "1.14.1" + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.1" + cross-fetch "^3.1.4" + events "^3.3.0" -"@walletconnect/http-connection@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.8.0.tgz#c19fff5c179d5180d8b974faef2621bd012adb4e" - integrity sha512-IziEr3c53qsMromK7jz0EkbKDHlryRbxXdFR+xaG+S5nfxtUdAfjzlZabvczXdDCgmTij6KbNsZAjBMqCBzACw== +"@walletconnect/jsonrpc-provider@1.0.13": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz#9a74da648d015e1fffc745f0c7d629457f53648b" + integrity sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g== dependencies: - "@walletconnect/types" "^1.8.0" - "@walletconnect/utils" "^1.8.0" - eventemitter3 "4.0.7" - xhr2-cookies "1.1.0" + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/safe-json" "^1.0.2" + tslib "1.14.1" -"@walletconnect/iso-crypto@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.8.0.tgz#44ddf337c4f02837c062dbe33fa7ab36789df451" - integrity sha512-pWy19KCyitpfXb70hA73r9FcvklS+FvO9QUIttp3c2mfW8frxgYeRXfxLRCIQTkaYueRKvdqPjbyhPLam508XQ== +"@walletconnect/jsonrpc-provider@^1.0.13": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz#696f3e3b6d728b361f2e8b853cfc6afbdf2e4e3e" + integrity sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow== dependencies: - "@walletconnect/crypto" "^1.0.2" - "@walletconnect/types" "^1.8.0" - "@walletconnect/utils" "^1.8.0" + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/safe-json" "^1.0.2" + events "^3.3.0" -"@walletconnect/jsonrpc-types@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.2.tgz#b79519f679cd6a5fa4a1bea888f27c1916689a20" - integrity sha512-CZe8tjJX73OWdHjrBHy7HtAapJ2tT0Q3TYhPBhRxi3643lwPIQWC9En45ldY14TZwgSewkbZ0FtGBZK0G7Bbyg== +"@walletconnect/jsonrpc-types@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz#65e3b77046f1a7fa8347ae02bc1b841abe6f290c" + integrity sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw== dependencies: keyvaluestorage-interface "^1.0.0" tslib "1.14.1" -"@walletconnect/jsonrpc-utils@^1.0.3": +"@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": version "1.0.4" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.4.tgz#2009ba3907b02516f2caacd2fb871ff0d472b2cb" - integrity sha512-y0+tDxcTZ9BHBBKBJbjZxLUXb+zQZCylf7y/jTvDPNx76J0hYYc+F9zHzyqBLeorSKepLTk6yI8hw3NXbAQB3g== + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz#ce1a667d79eadf2a2d9d002c152ceb68739c230c" + integrity sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ== + dependencies: + events "^3.3.0" + keyvaluestorage-interface "^1.0.0" + +"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72" + integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== dependencies: "@walletconnect/environment" "^1.0.1" - "@walletconnect/jsonrpc-types" "^1.0.2" + "@walletconnect/jsonrpc-types" "^1.0.3" tslib "1.14.1" -"@walletconnect/mobile-registry@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz#502cf8ab87330841d794819081e748ebdef7aee5" - integrity sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw== - -"@walletconnect/qrcode-modal@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.8.0.tgz#ddd6f5c9b7ee52c16adf9aacec2a3eac4994caea" - integrity sha512-BueaFefaAi8mawE45eUtztg3ZFbsAH4DDXh1UNwdUlsvFMjqcYzLUG0xZvDd6z2eOpbgDg2N3bl6gF0KONj1dg== +"@walletconnect/jsonrpc-ws-connection@1.0.14": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.14.tgz#eec700e74766c7887de2bd76c91a0206628732aa" + integrity sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA== dependencies: - "@walletconnect/browser-utils" "^1.8.0" - "@walletconnect/mobile-registry" "^1.4.0" - "@walletconnect/types" "^1.8.0" - copy-to-clipboard "^3.3.1" - preact "10.4.1" - qrcode "1.4.4" + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.2" + events "^3.3.0" + ws "^7.5.1" -"@walletconnect/randombytes@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.3.tgz#e795e4918367fd1e6a2215e075e64ab93e23985b" - integrity sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw== +"@walletconnect/keyvaluestorage@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz#dd2caddabfbaf80f6b8993a0704d8b83115a1842" + integrity sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA== dependencies: - "@walletconnect/encoding" "^1.0.2" - "@walletconnect/environment" "^1.0.1" - randombytes "^2.1.0" - tslib "1.14.1" - -"@walletconnect/safe-json@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2" - integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg== + "@walletconnect/safe-json" "^1.0.1" + idb-keyval "^6.2.1" + unstorage "^1.9.0" -"@walletconnect/socket-transport@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.8.0.tgz#9a1128a249628a0be11a0979b522fe82b44afa1b" - integrity sha512-5DyIyWrzHXTcVp0Vd93zJ5XMW61iDM6bcWT4p8DTRfFsOtW46JquruMhxOLeCOieM4D73kcr3U7WtyR4JUsGuQ== +"@walletconnect/logger@^2.0.1": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.1.2.tgz#813c9af61b96323a99f16c10089bfeb525e2a272" + integrity sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw== dependencies: - "@walletconnect/types" "^1.8.0" - "@walletconnect/utils" "^1.8.0" - ws "7.5.3" + "@walletconnect/safe-json" "^1.0.2" + pino "7.11.0" -"@walletconnect/types@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.8.0.tgz#3f5e85b2d6b149337f727ab8a71b8471d8d9a195" - integrity sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg== +"@walletconnect/modal-core@2.6.2": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@walletconnect/modal-core/-/modal-core-2.6.2.tgz#d73e45d96668764e0c8668ea07a45bb8b81119e9" + integrity sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA== + dependencies: + valtio "1.11.2" -"@walletconnect/utils@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.8.0.tgz#2591a197c1fa7429941fe428876088fda6632060" - integrity sha512-zExzp8Mj1YiAIBfKNm5u622oNw44WOESzo6hj+Q3apSMIb0Jph9X3GDIdbZmvVZsNPxWDL7uodKgZcCInZv2vA== - dependencies: - "@walletconnect/browser-utils" "^1.8.0" - "@walletconnect/encoding" "^1.0.1" - "@walletconnect/jsonrpc-utils" "^1.0.3" - "@walletconnect/types" "^1.8.0" - bn.js "4.11.8" - js-sha3 "0.8.0" - query-string "6.13.5" +"@walletconnect/modal-ui@2.6.2": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@walletconnect/modal-ui/-/modal-ui-2.6.2.tgz#fa57c087c57b7f76aaae93deab0f84bb68b59cf9" + integrity sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA== + dependencies: + "@walletconnect/modal-core" "2.6.2" + lit "2.8.0" + motion "10.16.2" + qrcode "1.5.3" -"@walletconnect/web3-provider@^1.3.6": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.8.0.tgz#e90d903f4c609b7158ecb5f0f41df121e93b56b5" - integrity sha512-lqqEO0oRmCehH+c8ZPk3iH7I7YtbzmkWd58/Or2AgWAl869JamzndKCD3sTlNsPRQLxxPpraHQqzur7uclLWvg== +"@walletconnect/modal@^2.6.2": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@walletconnect/modal/-/modal-2.6.2.tgz#4b534a836f5039eeb3268b80be7217a94dd12651" + integrity sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA== dependencies: - "@walletconnect/client" "^1.8.0" - "@walletconnect/http-connection" "^1.8.0" - "@walletconnect/qrcode-modal" "^1.8.0" - "@walletconnect/types" "^1.8.0" - "@walletconnect/utils" "^1.8.0" - web3-provider-engine "16.0.1" + "@walletconnect/modal-core" "2.6.2" + "@walletconnect/modal-ui" "2.6.2" -"@walletconnect/window-getters@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" - integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== +"@walletconnect/relay-api@^1.0.9": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.10.tgz#5aef3cd07c21582b968136179aa75849dcc65499" + integrity sha512-tqrdd4zU9VBNqUaXXQASaexklv6A54yEyQQEXYOCr+Jz8Ket0dmPBDyg19LVSNUN2cipAghQc45/KVmfFJ0cYw== + dependencies: + "@walletconnect/jsonrpc-types" "^1.0.2" + +"@walletconnect/relay-auth@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz#0b5c55c9aa3b0ef61f526ce679f3ff8a5c4c2c7c" + integrity sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ== + dependencies: + "@stablelib/ed25519" "^1.0.2" + "@stablelib/random" "^1.0.1" + "@walletconnect/safe-json" "^1.0.1" + "@walletconnect/time" "^1.0.2" + tslib "1.14.1" + uint8arrays "^3.0.0" + +"@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.2.tgz#7237e5ca48046e4476154e503c6d3c914126fa77" + integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA== + dependencies: + tslib "1.14.1" + +"@walletconnect/sign-client@2.11.1": + version "2.11.1" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.11.1.tgz#c073b8d2d594e792bb783d36c8b021bd37a9d4f6" + integrity sha512-s3oKSx6/F5X2WmkV1jfJImBFACf9Km5HpTb+n5q+mobJVpUQw/clvoVyIrNNppLhm1V1S/ylHXh0qCrDppDpCA== + dependencies: + "@walletconnect/core" "2.11.1" + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.11.1" + "@walletconnect/utils" "2.11.1" + events "^3.3.0" + +"@walletconnect/time@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/time/-/time-1.0.2.tgz#6c5888b835750ecb4299d28eecc5e72c6d336523" + integrity sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g== + dependencies: + tslib "1.14.1" -"@walletconnect/window-getters@^1.0.0": +"@walletconnect/types@2.11.1": + version "2.11.1" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.11.1.tgz#4f705b43ddc286b69eb9bf91bb6e9496d20de0e3" + integrity sha512-UbdbX+d6MOK0AXKxt5imV3KvAcLVpZUHylaRDIP5ffwVylM/p4DHnKppil1Qq5N+IGDr3RsUwLGFkKjqsQYRKw== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/keyvaluestorage" "^1.1.1" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" + +"@walletconnect/universal-provider@2.11.1": + version "2.11.1" + resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.11.1.tgz#988f2a78325eb52ef7481a220851a56efb209d64" + integrity sha512-BJvPYByIfbBYF4x8mqDV79ebQX0tD54pp8itsqrHWn0qKZeJyIH8sQ69yY0GnbJrzoFS3ZLULdC0yDxWDeuRGw== + dependencies: + "@walletconnect/jsonrpc-http-connection" "^1.0.7" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-types" "^1.0.2" + "@walletconnect/jsonrpc-utils" "^1.0.7" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/sign-client" "2.11.1" + "@walletconnect/types" "2.11.1" + "@walletconnect/utils" "2.11.1" + events "^3.3.0" + +"@walletconnect/utils@2.11.1": + version "2.11.1" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.11.1.tgz#56116d9c410c6f2ae8d562017cf6876cccb366f1" + integrity sha512-wRFDHN86dZ05mCET1H3912odIeQa8j7cZKxl1FlWRpV2YsILj9HCYSX6Uq2brwO02Kv2vryke44G1r8XI/LViA== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.11.1" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.3" + uint8arrays "^3.1.0" + +"@walletconnect/window-getters@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== dependencies: tslib "1.14.1" -"@walletconnect/window-metadata@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" - integrity sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA== +"@walletconnect/window-metadata@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz#2124f75447b7e989e4e4e1581d55d25bc75f7be5" + integrity sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA== dependencies: - "@walletconnect/window-getters" "^1.0.0" + "@walletconnect/window-getters" "^1.0.1" + tslib "1.14.1" -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== +"@web3modal/common@4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@web3modal/common/-/common-4.1.11.tgz#74fe5e870c0cccac10fe6d5fed57f307877beee8" + integrity sha512-zcoaixcI3dLC/D0QlhpT8MNCd717O1/3r1AemC5/9Wbk2F+YKXkzJZHmWlXoTvlTw9DH07rJzs9YTPxFyn855w== dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + bignumber.js "9.1.2" + dayjs "1.11.10" -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== +"@web3modal/core@4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@web3modal/core/-/core-4.1.11.tgz#7dbc7ab82a98df8feb9033c2ee3ac853e6135fcc" + integrity sha512-e475IIWywEtgH1CCB2Pl1C/wgPu0NzAvtTMOPSGNoHsw1ID2n6j/o4CURQb2HJjOoYQjTKKVkzXa44vFh2p9xw== + dependencies: + "@web3modal/common" "4.1.11" + "@web3modal/wallet" "4.1.11" + valtio "1.11.2" -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== +"@web3modal/ethers5@^4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@web3modal/ethers5/-/ethers5-4.1.11.tgz#47be127aa1ac973a96538347724c813b22198723" + integrity sha512-Z+GQs855tNi0QXfJ4Hryl4APQG1Tw8IoJ5XXgGWQVMcrJPRO1iRJdfoM1Bib1XdzvBkMTTkkNbGKC+elXR1rMg== + dependencies: + "@coinbase/wallet-sdk" "3.9.1" + "@walletconnect/ethereum-provider" "2.11.1" + "@web3modal/polyfills" "4.1.11" + "@web3modal/scaffold" "4.1.11" + "@web3modal/scaffold-react" "4.1.11" + "@web3modal/scaffold-utils" "4.1.11" + "@web3modal/scaffold-vue" "4.1.11" + "@web3modal/siwe" "4.1.11" + valtio "1.11.2" + +"@web3modal/polyfills@4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@web3modal/polyfills/-/polyfills-4.1.11.tgz#ab5b98b5594d4d36cb3fe11eec68b84f303c2282" + integrity sha512-+aMmjGrLCKLo4gVAdWgFdOX2ZjExciSLw/YlZ01wLO8Yj3bZbCZ7sjBc9xndHOVMK0QyUzBtpCOpYMJzi+59jg== dependencies: - "@webassemblyjs/wast-printer" "1.9.0" + buffer "6.0.3" -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== +"@web3modal/scaffold-react@4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold-react/-/scaffold-react-4.1.11.tgz#67c17cda7bcdbb1a17c99dc62dfabaf5930ad751" + integrity sha512-vouJHj77ZNKvR/Uyb3Hfc2UFSA4ZrrHmA0vbioCbgIh+V1rYT5XcAZDEu4AAo1qJ5NBRU1pkClVwAmQuWGY43w== + dependencies: + "@web3modal/scaffold" "4.1.11" -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== +"@web3modal/scaffold-utils@4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold-utils/-/scaffold-utils-4.1.11.tgz#54511d896bc7bfe7bb651da4a9cd2507498af311" + integrity sha512-nsS9yK5tp1N/VfecLLPc8H/dGJCzn0jElWjRS92VfGPhOSiEh5PIrPyCl9o6wUZsp4fH1YUsoSY2EFpPsuCWgw== dependencies: - "@webassemblyjs/ast" "1.9.0" + "@web3modal/core" "4.1.11" + "@web3modal/polyfills" "4.1.11" + valtio "1.11.2" -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== +"@web3modal/scaffold-vue@4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold-vue/-/scaffold-vue-4.1.11.tgz#e1b5677c02532fabc1b5dca45c25be5e730dee0f" + integrity sha512-PmIfD2TlKkZZa6V0sqwDtZ7t62BEk5JjCHd380QaZwGTbPEwS99leTWLKBTaxAPShK2p7+aj2Txss63wIXLRFg== + dependencies: + "@web3modal/scaffold" "4.1.11" -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== +"@web3modal/scaffold@4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold/-/scaffold-4.1.11.tgz#13e18823158357f90e10f3cd83cf615d2ac59daf" + integrity sha512-n8bP3cJNQxV8OD3s8bSj8QDbZvjn8a1Ui81jo2a3rIxOUAlD/cKRM8ivmNxiUdBMae8GP5CLiWtkIptmSLw40Q== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" + "@web3modal/common" "4.1.11" + "@web3modal/core" "4.1.11" + "@web3modal/siwe" "4.1.11" + "@web3modal/ui" "4.1.11" + "@web3modal/wallet" "4.1.11" + lit "3.1.0" -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== +"@web3modal/siwe@4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@web3modal/siwe/-/siwe-4.1.11.tgz#def52403ec332b4600c8c18134ef0efb658abe5c" + integrity sha512-gndcNA351mkAR0wUsO4dLS9CbpcFo+AQ2CUXF0Jx83DwaBStCVsX3yllfnYKh/gpVetF3B48mRUt9TTTJJ79dA== dependencies: - "@xtuc/ieee754" "^1.2.0" + "@web3modal/core" "4.1.11" + "@web3modal/scaffold-utils" "4.1.11" + lit "3.1.0" + valtio "1.11.2" -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== +"@web3modal/ui@4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@web3modal/ui/-/ui-4.1.11.tgz#48a6e57bae1614414c3627d4ba9712441fa61ef0" + integrity sha512-lentHZvUpNjVasvNI8/jrVPIAV1M5zJKZ4Q4AeYwUJdEtlRon1uq10MRylmvlZAjWb98U130uJy245Fz87Th/w== dependencies: + lit "3.1.0" + qrcode "1.5.3" + +"@web3modal/wallet@4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@web3modal/wallet/-/wallet-4.1.11.tgz#07518f9737151abf1d55fae398b523dc99ab7a41" + integrity sha512-6eJSpNcrBxufJFEQu9+ZOMUZxPqa8438RvfYKCU9nLXwoBtweo6ecpQw2yhXDlrfG+uJZhFabtPxROabn2M8Kg== + dependencies: + "@web3modal/polyfills" "4.1.11" + zod "3.22.4" + +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" + "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" + "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== +"@wry/caches@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@wry/caches/-/caches-1.0.1.tgz#8641fd3b6e09230b86ce8b93558d44cf1ece7e52" + integrity sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" + tslib "^2.3.0" "@wry/context@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.0.tgz#be88e22c0ddf62aeb0ae9f95c3d90932c619a5c8" - integrity sha512-LcDAiYWRtwAoSOArfk7cuYvFXytxfVrdX7yxoUmK7pPITLk5jYh2F8knCwS7LjgYL8u1eidPlKKV6Ikqq0ODqQ== + version "0.7.4" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.4.tgz#e32d750fa075955c4ab2cfb8c48095e1d42d5990" + integrity sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ== dependencies: tslib "^2.3.0" -"@wry/equality@^0.5.0": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.3.tgz#fafebc69561aa2d40340da89fa7dc4b1f6fb7831" - integrity sha512-avR+UXdSrsF2v8vIqIgmeTY0UR91UT+IyablCyKe/uk22uOJ8fusKZnH9JH9e1/EtLeNJBtagNmL3eJdnOV53g== +"@wry/equality@^0.5.6": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.7.tgz#72ec1a73760943d439d56b7b1e9985aec5d497bb" + integrity sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw== dependencies: tslib "^2.3.0" -"@wry/trie@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.2.tgz#a06f235dc184bd26396ba456711f69f8c35097e6" - integrity sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ== +"@wry/trie@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.4.3.tgz#077d52c22365871bf3ffcbab8e95cb8bc5689af4" + integrity sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w== + dependencies: + tslib "^2.3.0" + +"@wry/trie@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.5.0.tgz#11e783f3a53f6e4cd1d42d2d1323f5bc3fa99c94" + integrity sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA== dependencies: tslib "^2.3.0" @@ -3077,25 +4137,6 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abstract-leveldown@~2.6.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" - integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@~2.7.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" - integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== - dependencies: - xtend "~4.0.0" - accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -3112,7 +4153,12 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.3.1: +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -3122,27 +4168,17 @@ acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^6.4.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.5.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.11.3, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -address@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== - -address@^1.0.1: +address@^1.0.1, address@^1.1.2: version "1.2.2" resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== @@ -3155,16 +4191,19 @@ adjust-sourcemap-loader@3.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + aes-js@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== -aes-js@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" - integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== - agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -3172,25 +4211,26 @@ agent-base@6: dependencies: debug "4" -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" + ajv "^8.0.0" -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3200,35 +4240,15 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== +ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" + integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" - -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ== - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== - -ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + uri-js "^4.4.1" ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: version "4.3.2" @@ -3237,32 +4257,22 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: dependencies: type-fest "^0.21.3" -ansi-html@0.0.7, ansi-html@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -3281,15 +4291,17 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -3297,24 +4309,16 @@ anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" - integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -3322,6 +4326,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "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@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" @@ -3330,127 +4339,144 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" -aria-query@^5.0.0, aria-query@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== +aria-query@^5.0.0, aria-query@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: - deep-equal "^2.0.5" + dequal "^2.0.3" arity-n@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" integrity sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ== -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-differ@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-includes@^3.1.5, array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== - dependencies: - array-uniq "^1.0.1" - 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== -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== +array.prototype.findlast@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.reduce@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" - integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== +array.prototype.reduce@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz#6aadc2f995af29cb887eb866d981dc85ab6f7dc7" + integrity sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" es-array-method-boxes-properly "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" is-string "^1.0.7" -array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" arrify@^2.0.1: version "2.0.1" @@ -3462,77 +4488,10 @@ asap@~2.0.6: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - -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== - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-each@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" - integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== - -async-eventemitter@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" - integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== - dependencies: - async "^2.4.0" - -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA== - -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== +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== async-mutex@^0.2.6: version "0.2.6" @@ -3541,17 +4500,10 @@ async-mutex@^0.2.6: dependencies: tslib "^2.0.0" -async@^1.4.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== - -async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" +async@^3.2.3: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== asynckit@^0.4.0: version "0.4.0" @@ -3568,91 +4520,67 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.6.1: - version "9.8.8" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" - integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +autoprefixer@^10.4.13: + version "10.4.19" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" + browserslist "^4.23.0" + caniuse-lite "^1.0.30001599" + fraction.js "^4.3.7" normalize-range "^0.1.2" - num2fraction "^1.2.2" - picocolors "^0.2.1" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" - integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== - -axe-core@^4.6.2: - version "4.6.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece" - integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" -axobject-query@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: - deep-equal "^2.0.5" + possible-typed-array-names "^1.0.0" -babel-eslint@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" - integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" +axe-core@=4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== -babel-extract-comments@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" - integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== +axobject-query@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== dependencies: - babylon "^6.18.0" + dequal "^2.0.3" -babel-jest@^26.6.0, babel-jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" - integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== - dependencies: - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.6.2" +babel-jest@^27.4.2, babel-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" chalk "^4.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" slash "^3.0.0" -babel-loader@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" - integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== +babel-loader@^8.2.3: + version "8.3.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== dependencies: - find-cache-dir "^2.1.0" - loader-utils "^1.4.0" - mkdirp "^0.5.3" - pify "^4.0.1" + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" schema-utils "^2.6.5" -babel-plugin-istanbul@^6.0.0: +babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== @@ -3663,10 +4591,10 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" - integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -3682,63 +4610,34 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-named-asset-import@^0.3.7: +babel-plugin-named-asset-import@^0.3.8: version "0.3.8" resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" - -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.2" + semver "^6.3.1" -"babel-plugin-styled-components@>= 1.12.0": - version "2.0.7" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz#c81ef34b713f9da2b7d3f5550df0d1e19e798086" - integrity sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA== +babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" + integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" - babel-plugin-syntax-jsx "^6.18.0" - lodash "^4.17.11" - picomatch "^2.3.0" - -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== + "@babel/helper-define-polyfill-provider" "^0.6.1" + core-js-compat "^3.36.1" -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w== - -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA== +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" + "@babel/helper-define-polyfill-provider" "^0.6.2" babel-plugin-transform-react-remove-prop-types@^0.4.24: version "0.4.24" @@ -3763,15 +4662,15 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" - integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== dependencies: - babel-plugin-jest-hoist "^26.6.2" + babel-plugin-jest-hoist "^27.5.1" babel-preset-current-node-syntax "^1.0.0" -babel-preset-react-app@^10.0.0: +babel-preset-react-app@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz#ed6005a20a24f2c88521809fa9aea99903751584" integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== @@ -3793,26 +4692,6 @@ babel-preset-react-app@^10.0.0: babel-plugin-macros "^3.1.0" babel-plugin-transform-react-remove-prop-types "^0.4.24" -babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - -backoff@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" - integrity sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA== - dependencies: - precond "0.2" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -3825,49 +4704,30 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" -base64-js@^1.0.2, base64-js@^1.3.1: +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== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - bech32@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== bfj@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" - integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== + version "7.1.0" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" + integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== dependencies: - bluebird "^3.5.5" - check-types "^11.1.1" + bluebird "^3.7.2" + check-types "^11.2.3" hoopy "^0.1.4" + jsonpath "^1.1.1" tryer "^1.0.1" big.js@^5.2.2: @@ -3875,46 +4735,27 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -bignumber.js@^9.0.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== +bignumber.js@9.1.2, bignumber.js@^9.0.1: + 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== binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bind-decorator@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/bind-decorator/-/bind-decorator-1.0.11.tgz#e41bc06a1f65dd9cec476c91c5daf3978488252f" integrity sha512-yzkH0uog6Vv/vQ9+rhSKxecnqGUZHYncg7qS7voz3Q76+TAi1SGiOKk2mlOvusQnFz9Dc4BC/NMkeXu11YgjJg== -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" - blakejs@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ== - dependencies: - inherits "~2.0.0" - -bluebird@^3.5.5: +bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -3929,28 +4770,23 @@ bn.js@4.11.6: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== -bn.js@4.11.8: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.11.0, bn.js@^4.11.8, 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== -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@^5.1.1, bn.js@^5.2.0, bn.js@^5.2.1: 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== -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== +body-parser@1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== dependencies: bytes "3.1.2" - content-type "~1.0.4" + content-type "~1.0.5" debug "2.6.9" depd "2.0.0" destroy "1.2.0" @@ -3958,21 +4794,17 @@ body-parser@1.20.1: iconv-lite "0.4.24" on-finished "2.4.1" qs "6.11.0" - raw-body "2.5.1" + raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg== +bonjour-service@^1.0.11: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" + integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" @@ -3992,21 +4824,12 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" braces@^3.0.2, braces@~3.0.2: version "3.0.2" @@ -4015,7 +4838,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -brorand@^1.0.1, brorand@^1.1.0: +brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== @@ -4025,7 +4848,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: +browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -4037,74 +4860,15 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -browserify-cipher@^1.0.0: - 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" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@4.14.2: - version "4.14.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce" - integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw== - dependencies: - caniuse-lite "^1.0.30001125" - electron-to-chromium "^1.3.564" - escalade "^3.0.2" - node-releases "^1.1.61" - -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.6.2, browserslist@^4.6.4: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== +browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.2, browserslist@^4.23.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" bs58@^4.0.0: version "4.0.1" @@ -4134,34 +4898,11 @@ btoa@^1.2.1: resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== - -buffer-from@^1.0.0, buffer-from@^1.1.1: +buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - buffer-reverse@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" @@ -4172,24 +4913,7 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -buffer@^5.4.3: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: +buffer@6.0.3, 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== @@ -4202,11 +4926,6 @@ builtin-modules@^3.1.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -4217,99 +4936,23 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^15.0.5: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camel-case@^4.1.1: +camel-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== @@ -4317,34 +4960,21 @@ camel-case@^4.1.1: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ== - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw== - -camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: +camelcase@^6.2.0, camelcase@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -4355,29 +4985,17 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001449: - version "1.0.30001450" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz#022225b91200589196b814b51b1bbe45144cf74f" - integrity sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -case-sensitive-paths-webpack-plugin@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" - integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: + version "1.0.30001617" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz#809bc25f3f5027ceb33142a7d6c40759d7a901eb" + integrity sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +case-sensitive-paths-webpack-plugin@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== -chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -4386,17 +5004,6 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -4405,7 +5012,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -4418,22 +5025,20 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -check-types@^11.1.1: - version "11.2.2" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.2.tgz#7afc0b6a860d686885062f2dba888ba5710335b4" - integrity sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA== +char-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" + integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== -checkpoint-store@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" - integrity sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg== - dependencies: - functional-red-black-tree "^1.0.1" +check-types@^11.2.3: + version "11.2.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" + integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.2, chokidar@^3.5.3, chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -4445,49 +5050,15 @@ checkpoint-store@^1.1.0: optionalDependencies: fsevents "~2.3.2" -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - ci-info@^3.2.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.1.tgz#708a6cdae38915d597afdf3b145f2f8e1ff55f3f" - integrity sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w== + version "3.9.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.4" @@ -4497,46 +5068,38 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -cjs-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" - integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== +citty@^0.1.5, citty@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/citty/-/citty-0.1.6.tgz#0f7904da1ed4625e1a9ea7e0fa780981aab7c5e4" + integrity sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ== dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" + consola "^3.2.3" -classnames@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== +cjs-module-lexer@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" + integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== -clean-css@^4.2.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" - integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== +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" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== dependencies: source-map "~0.6.0" -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== +clipboardy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-4.0.0.tgz#e73ced93a76d19dd379ebf1f297565426dffdca1" + integrity sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w== dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" + execa "^8.0.1" + is-wsl "^3.1.0" + is64bit "^2.0.0" cliui@^6.0.0: version "6.0.0" @@ -4547,25 +5110,30 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" -clone@^2.0.0, clone@^2.1.1: +clone@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== -clsx@^1.1.0, clsx@^1.1.1: +clsx@^1.1.0, clsx@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== +clsx@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -4580,23 +5148,10 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" @@ -4630,7 +5185,7 @@ color-string@^1.6.0: color-name "^1.0.0" simple-swizzle "^0.2.2" -color@^3.0.0, color@^3.2.1: +color@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== @@ -4638,7 +5193,17 @@ color@^3.0.0, color@^3.2.1: color-convert "^1.9.3" color-string "^1.6.0" -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +colord@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^2.0.10: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -4650,11 +5215,21 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.1.1: +commander@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + common-tags@^1.8.0: version "1.8.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" @@ -4665,11 +5240,6 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - compose-function@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" @@ -4710,40 +5280,25 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" +confbox@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.7.tgz#ccfc0a2bcae36a84838e83a3b7f770fb17d6c579" + integrity sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA== -confusing-browser-globals@^1.0.10: +confusing-browser-globals@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== +consola@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" + integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== content-disposition@0.5.4: version "0.5.4" @@ -4752,7 +5307,7 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: +content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== @@ -4774,86 +5329,58 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-es@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cookie-es/-/cookie-es-1.1.0.tgz#68f8d9f48aeb5a534f3896f80e792760d3d20def" + integrity sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookiejar@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" - integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - -copy-to-clipboard@^3.3.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" - integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== - dependencies: - toggle-selection "^1.0.6" +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== -core-js-compat@^3.25.1, core-js-compat@^3.6.2: - version "3.27.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.2.tgz#607c50ad6db8fd8326af0b2883ebb987be3786da" - integrity sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg== +core-js-compat@^3.31.0, core-js-compat@^3.36.1, core-js-compat@^3.6.2: + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" + integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.0" -core-js-pure@^3.25.1: - version "3.27.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.27.2.tgz#47e9cc96c639eefc910da03c3ece26c5067c7553" - integrity sha512-Cf2jqAbXgWH3VVzjyaaFkY1EBazxugUepGymDoeteyYr9ByX51kD2jdHZlsEF/xnJMyN3Prua7mQuzwMg6Zc9A== +core-js-pure@^3.23.3, core-js-pure@^3.30.2: + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.37.0.tgz#ce99fb4a7cec023fdbbe5b5bd1f06bbcba83316e" + integrity sha512-d3BrpyFr5eD4KcbRvQ3FTUx/KWmaDesr7+a3+1+P46IUnNoEt+oiLijPINZMEon7w9oGkIINWxrBAU9DEciwFQ== -core-js@^2.4.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-js@^3.6.5: - version "3.27.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.2.tgz#85b35453a424abdcacb97474797815f4d62ebbf7" - integrity sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== +core-js@^3.19.2: + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.0.tgz#d8dde58e91d156b2547c19d8a4efd5c7f6c426bb" + integrity sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug== core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" cosmiconfig@^7.0.0: version "7.1.0" @@ -4866,13 +5393,10 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -create-ecdh@^4.0.0: - 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" +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" @@ -4885,7 +5409,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: +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== @@ -4904,15 +5428,14 @@ cross-fetch@3.1.5: dependencies: node-fetch "2.6.7" -cross-fetch@^2.1.0: - version "2.2.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.6.tgz#2ef0bb39a24ac034787965c457368a28730e220a" - integrity sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA== +cross-fetch@^3.1.4: + 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.7" - whatwg-fetch "^2.0.4" + node-fetch "^2.6.12" -cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4921,114 +5444,75 @@ cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ== - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" +crossws@^0.2.0, crossws@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/crossws/-/crossws-0.2.4.tgz#82a8b518bff1018ab1d21ced9e35ffbe1681ad03" + integrity sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg== 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== -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg== +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-blank-pseudo@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" - integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== +css-blank-pseudo@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" + integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== dependencies: - postcss "^7.0.5" - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q== + postcss-selector-parser "^6.0.9" -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" +css-declaration-sorter@^6.3.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" + integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== -css-has-pseudo@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" - integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== +css-has-pseudo@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" + integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== dependencies: - postcss "^7.0.6" - postcss-selector-parser "^5.0.0-rc.4" + postcss-selector-parser "^6.0.9" -css-loader@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e" - integrity sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg== - dependencies: - camelcase "^6.0.0" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^2.0.0" - postcss "^7.0.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.3" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^2.7.1" - semver "^7.3.2" +css-loader@^6.5.1: + version "6.11.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" + integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.5.4" css-mediaquery@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0" integrity sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q== -css-prefers-color-scheme@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" - integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== - dependencies: - postcss "^7.0.5" +css-minimizer-webpack-plugin@^3.2.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" + integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + postcss "^8.3.5" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-prefers-color-scheme@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" + integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== css-select-base-adapter@^0.1.1: version "0.1.1" @@ -5056,15 +5540,6 @@ css-select@^4.1.3: domutils "^2.8.0" nth-check "^2.0.1" -css-to-react-native@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.1.0.tgz#e783474149997608986afcff614405714a8fe1ac" - integrity sha512-AryfkFA29b4I3vG7N4kxFboq15DxwSXzhXM37XNEjwJMgjYIc8BcqfiprpAqX0zadI5PMByEIwAMzXxk5Vcc4g== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" @@ -5073,7 +5548,7 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-tree@^1.1.2: +css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== @@ -5106,90 +5581,66 @@ css@^2.0.0: source-map-resolve "^0.5.2" urix "^0.1.0" -cssdb@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" - integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== - -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== +cssdb@^7.1.0: + version "7.11.2" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.11.2.tgz#127a2f5b946ee653361a5af5333ea85a39df5ae5" + integrity sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A== 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== -cssnano-preset-default@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" - integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.3" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw== - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw== - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== +cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.1" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.4" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.1" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.2" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== -cssnano@^4.1.10: - version "4.1.11" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" - integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== +cssnano@^5.0.6: + version "5.1.15" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.8" - is-resolvable "^1.0.0" - postcss "^7.0.0" + cssnano-preset-default "^5.2.14" + lilconfig "^2.0.3" + yaml "^1.10.2" -csso@^4.0.2: +csso@^4.0.2, csso@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== @@ -5214,42 +5665,23 @@ cssstyle@^2.3.0: cssom "~0.3.6" csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng== - dependencies: - array-find-index "^1.0.1" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== +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.50" - type "^1.0.1" + es5-ext "^0.10.64" + type "^2.7.2" damerau-levenshtein@^1.0.8: 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== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -5259,28 +5691,60 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +dayjs@1.11.10: + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + +debug@2.6.9, debug@^2.6.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, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.2.5, debug@^3.2.7: +debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -5290,7 +5754,7 @@ decimal.js@^10.2.1: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -decode-uri-component@^0.2.0: +decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== @@ -5300,119 +5764,56 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -deep-equal@^2.0.5: - version "2.2.0" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" - integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== - dependencies: - call-bind "^1.0.2" - es-get-iterator "^1.1.2" - get-intrinsic "^1.1.3" - is-arguments "^1.1.1" - is-array-buffer "^3.0.1" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" - integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== - -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== - dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -deferred-leveldown@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" - integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA== +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== dependencies: - abstract-leveldown "~2.6.0" + execa "^5.0.0" -define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: +define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - is-descriptor "^0.1.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== - dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" +defu@^6.1.3, defu@^6.1.4: + version "6.1.4" + resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479" + integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -5423,34 +5824,31 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -dequal@^2.0.2, dequal@^2.0.3: +dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" +destr@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.3.tgz#7f9e97cb3d16dbdca7be52aca1644ce402cfe449" + integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-browser@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" - integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA== - -detect-browser@^5.1.0: +detect-browser@5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -5461,7 +5859,7 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -detect-port-alt@1.1.6: +detect-port-alt@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== @@ -5469,34 +5867,35 @@ detect-port-alt@1.1.6: address "^1.0.1" debug "^2.6.0" +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + diff-sequences@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== -diff-sequences@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" - integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - dijkstrajs@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" - integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23" + integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA== dir-glob@^3.0.1: version "3.0.1" @@ -5505,25 +5904,17 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ== +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: - buffer-indexof "^1.0.0" + "@leichtgewicht/ip-codec" "^2.0.1" doctrine@^2.1.0: version "2.1.0" @@ -5576,16 +5967,6 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - domelementtype@1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" @@ -5603,7 +5984,7 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.1: +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== @@ -5635,14 +6016,7 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dotenv-expand@5.1.0: +dotenv-expand@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== @@ -5652,45 +6026,49 @@ dotenv@8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== -duplexer@^0.1.1: +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== +duplexify@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.3.tgz#a07e1c0d0a2c001158563d32592ba58bddb0236f" + integrity sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA== dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.2" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -ejs@^2.6.1: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== +ejs@^3.1.6: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" -electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.284: - version "1.4.286" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz#0e039de59135f44ab9a8ec9025e53a9135eba11f" - integrity sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ== +electron-to-chromium@^1.4.668: + version "1.4.765" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.765.tgz#c43f651b94d9c309acf165cd0fc17e9b025de03d" + integrity sha512-70APzI2AGyJgcWVSnfJCytP2Gejptk6cIm0t5uuUfwdKN63xBIZBzD0N5l/s0hWr8tj0w/p6UaPz+hLAm+Orjw== -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.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== @@ -5703,15 +6081,28 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emittery@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" - integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== +elliptic@^6.5.2, elliptic@^6.5.4: + version "6.5.5" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + 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" + +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== emoji-regex@^8.0.0: version "8.0.0" @@ -5728,52 +6119,37 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== +encode-utf8@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enhanced-resolve@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== +enhanced-resolve@^5.16.0: + version "5.16.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz#e8bc63d51b826d6f1cbc0a150ecb5a8b0c62e567" + integrity sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw== dependencies: - ansi-colors "^4.1.1" + graceful-fs "^4.2.4" + tapable "^2.2.0" entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" - integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== - -errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -5787,80 +6163,122 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" - integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" +es-abstract@^1.17.2, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - internal-slot "^1.0.4" - is-array-buffer "^3.0.1" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-length "^1.0.4" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.15" es-array-method-boxes-properly@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== -es-get-iterator@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.4" + +es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" +es-module-lexer@^1.2.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.2.tgz#00b423304f2500ac59359cc9b6844951f372d497" + integrity sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA== -es-shim-unscopables@^1.0.0: +es-object-atoms@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: - has "^1.0.3" + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -5871,13 +6289,14 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.62" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" - integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== +es5-ext@^0.10.35, es5-ext@^0.10.62, 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, es6-iterator@^2.0.3: @@ -5890,225 +6309,194 @@ es6-iterator@2.0.3, es6-iterator@^2.0.3: es6-symbol "^3.1.1" es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + 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.1" - ext "^1.1.2" + d "^1.0.2" + ext "^1.7.0" -escalade@^3.0.2, escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== +escodegen@^1.8.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" - estraverse "^5.2.0" + estraverse "^4.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -eslint-config-airbnb-base@^14.2.1: - version "14.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" - integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== - dependencies: - confusing-browser-globals "^1.0.10" - object.assign "^4.1.2" - object.entries "^1.1.2" - -eslint-config-airbnb@^18.2.0: - version "18.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz#b7fe2b42f9f8173e825b73c8014b592e449c98d9" - integrity sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg== - dependencies: - eslint-config-airbnb-base "^14.2.1" - object.assign "^4.1.2" - object.entries "^1.1.2" - -eslint-config-prettier@^6.14.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" - integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: - get-stdin "^6.0.0" + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" -eslint-config-react-app@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz#ccff9fc8e36b322902844cbd79197982be355a0e" - integrity sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A== +eslint-config-react-app@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" + integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== dependencies: - confusing-browser-globals "^1.0.10" - -eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + "@babel/core" "^7.16.0" + "@babel/eslint-parser" "^7.16.3" + "@rushstack/eslint-patch" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^5.5.0" + "@typescript-eslint/parser" "^5.5.0" + babel-preset-react-app "^10.0.1" + confusing-browser-globals "^1.0.11" + eslint-plugin-flowtype "^8.0.3" + eslint-plugin-import "^2.25.3" + eslint-plugin-jest "^25.3.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.27.1" + eslint-plugin-react-hooks "^4.3.0" + eslint-plugin-testing-library "^5.0.1" + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" + is-core-module "^2.13.0" + resolve "^1.22.4" -eslint-module-utils@^2.7.4: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== +eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== dependencies: debug "^3.2.7" -eslint-plugin-flowtype@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.0.tgz#a4bef5dc18f9b2bdb41569a4ab05d73805a3d261" - integrity sha512-z7ULdTxuhlRJcEe1MVljePXricuPOrsWfScRXFhNzVD5dmTHWjIF57AxD0e7AbEoLSbjSsaA5S+hCg43WvpXJQ== - dependencies: - lodash "^4.17.15" - string-natural-compare "^3.0.1" - -eslint-plugin-flowtype@^5.2.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz#7764cc63940f215bf3f0bd2d9a1293b2b9b2b4bb" - integrity sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw== +eslint-plugin-flowtype@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz#e1557e37118f24734aa3122e7536a038d34a4912" + integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== dependencies: - lodash "^4.17.15" + lodash "^4.17.21" string-natural-compare "^3.0.1" -eslint-plugin-html@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-html/-/eslint-plugin-html-6.2.0.tgz#715bc00b50bbd0d996e28f953c289a5ebec69d43" - integrity sha512-vi3NW0E8AJombTvt8beMwkL1R/fdRWl4QSNRNMhVQKWm36/X0KF0unGNAY4mqUF06mnwVWZcIcerrCnfn9025g== - dependencies: - htmlparser2 "^7.1.2" - -eslint-plugin-import@^2.22.1: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== +eslint-plugin-import@^2.25.3: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-jest@^24.1.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz#206ac0833841e59e375170b15f8d0955219c4889" - integrity sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA== - dependencies: - "@typescript-eslint/experimental-utils" "^4.0.1" - -eslint-plugin-jsx-a11y@^6.3.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" - integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== - dependencies: - "@babel/runtime" "^7.20.7" - aria-query "^5.1.3" - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - ast-types-flow "^0.0.7" - axe-core "^4.6.2" - axobject-query "^3.1.1" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jest@^25.3.0: + version "25.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" + integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== + dependencies: + "@typescript-eslint/experimental-utils" "^5.0.0" + +eslint-plugin-jsx-a11y@^6.5.1: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + dependencies: + "@babel/runtime" "^7.23.2" + aria-query "^5.3.0" + array-includes "^3.1.7" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "=4.7.0" + axobject-query "^3.2.1" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - has "^1.0.3" - jsx-ast-utils "^3.3.3" - language-tags "=1.0.5" + es-iterator-helpers "^1.0.15" + hasown "^2.0.0" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - semver "^6.3.0" - -eslint-plugin-prettier@^3.1.4: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" - integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-react-hooks@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" - integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== - -eslint-plugin-react-hooks@^4.2.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + object.entries "^1.1.7" + object.fromentries "^2.0.7" -eslint-plugin-react@^7.21.5: - version "7.32.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" - integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== - dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" +eslint-plugin-react-hooks@^4.3.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== + +eslint-plugin-react@^7.27.1: + version "7.34.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" doctrine "^2.1.0" + es-iterator-helpers "^1.0.17" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" prop-types "^15.8.1" - resolve "^2.0.0-next.4" - semver "^6.3.0" - string.prototype.matchall "^4.0.8" - -eslint-plugin-testing-library@^3.9.2: - version "3.10.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz#609ec2b0369da7cf2e6d9edff5da153cc31d87bd" - integrity sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA== - dependencies: - "@typescript-eslint/experimental-utils" "^3.10.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.10" -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== +eslint-plugin-testing-library@^5.0.1: + version "5.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz#5b46cdae96d4a78918711c0b4792f90088e62d20" + integrity sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw== dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" + "@typescript-eslint/utils" "^5.58.0" -eslint-scope@^5.0.0, eslint-scope@^5.1.1: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -6116,160 +6504,123 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-visitor-keys@^2.0.0: +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-webpack-plugin@^2.1.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.7.0.tgz#0525793a4f8c652c1c6d863995ce1e0f2dcbd143" - integrity sha512-bNaVVUvU4srexGhVcayn/F4pJAz19CWBkKoMx7aSQ4wtTbZQCnG5O9LHCE42mM+JSKOUp7n6vd5CIwzj7lOVGA== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-webpack-plugin@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" + integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== dependencies: - "@types/eslint" "^7.29.0" - arrify "^2.0.1" - jest-worker "^27.5.1" + "@types/eslint" "^7.29.0 || ^8.4.1" + jest-worker "^28.0.2" micromatch "^4.0.5" normalize-path "^3.0.0" - schema-utils "^3.1.1" - -eslint@7.12.0: - version "7.12.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.0.tgz#7b6a85f87a9adc239e979bb721cde5ce0dc27da6" - integrity sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.2.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.0" - esquery "^1.2.0" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash "^4.17.19" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -eslint@^7.11.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" + schema-utils "^4.0.0" + +eslint@^8.3.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" - minimatch "^3.0.4" + minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" + optionator "^0.9.3" + strip-ansi "^6.0.1" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +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@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.2.0, esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0, esrecurse@^4.3.0: +esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -6279,11 +6630,6 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== - estree-walker@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" @@ -6299,7 +6645,7 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -eth-block-tracker@4.4.3, eth-block-tracker@^4.4.2: +eth-block-tracker@4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== @@ -6311,7 +6657,18 @@ eth-block-tracker@4.4.3, eth-block-tracker@^4.4.2: pify "^3.0.0" safe-event-emitter "^1.0.1" -eth-json-rpc-filters@4.2.2, eth-json-rpc-filters@^4.2.1: +eth-block-tracker@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-7.1.0.tgz#dfc16085c6817cc30caabba381deb8d204c1c766" + integrity sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg== + dependencies: + "@metamask/eth-json-rpc-provider" "^1.0.0" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^5.0.1" + json-rpc-random-id "^1.0.1" + pify "^3.0.0" + +eth-json-rpc-filters@4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz#eb35e1dfe9357ace8a8908e7daee80b2cd60a10d" integrity sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw== @@ -6323,15 +6680,16 @@ eth-json-rpc-filters@4.2.2, eth-json-rpc-filters@^4.2.1: json-rpc-engine "^6.1.0" pify "^5.0.0" -eth-json-rpc-infura@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz#e6da7dc47402ce64c54e7018170d89433c4e8fb6" - integrity sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow== +eth-json-rpc-filters@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-6.0.1.tgz#0b3e370f017f5c6f58d3e7bd0756d8099ed85c56" + integrity sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig== dependencies: - eth-json-rpc-middleware "^6.0.0" - eth-rpc-errors "^3.0.0" - json-rpc-engine "^5.3.0" - node-fetch "^2.6.0" + "@metamask/safe-event-emitter" "^3.0.0" + async-mutex "^0.2.6" + eth-query "^2.1.2" + json-rpc-engine "^6.1.0" + pify "^5.0.0" eth-json-rpc-middleware@^6.0.0: version "6.0.0" @@ -6388,21 +6746,11 @@ eth-sig-util@^1.4.2: ethereumjs-util "^5.1.1" ethereum-bloom-filters@^1.0.6: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" - integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.1.0.tgz#b3fc1eb789509ee30db0bf99a2988ccacb8d0397" + integrity sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw== dependencies: - js-sha3 "^0.8.0" - -ethereum-common@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" - integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== - -ethereum-common@^0.0.18: - version "0.0.18" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" - integrity sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ== + "@noble/hashes" "^1.4.0" ethereum-cryptography@^0.1.3: version "0.1.3" @@ -6425,6 +6773,16 @@ ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz#1352270ed3b339fe25af5ceeadcf1b9c8e30768a" + integrity sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA== + dependencies: + "@noble/curves" "1.3.0" + "@noble/hashes" "1.3.3" + "@scure/bip32" "1.3.3" + "@scure/bip39" "1.2.2" + "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": version "0.6.8" resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" @@ -6432,59 +6790,7 @@ ethereum-cryptography@^0.1.3: bn.js "^4.11.8" ethereumjs-util "^6.0.0" -ethereumjs-account@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" - integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== - dependencies: - ethereumjs-util "^5.0.0" - rlp "^2.0.0" - safe-buffer "^5.1.1" - -ethereumjs-block@^1.2.2: - version "1.7.1" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" - integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== - dependencies: - async "^2.0.1" - ethereum-common "0.2.0" - ethereumjs-tx "^1.2.2" - ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" - -ethereumjs-block@~2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" - integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== - dependencies: - async "^2.0.1" - ethereumjs-common "^1.5.0" - ethereumjs-tx "^2.1.1" - ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" - -ethereumjs-common@^1.1.0, ethereumjs-common@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" - integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== - -ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" - integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== - dependencies: - ethereum-common "^0.0.18" - ethereumjs-util "^5.0.0" - -ethereumjs-tx@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" - integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== - dependencies: - ethereumjs-common "^1.5.0" - ethereumjs-util "^6.0.0" - -ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5: +ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2: version "5.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== @@ -6510,34 +6816,6 @@ ethereumjs-util@^6.0.0: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.1.0: - version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" - integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - rlp "^2.2.4" - -ethereumjs-vm@^2.3.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" - integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== - dependencies: - async "^2.1.2" - async-eventemitter "^0.2.2" - ethereumjs-account "^2.0.3" - ethereumjs-block "~2.2.0" - ethereumjs-common "^1.1.0" - ethereumjs-util "^6.0.0" - fake-merkle-patricia-tree "^1.0.1" - functional-red-black-tree "^1.0.1" - merkle-patricia-tree "^2.3.2" - rustbn.js "~0.2.0" - safe-buffer "^5.1.1" - ethers-multicall@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/ethers-multicall/-/ethers-multicall-0.2.3.tgz#872b5ad7d6b5d4d7f2960c33bf36bd46d034ac41" @@ -6545,7 +6823,7 @@ ethers-multicall@^0.2.1: dependencies: ethers "^5.0.0" -ethers@^5.0.0, ethers@^5.5.2: +ethers@5.7.2, ethers@^5.0.0: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -6597,22 +6875,30 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -eventemitter3@4.0.7, eventemitter3@^4.0.0: +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" + +eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.0.0: +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events@^3.0.0, events@^3.2.0, 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== -eventsource@^1.0.7: - version "1.1.2" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.2.tgz#bc75ae1c60209e7cb1541231980460343eaea7c2" - integrity sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: +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== @@ -6620,24 +6906,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -6653,58 +6921,73 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^26.6.0, expect@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" - integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== dependencies: - "@jest/types" "^26.6.2" - ansi-styles "^4.0.0" - jest-get-type "^26.3.0" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" expect@^29.0.0: - version "29.4.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.1.tgz#58cfeea9cbf479b64ed081fd1e074ac8beb5a1fe" - integrity sha512-OKrGESHOaMxK3b6zxIq9SOW8kEXztKff/Dvg88j4xIJxur1hspEbedVkR3GpHe5LO+WB2Qw7OWN0RMTdp6as5A== + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - "@jest/expect-utils" "^29.4.1" - jest-get-type "^29.2.0" - jest-matcher-utils "^29.4.1" - jest-message-util "^29.4.1" - jest-util "^29.4.1" + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" -express@^4.17.1: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== +express@^4.17.3: + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" + body-parser "1.20.2" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" @@ -6731,78 +7014,22 @@ express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" -ext@^1.1.2: +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" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -fake-merkle-patricia-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" - integrity sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA== - dependencies: - checkpoint-store "^1.1.0" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.1.1, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -6820,26 +7047,24 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-redact@^3.0.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" + integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== + fast-safe-stringify@^2.0.6: version "2.1.1" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ== - dependencies: - websocket-driver ">=0.5.1" - -faye-websocket@~0.11.1: +faye-websocket@^0.11.3: version "0.11.4" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== @@ -6853,18 +7078,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -6872,33 +7085,25 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-loader@6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.1.tgz#a6f29dfb3f5933a1c350b2dbaa20ac5be0539baa" - integrity sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw== +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== dependencies: loader-utils "^2.0.0" schema-utils "^3.0.0" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -filesize@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" - integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" + minimatch "^5.0.1" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== fill-range@^7.0.1: version "7.0.1" @@ -6907,6 +7112,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + finalhandler@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" @@ -6920,15 +7130,6 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - find-cache-dir@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" @@ -6938,22 +7139,6 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -6961,50 +7146,40 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== follow-redirects@^1.0.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== for-each@^0.3.3: version "0.3.3" @@ -7013,28 +7188,32 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" -fork-ts-checker-webpack-plugin@4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" - integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== dependencies: - "@babel/code-frame" "^7.5.5" - chalk "^2.4.1" - micromatch "^3.1.10" + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" minimatch "^3.0.4" - semver "^5.6.0" + schema-utils "2.7.0" + semver "^7.3.2" tapable "^1.0.0" - worker-rpc "^0.1.0" form-data@^3.0.0: version "3.0.1" @@ -7045,59 +7224,31 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-extra@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" + jsonfile "^6.0.1" + universalify "^2.0.0" -fs-extra@^9.0.1: +fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -7107,115 +7258,61 @@ fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" +fs-monkey@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" + integrity sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@^2.1.2, fsevents@^2.1.3, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fstream@^1.0.0, fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" -functions-have-names@^1.2.2: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" - gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" @@ -7227,22 +7324,10 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw== - -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" +get-port-please@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/get-port-please/-/get-port-please-3.1.2.tgz#502795e56217128e4183025c89a48c71652f4e49" + integrity sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ== get-stream@^5.0.0: version "5.2.0" @@ -7251,42 +7336,56 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" -glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^10.3.10: + version "10.3.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.15.tgz#e72bc61bc3038c90605f5dd48543dc67aaf3b50d" + integrity sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.6" + minimatch "^9.0.1" + minipass "^7.0.4" + path-scurry "^1.11.0" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -7298,19 +7397,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" -glob@~7.1.1: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@2.0.0: +global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== @@ -7326,53 +7413,27 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -global@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - -globals@^13.6.0, globals@^13.9.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" + define-properties "^1.2.1" + gopd "^1.0.1" -globby@^11.0.3: +globby@^11.0.3, globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -7384,26 +7445,6 @@ globby@^11.0.3: merge2 "^1.4.1" slash "^3.0.0" -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globule@^1.0.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.4.tgz#7c11c43056055a75a6e68294453c17f2796170fb" - integrity sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg== - dependencies: - glob "~7.1.1" - lodash "^4.17.21" - minimatch "~3.0.2" - gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -7411,10 +7452,15 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + 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== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== graphql-tag@^2.12.6: version "2.12.6" @@ -7428,49 +7474,39 @@ graphql@^15.4.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== - -gzip-size@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" - integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== dependencies: - duplexer "^0.1.1" - pify "^4.0.1" + duplexer "^0.1.2" + +h3@^1.10.2, h3@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/h3/-/h3-1.11.1.tgz#e9414ae6f2a076a345ea07256b320edb29bab9f7" + integrity sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A== + dependencies: + cookie-es "^1.0.0" + crossws "^0.2.2" + defu "^6.1.4" + destr "^2.0.3" + iron-webcrypto "^1.0.0" + ohash "^1.1.3" + radix3 "^1.1.0" + ufo "^1.4.0" + uncrypto "^0.1.3" + unenv "^1.9.0" handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - harmony-reflect@^1.4.6: version "1.6.2" resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" - has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -7486,72 +7522,29 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.1.1" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.0, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - function-bind "^1.1.1" + has-symbols "^1.0.3" hash-base@^3.0.0: version "3.1.0" @@ -7570,15 +7563,22 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== history@^4.9.0: version "4.10.1" @@ -7601,7 +7601,7 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -7613,11 +7613,6 @@ hoopy@^0.1.4: resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -7628,16 +7623,6 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A== - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA== - html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -7645,28 +7630,28 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" -html-entities@^1.2.1, html-entities@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" - integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== +html-entities@^2.1.0, html-entities@^2.3.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -html-minifier-terser@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" - integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== dependencies: - camel-case "^4.1.1" - clean-css "^4.2.3" - commander "^4.1.1" + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" he "^1.2.0" - param-case "^3.0.3" + param-case "^3.0.4" relateurl "^0.2.7" - terser "^4.6.3" + terser "^5.10.0" html-parse-stringify@^3.0.1: version "3.0.1" @@ -7675,20 +7660,16 @@ html-parse-stringify@^3.0.1: dependencies: void-elements "3.1.0" -html-webpack-plugin@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" - integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw== +html-webpack-plugin@^5.5.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" + integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== dependencies: - "@types/html-minifier-terser" "^5.0.0" - "@types/tapable" "^1.0.5" - "@types/webpack" "^4.41.8" - html-minifier-terser "^5.0.1" - loader-utils "^1.2.3" - lodash "^4.17.15" - pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" htmlparser2@^6.1.0: version "6.1.0" @@ -7700,16 +7681,6 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" -htmlparser2@^7.1.2: - version "7.2.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" - integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.2" - domutils "^2.8.0" - entities "^3.0.1" - http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -7750,17 +7721,18 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: - http-proxy "^1.17.0" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" -http-proxy@^1.17.0: +http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== @@ -7769,19 +7741,10 @@ http-proxy@^1.17.0: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== +http-shutdown@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/http-shutdown/-/http-shutdown-1.2.2.tgz#41bc78fc767637c4c95179bc492f312c0ae64c5f" + integrity sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw== https-proxy-agent@^5.0.0: version "5.0.1" @@ -7796,6 +7759,16 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + hyphenate-style-name@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" @@ -7829,71 +7802,56 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: - postcss "^7.0.14" + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -identity-obj-proxy@3.0.0: +idb-keyval@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" + integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== + +idb@^7.0.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + +identity-obj-proxy@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== dependencies: harmony-reflect "^1.4.6" -ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: +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== -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -immediate@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" - integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== +ignore@^5.1.4, ignore@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -immer@8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" - integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== +immer@^9.0.7: + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== immutable@^4.0.0: - version "4.2.4" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" - integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== - -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg== - dependencies: - import-from "^2.1.0" - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" + version "4.3.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" + integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -7901,21 +7859,6 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-from@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w== - dependencies: - resolve-from "^3.0.0" - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - import-local@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" @@ -7929,33 +7872,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -in-publish@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" - integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg== - dependencies: - repeating "^2.0.0" - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA== - -infer-owner@^1.0.3, infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -7964,16 +7885,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== - inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -7984,21 +7900,13 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== - dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" - -internal-slot@^1.0.3, internal-slot@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" - integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" + es-errors "^1.3.0" + hasown "^2.0.0" side-channel "^1.0.4" invariant@^2.2.4: @@ -8008,61 +7916,28 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== - -ip@^1.1.0, ip@^1.1.5: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== - -ipaddr.js@1.9.1, ipaddr.js@^1.9.0: +ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg== - -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" +ipaddr.js@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== -is-arguments@^1.0.4, is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" +iron-webcrypto@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz#aa60ff2aa10550630f4c0b11fd2442becdb35a6f" + integrity sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg== -is-array-buffer@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" - integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" @@ -8074,6 +7949,13 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -8081,13 +7963,6 @@ is-bigint@^1.0.1: dependencies: has-bigints "^1.0.1" -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== - dependencies: - binary-extensions "^1.0.0" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -8108,55 +7983,24 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA== - dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" - -is-core-module@^2.0.0, is-core-module@^2.11.0, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== +is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - kind-of "^3.0.2" + hasown "^2.0.0" -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== dependencies: - kind-of "^6.0.0" + is-typed-array "^1.1.13" is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" @@ -8165,94 +8009,44 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== - -is-docker@^2.0.0: +is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - -is-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" - integrity sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg== - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + call-bind "^1.0.2" is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: - is-extglob "^2.1.0" + has-tostringtag "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" @@ -8266,20 +8060,27 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" @@ -8288,13 +8089,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -8305,48 +8099,22 @@ is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-regex@^1.0.4, is-regex@^1.1.4: +is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -8359,38 +8127,33 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - -is-root@2.1.0: +is-root@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + call-bind "^1.0.7" is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -8405,31 +8168,22 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.14" -is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~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-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: version "1.0.2" @@ -8438,84 +8192,69 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + call-bind "^1.0.7" + get-intrinsic "^1.2.4" -is-wsl@^2.1.1, is-wsl@^2.2.0: +is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + +is64bit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is64bit/-/is64bit-2.0.0.tgz#198c627cbcb198bbec402251f88e5e1a51236c07" + integrity sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw== + dependencies: + system-architecture "^0.1.0" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isarray@^2.0.1, isarray@^2.0.5: +isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== +isomorphic-unfetch@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + node-fetch "^2.6.1" + unfetch "^4.2.0" istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== -istanbul-lib-instrument@^5.0.4: +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== @@ -8527,12 +8266,12 @@ istanbul-lib-instrument@^5.0.4: semver "^6.3.0" istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: @@ -8544,94 +8283,127 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" - integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== dependencies: - "@jest/types" "^26.6.2" - execa "^4.0.0" - throat "^5.0.0" + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" -jest-circus@26.6.0: - version "26.6.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-26.6.0.tgz#7d9647b2e7f921181869faae1f90a2629fd70705" - integrity sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng== +jackspeak@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.0" - "@jest/test-result" "^26.6.0" - "@jest/types" "^26.6.0" - "@types/babel__traverse" "^7.0.4" + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jake@^10.8.5: + version "10.9.1" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.1.tgz#8dc96b7fcc41cb19aa502af506da4e1d56f5e62b" + integrity sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" - expect "^26.6.0" + expect "^27.5.1" is-generator-fn "^2.0.0" - jest-each "^26.6.0" - jest-matcher-utils "^26.6.0" - jest-message-util "^26.6.0" - jest-runner "^26.6.0" - jest-runtime "^26.6.0" - jest-snapshot "^26.6.0" - jest-util "^26.6.0" - pretty-format "^26.6.0" - stack-utils "^2.0.2" - throat "^5.0.0" - -jest-cli@^26.6.0: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" - integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== - dependencies: - "@jest/core" "^26.6.3" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" chalk "^4.0.0" exit "^0.1.2" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.6.3" - jest-util "^26.6.2" - jest-validate "^26.6.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" prompts "^2.0.1" - yargs "^15.4.1" + yargs "^16.2.0" -jest-config@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" - integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.6.3" - "@jest/types" "^26.6.2" - babel-jest "^26.6.3" + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" chalk "^4.0.0" + ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.1" - graceful-fs "^4.2.4" - jest-environment-jsdom "^26.6.2" - jest-environment-node "^26.6.2" - jest-get-type "^26.3.0" - jest-jasmine2 "^26.6.3" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - micromatch "^4.0.2" - pretty-format "^26.6.2" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" -jest-diff@^26.0.0, jest-diff@^26.6.2: +jest-diff@^26.0.0: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== @@ -8641,178 +8413,206 @@ jest-diff@^26.0.0, jest-diff@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-diff@^29.4.1: - version "29.4.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.1.tgz#9a6dc715037e1fa7a8a44554e7d272088c4029bd" - integrity sha512-uazdl2g331iY56CEyfbNA0Ut7Mn2ulAG5vUaEHXycf1L6IPyuImIxSz4F0VYBKi7LYIuxOwTZzK3wh5jHzASMw== +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" - diff-sequences "^29.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.4.1" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== dependencies: detect-newline "^3.0.0" -jest-each@^26.6.0, jest-each@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" - integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.5.1" chalk "^4.0.0" - jest-get-type "^26.3.0" - jest-util "^26.6.2" - pretty-format "^26.6.2" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" -jest-environment-jsdom@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" - integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - jsdom "^16.4.0" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" -jest-environment-node@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-mock "^27.5.1" + jest-util "^27.5.1" jest-get-type@^26.3.0: version "26.3.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== -jest-get-type@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" - integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.5.1" "@types/graceful-fs" "^4.1.2" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" walker "^1.0.7" optionalDependencies: - fsevents "^2.1.2" + fsevents "^2.3.2" -jest-jasmine2@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" - integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - expect "^26.6.2" + expect "^27.5.1" is-generator-fn "^2.0.0" - jest-each "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - pretty-format "^26.6.2" - throat "^5.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" -jest-leak-detector@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" - integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== +jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== dependencies: - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" -jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" - integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-matcher-utils@^29.4.1: - version "29.4.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.1.tgz#73d834e305909c3b43285fbc76f78bf0ad7e1954" - integrity sha512-k5h0u8V4nAEy6lSACepxL/rw78FLDkBnXhZVgFneVpnJONhb2DhZj/Gv4eNe+1XqQ5IhgUcqj745UwH0HJmMnA== +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" chalk "^4.0.0" - jest-diff "^29.4.1" - jest-get-type "^29.2.0" - pretty-format "^29.4.1" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" -jest-message-util@^26.6.0, jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.2" + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" slash "^3.0.0" - stack-utils "^2.0.2" + stack-utils "^2.0.3" -jest-message-util@^29.4.1: - version "29.4.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.1.tgz#522623aa1df9a36ebfdffb06495c7d9d19e8a845" - integrity sha512-H4/I0cXUaLeCw6FM+i4AwCnOwHRgitdaUFOdm49022YD5nfyr8C/DrbXOBEyJaj+w/y0gGJ57klssOaUiLLQGQ== +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.4.1" + "@jest/types" "^29.6.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.4.1" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.5.1" "@types/node" "*" jest-pnp-resolver@^1.2.2: @@ -8820,208 +8620,221 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== -jest-resolve-dependencies@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" - integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== - dependencies: - "@jest/types" "^26.6.2" - jest-regex-util "^26.0.0" - jest-snapshot "^26.6.2" +jest-regex-util@^28.0.0: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== -jest-resolve@26.6.0: - version "26.6.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.0.tgz#070fe7159af87b03e50f52ea5e17ee95bbee40e1" - integrity sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ== +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== dependencies: - "@jest/types" "^26.6.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.2" - jest-util "^26.6.0" - read-pkg-up "^7.0.1" - resolve "^1.17.0" - slash "^3.0.0" + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" -jest-resolve@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" - integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== +jest-resolve@^27.4.2, jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.5.1" chalk "^4.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" jest-pnp-resolver "^1.2.2" - jest-util "^26.6.2" - read-pkg-up "^7.0.1" - resolve "^1.18.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^26.6.0, jest-runner@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" - integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" - emittery "^0.7.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-docblock "^26.0.0" - jest-haste-map "^26.6.2" - jest-leak-detector "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - jest-runtime "^26.6.3" - jest-util "^26.6.2" - jest-worker "^26.6.2" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" source-map-support "^0.5.6" - throat "^5.0.0" - -jest-runtime@^26.6.0, jest-runtime@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" - integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/globals" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/yargs" "^15.0.0" + throat "^6.0.1" + +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" chalk "^4.0.0" - cjs-module-lexer "^0.6.0" + cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - exit "^0.1.2" + execa "^5.0.0" glob "^7.1.3" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^15.4.1" -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== dependencies: "@types/node" "*" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" -jest-snapshot@^26.6.0, jest-snapshot@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" - integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" "@babel/types" "^7.0.0" - "@jest/types" "^26.6.2" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.0.0" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^26.6.2" - graceful-fs "^4.2.4" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - jest-haste-map "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" natural-compare "^1.4.0" - pretty-format "^26.6.2" + pretty-format "^27.5.1" semver "^7.3.2" -jest-util@^26.6.0, jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== +jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" -jest-util@^29.4.1: - version "29.4.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.1.tgz#2eeed98ff4563b441b5a656ed1a786e3abc3e4c4" - integrity sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ== +jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== dependencies: - "@jest/types" "^29.4.1" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" + "@jest/types" "^29.6.3" + "@types/node" "*" chalk "^4.0.0" - jest-get-type "^26.3.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" leven "^3.1.0" - pretty-format "^26.6.2" + pretty-format "^27.5.1" -jest-watch-typeahead@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz#45221b86bb6710b7e97baaa1640ae24a07785e63" - integrity sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg== +jest-watch-typeahead@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz#b4a6826dfb9c9420da2f7bc900de59dad11266a9" + integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== dependencies: ansi-escapes "^4.3.1" chalk "^4.0.0" - jest-regex-util "^26.0.0" - jest-watcher "^26.3.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" + jest-regex-util "^28.0.0" + jest-watcher "^28.0.0" + slash "^4.0.0" + string-length "^5.0.1" + strip-ansi "^7.0.1" -jest-watcher@^26.3.0, jest-watcher@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" - integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== dependencies: - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^26.6.2" + jest-util "^27.5.1" string-length "^4.0.1" -jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== +jest-watcher@^28.0.0: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" -jest-worker@^26.5.0, jest-worker@^26.6.2: +jest-worker@^26.2.1: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== @@ -9030,7 +8843,7 @@ jest-worker@^26.5.0, jest-worker@^26.6.2: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^27.5.1: +jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== @@ -9039,26 +8852,35 @@ jest-worker@^27.5.1: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@26.6.0: - version "26.6.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.0.tgz#546b25a1d8c888569dbbe93cae131748086a4a25" - integrity sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA== +jest-worker@^28.0.2: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^27.4.3: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== dependencies: - "@jest/core" "^26.6.0" + "@jest/core" "^27.5.1" import-local "^3.0.2" - jest-cli "^26.6.0" + jest-cli "^27.5.1" -js-base64@^2.1.8: - version "2.6.4" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" - integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== +jiti@^1.21.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== js-sha256@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== -js-sha3@0.8.0, js-sha3@^0.8.0: +js-sha3@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -9076,12 +8898,14 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" -jsdom@^16.4.0: +jsdom@^16.6.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== @@ -9124,12 +8948,12 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-even-better-errors@^2.3.0: +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -9165,7 +8989,7 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.4.0: +json-schema@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== @@ -9176,41 +9000,27 @@ json-stable-stringify-without-jsonify@^1.0.1: integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stable-stringify@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" - integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== + version "1.1.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" + integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== dependencies: + call-bind "^1.0.5" + isarray "^2.0.5" jsonify "^0.0.1" + object-keys "^1.1.1" -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json3@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== - -json5@^1.0.1: +json5@^1.0.1, json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.2: +json5@^2.1.2, json5@^2.2.0, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -9225,23 +9035,29 @@ jsonify@^0.0.1: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== +jsonpath@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.12.1" -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== +jsonpointer@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" keccak256@^1.0.6: version "1.0.6" @@ -9252,128 +9068,61 @@ keccak256@^1.0.6: buffer "^6.0.3" keccak "^3.0.2" -keccak@^3.0.0, keccak@^3.0.1, keccak@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" - integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== +keccak@^3.0.0, keccak@^3.0.1, keccak@^3.0.2, keccak@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" readable-stream "^3.6.0" +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + keyvaluestorage-interface@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -klona@^2.0.4: +klona@^2.0.4, klona@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== -language-subtag-registry@~0.3.2: +language-subtag-registry@^0.3.20: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== -language-tags@=1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== - dependencies: - language-subtag-registry "~0.3.2" - -last-call-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" - integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== - dependencies: - lodash "^4.17.5" - webpack-sources "^1.1.0" - -level-codec@~7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" - integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== - -level-errors@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" - integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w== - dependencies: - errno "~0.1.1" - -level-errors@~1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" - integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== dependencies: - errno "~0.1.1" + language-subtag-registry "^0.3.20" -level-iterator-stream@~1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" - integrity sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw== +launch-editor@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: - inherits "^2.0.1" - level-errors "^1.0.3" - readable-stream "^1.0.33" - xtend "^4.0.0" - -level-ws@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" - integrity sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw== - dependencies: - readable-stream "~1.0.15" - xtend "~2.1.1" - -levelup@^1.2.1: - version "1.3.9" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" - integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== - dependencies: - deferred-leveldown "~1.2.1" - level-codec "~7.0.0" - level-errors "~1.0.3" - level-iterator-stream "~1.3.0" - prr "~1.0.1" - semver "~5.4.1" - xtend "~4.0.0" + picocolors "^1.0.0" + shell-quote "^1.8.1" leven@^3.1.0: version "3.1.0" @@ -9396,37 +9145,101 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lilconfig@^2.0.3, lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lilconfig@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" + integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== +listhen@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/listhen/-/listhen-1.7.2.tgz#66b81740692269d5d8cafdc475020f2fc51afbae" + integrity sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g== + dependencies: + "@parcel/watcher" "^2.4.1" + "@parcel/watcher-wasm" "^2.4.1" + citty "^0.1.6" + clipboardy "^4.0.0" + consola "^3.2.3" + crossws "^0.2.0" + defu "^6.1.4" + get-port-please "^3.1.2" + h3 "^1.10.2" + http-shutdown "^1.2.2" + jiti "^1.21.0" + mlly "^1.6.1" + node-forge "^1.3.1" + pathe "^1.1.2" + std-env "^3.7.0" + ufo "^1.4.0" + untun "^0.1.3" + uqr "^0.1.2" + +lit-element@^3.3.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-3.3.3.tgz#10bc19702b96ef5416cf7a70177255bfb17b3209" + integrity sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA== dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" + "@lit-labs/ssr-dom-shim" "^1.1.0" + "@lit/reactive-element" "^1.3.0" + lit-html "^2.8.0" -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== +lit-element@^4.0.0: + version "4.0.5" + resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-4.0.5.tgz#f20cd8a6231eaf5358f7a6877ca6ea7628fa2015" + integrity sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q== + dependencies: + "@lit-labs/ssr-dom-shim" "^1.2.0" + "@lit/reactive-element" "^2.0.4" + lit-html "^3.1.2" -loader-utils@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== +lit-html@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-2.8.0.tgz#96456a4bb4ee717b9a7d2f94562a16509d39bffa" + integrity sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q== dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" + "@types/trusted-types" "^2.0.2" + +lit-html@^3.1.0, lit-html@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-3.1.3.tgz#ae2e9fee0258d0a1b5d7b86c87da51117e4f911b" + integrity sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA== + dependencies: + "@types/trusted-types" "^2.0.2" + +lit@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/lit/-/lit-2.8.0.tgz#4d838ae03059bf9cafa06e5c61d8acc0081e974e" + integrity sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA== + dependencies: + "@lit/reactive-element" "^1.6.0" + lit-element "^3.3.0" + lit-html "^2.8.0" + +lit@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lit/-/lit-3.1.0.tgz#76429b85dc1f5169fed499a0f7e89e2e619010c9" + integrity sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w== + dependencies: + "@lit/reactive-element" "^2.0.0" + lit-element "^4.0.0" + lit-html "^3.1.0" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: +loader-utils@^1.2.3: version "1.4.2" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== @@ -9435,7 +9248,7 @@ loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" -loader-utils@^2.0.0: +loader-utils@^2.0.0, loader-utils@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== @@ -9444,6 +9257,11 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -9459,16 +9277,23 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.isequal@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -9479,41 +9304,21 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0: +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -loglevel@^1.6.8: - version "1.8.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" - integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -9521,14 +9326,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ== - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -9536,13 +9333,10 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" +lru-cache@^10.2.0: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== lru-cache@^5.1.1: version "5.1.1" @@ -9551,22 +9345,10 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -ltgt@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== - lz-string@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" - integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.9" @@ -9575,21 +9357,20 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.0, make-dir@^3.0.2: +make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -9602,23 +9383,6 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - matchmediaquery@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/matchmediaquery/-/matchmediaquery-0.3.1.tgz#8247edc47e499ebb7c58f62a9ff9ccf5b815c6d7" @@ -9650,49 +9414,12 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memdown@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" - integrity sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w== - dependencies: - abstract-leveldown "~2.7.1" - functional-red-black-tree "^1.0.1" - immediate "^3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.1.1" - -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== +memfs@^3.1.2, memfs@^3.4.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA== - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" + fs-monkey "^1.0.4" merge-descriptors@1.0.1: version "1.0.1" @@ -9709,20 +9436,6 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" - integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== - dependencies: - async "^1.4.2" - ethereumjs-util "^5.0.0" - level-ws "0.0.0" - levelup "^1.2.1" - memdown "^1.0.0" - readable-stream "^2.0.0" - rlp "^2.0.0" - semaphore ">=1.0.1" - merkletreejs@^0.2.32: version "0.2.32" resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.2.32.tgz#cf1c0760e2904e4a1cc269108d6009459fd06223" @@ -9744,29 +9457,10 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -microevent.ts@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" - integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" @@ -9776,20 +9470,12 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -9801,37 +9487,33 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== - dependencies: - dom-walk "^0.1.0" +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -mini-css-extract-plugin@0.11.3: - version "0.11.3" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz#15b0910a7f32e62ffde4a7430cfefbd700724ea6" - integrity sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA== +mini-css-extract-plugin@^2.4.5: + version "2.9.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz#c73a1327ccf466f69026ac22a8e8fd707b78a235" + integrity sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA== dependencies: - loader-utils "^1.1.0" - normalize-url "1.9.1" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" + schema-utils "^4.0.0" + tapable "^2.2.1" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" @@ -9843,122 +9525,67 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@~3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" - integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: - yallist "^4.0.0" - -minipass@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.2.tgz#26fc3364d5ea6cb971c6e5259eac67a0887510d1" - integrity sha512-4Hbzei7ZyBp+1aw0874YWpKOubZd/jc53/XU+gkYry1QV+VvrbO8icLM5CUtm4F0hyXn85DXYKEMIS26gitD3A== + brace-expansion "^2.0.1" -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== +minimatch@^9.0.1: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== dependencies: - minipass "^3.0.0" - yallist "^4.0.0" + brace-expansion "^2.0.1" -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: + version "7.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" + integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.6, mkdirp@~0.5.1: +mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -mri@^1.1.5: +mlly@^1.6.1, mlly@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.0.tgz#587383ae40dda23cadb11c3c3cc972b277724271" + integrity sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ== + dependencies: + acorn "^8.11.3" + pathe "^1.1.2" + pkg-types "^1.1.0" + ufo "^1.5.3" + +motion@10.16.2: + version "10.16.2" + resolved "https://registry.yarnpkg.com/motion/-/motion-10.16.2.tgz#7dc173c6ad62210a7e9916caeeaf22c51e598d21" + integrity sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ== + dependencies: + "@motionone/animation" "^10.15.1" + "@motionone/dom" "^10.16.2" + "@motionone/svelte" "^10.16.2" + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" + "@motionone/vue" "^10.16.2" + +mri@^1.1.5, 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== @@ -9978,19 +9605,19 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ== - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== dependencies: - dns-packet "^1.3.1" + dns-packet "^5.2.2" thunky "^1.0.2" +multiformats@^9.4.2: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + multimatch@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" @@ -10002,39 +9629,29 @@ multimatch@^4.0.0: arrify "^2.0.1" minimatch "^3.0.4" -nan@^2.12.1, nan@^2.13.2: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== -native-url@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.2.6.tgz#ca1258f5ace169c716ff44eccbddb674e10399ae" - integrity sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA== - dependencies: - querystring "^0.2.0" +napi-wasm@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/napi-wasm/-/napi-wasm-1.1.0.tgz#bbe617823765ae9c1bc12ff5942370eae7b2ba4e" + integrity sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== natural-compare@^1.4.0: version "1.4.0" @@ -10046,7 +9663,7 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -10056,11 +9673,6 @@ next-tick@^1.1.0: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -10074,6 +9686,16 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-addon-api@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.0.tgz#71f609369379c08e251c558527a107107b5e0fdb" + integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g== + +node-fetch-native@^1.6.1, node-fetch-native@^1.6.2, node-fetch-native@^1.6.3: + version "1.6.4" + resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.4.tgz#679fc8fd8111266d47d7e72c379f1bed9acff06e" + integrity sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ== + node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -10081,143 +9703,32 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== +node-fetch@^2.6.1, node-fetch@^2.6.12: + 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-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== +node-forge@^1, node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== node-gyp-build@^4.2.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" - integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== - -node-gyp@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" + version "4.8.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" + integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-notifier@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" - integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.2" - shellwords "^0.1.1" - uuid "^8.3.0" - which "^2.0.2" - -node-releases@^1.1.61: - version "1.1.77" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" - integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== - -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== - -node-sass@^4.14.1: - version "4.14.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" - integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash "^4.17.15" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.13.2" - node-gyp "^3.8.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "2.2.5" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - -"nopt@2 || 3": - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== - dependencies: - abbrev "1" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -10229,44 +9740,24 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -normalize-url@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ== - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" + path-key "^4.0.0" nth-check@^1.0.2: version "1.0.2" @@ -10282,16 +9773,6 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" @@ -10301,126 +9782,123 @@ number-to-bn@1.7.0: strip-hex-prefix "1.0.0" nwsapi@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + version "2.2.10" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.10.tgz#0b77a68e21a0b483db70b11fad055906e867cda8" + integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ== -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-is@^1.0.1, object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - integrity sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.0, object.entries@^1.1.2, object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== +object.entries@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.5" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" - integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== - dependencies: - array.prototype.reduce "^1.0.5" - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" +object.getownpropertydescriptors@^2.1.0: + version "2.1.8" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz#2f1fe0606ec1a7658154ccd4f728504f69667923" + integrity sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A== + dependencies: + array.prototype.reduce "^1.0.6" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + gopd "^1.0.1" + safe-array-concat "^1.1.2" -object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== +object.hasown@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== dependencies: - isobject "^3.0.1" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.values@^1.1.0, object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== +object.values@^1.1.0, object.values@^1.1.6, object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +ofetch@^1.3.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.3.4.tgz#7ea65ced3c592ec2b9906975ae3fe1d26a56f635" + integrity sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw== + dependencies: + destr "^2.0.3" + node-fetch-native "^1.6.3" + ufo "^1.5.3" + +ohash@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/ohash/-/ohash-1.1.3.tgz#f12c3c50bfe7271ce3fd1097d42568122ccdcf07" + integrity sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw== + +on-exit-leak-free@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" + integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -10440,43 +9918,38 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -open@^7.0.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" + mimic-fn "^4.0.0" -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== +open@^8.0.9, open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: - is-wsl "^1.1.0" + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" -optimism@^0.16.1: - version "0.16.2" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.2.tgz#519b0c78b3b30954baed0defe5143de7776bf081" - integrity sha512-zWNbgWj+3vLEjZNIh/okkY2EUfX+vB9TJopzIZwT1xxaMqC5hRLLraePod4c5n4He08xuXNH+zhKFFCu390wiQ== +optimism@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.18.0.tgz#e7bb38b24715f3fdad8a9a7fc18e999144bbfa63" + integrity sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ== dependencies: + "@wry/caches" "^1.0.0" "@wry/context" "^0.7.0" - "@wry/trie" "^0.3.0" - -optimize-css-assets-webpack-plugin@5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" - integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== - dependencies: - cssnano "^4.1.10" - last-call-webpack-plugin "^3.0.0" + "@wry/trie" "^0.4.3" + tslib "^2.3.0" optionator@^0.8.1: version "0.8.3" @@ -10490,50 +9963,17 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -osenv@0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-each-series@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" - integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + word-wrap "^1.2.5" p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" @@ -10563,45 +10003,27 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: - aggregate-error "^3.0.0" + p-limit "^3.0.2" -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: - retry "^0.12.0" + "@types/retry" "0.12.0" + retry "^0.13.1" p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -param-case@^3.0.3: +param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== @@ -10616,38 +10038,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-headers@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" - integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -10675,28 +10066,6 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -10712,26 +10081,29 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6, path-parse@^1.0.7: +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -10744,21 +10116,17 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^4.0.0: version "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.17, pbkdf2@^3.0.3: +pathe@^1.1.1, pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + +pbkdf2@^3.0.17: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -10784,12 +10152,12 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0: +pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== @@ -10799,39 +10167,45 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - pify@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== +pino-abstract-transport@v0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" + integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -pirates@^4.0.1: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + duplexify "^4.1.2" + split2 "^4.0.0" -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" +pino-std-serializers@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz#1791ccd2539c091ae49ce9993205e2cd5dbba1e2" + integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== + +pino@7.11.0: + version "7.11.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-7.11.0.tgz#0f0ea5c4683dc91388081d44bff10c83125066f6" + integrity sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.0.0" + on-exit-leak-free "^0.2.0" + pino-abstract-transport v0.5.0 + pino-std-serializers "^4.0.0" + process-warning "^1.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.1.0" + safe-stable-stringify "^2.1.0" + sonic-boom "^2.2.1" + thread-stream "^0.15.1" + +pirates@^4.0.1, pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" @@ -10840,679 +10214,572 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-up@3.1.0: +pkg-types@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.1.1.tgz#07b626880749beb607b0c817af63aac1845a73f2" + integrity sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ== + dependencies: + confbox "^0.1.7" + mlly "^1.7.0" + pathe "^1.1.2" + +pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== dependencies: find-up "^3.0.0" -pngjs@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" - integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== -pnp-webpack-plugin@1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== - dependencies: - ts-pnp "^1.1.6" +pony-cause@^2.1.10: + version "2.1.11" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.11.tgz#d69a20aaccdb3bdb8f74dd59e5c68d8e6772e4bd" + integrity sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg== -portfinder@^1.0.26: - version "1.0.32" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" - integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== - dependencies: - async "^2.6.4" - debug "^3.2.7" - mkdirp "^0.5.6" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss-attribute-case-insensitive@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" - integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== +postcss-attribute-case-insensitive@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" + integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== dependencies: - postcss "^7.0.2" - postcss-selector-parser "^6.0.2" + postcss-selector-parser "^6.0.10" -postcss-browser-comments@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" - integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== +postcss-browser-comments@^4: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz#bcfc86134df5807f5d3c0eefa191d42136b5e72a" + integrity sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg== + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== dependencies: - postcss "^7" + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" -postcss-calc@^7.0.1: - version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" - integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== dependencies: - postcss "^7.0.27" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" + postcss-value-parser "^4.2.0" -postcss-color-functional-notation@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" - integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== +postcss-color-functional-notation@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" + integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-color-gray@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" - integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== +postcss-color-hex-alpha@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" + integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.5" - postcss-values-parser "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-color-hex-alpha@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" - integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== +postcss-color-rebeccapurple@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" + integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== dependencies: - postcss "^7.0.14" - postcss-values-parser "^2.0.1" + postcss-value-parser "^4.2.0" -postcss-color-mod-function@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" - integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" -postcss-color-rebeccapurple@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" - integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== +postcss-custom-media@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" + integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== +postcss-custom-properties@^12.1.10: + version "12.1.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz#d14bb9b3989ac4d40aaa0e110b43be67ac7845cf" + integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-custom-media@^7.0.8: - version "7.0.8" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" - integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== +postcss-custom-selectors@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" + integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== dependencies: - postcss "^7.0.14" + postcss-selector-parser "^6.0.4" -postcss-custom-properties@^8.0.11: - version "8.0.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" - integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== +postcss-dir-pseudo-class@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" + integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== dependencies: - postcss "^7.0.17" - postcss-values-parser "^2.0.1" + postcss-selector-parser "^6.0.10" -postcss-custom-selectors@^5.1.2: +postcss-discard-comments@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" - integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== -postcss-dir-pseudo-class@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" - integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== +postcss-double-position-gradients@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" + integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== dependencies: - postcss "^7.0.0" + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== +postcss-env-function@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" + integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== dependencies: - postcss "^7.0.0" + postcss-value-parser "^4.2.0" -postcss-double-position-gradients@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" - integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== - dependencies: - postcss "^7.0.5" - postcss-values-parser "^2.0.0" +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== -postcss-env-function@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" - integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== +postcss-focus-visible@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" + integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + postcss-selector-parser "^6.0.9" -postcss-flexbugs-fixes@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" - integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== +postcss-focus-within@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" + integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== dependencies: - postcss "^7.0.26" + postcss-selector-parser "^6.0.9" -postcss-focus-visible@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" - integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== - dependencies: - postcss "^7.0.2" +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== -postcss-focus-within@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" - integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== - dependencies: - postcss "^7.0.2" +postcss-gap-properties@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" + integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== -postcss-font-variant@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" - integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== +postcss-image-set-function@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" + integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== dependencies: - postcss "^7.0.2" + postcss-value-parser "^4.2.0" -postcss-gap-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" - integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: - postcss "^7.0.2" + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" -postcss-image-set-function@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" - integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== -postcss-initial@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" - integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: - postcss "^7.0.2" + camelcase-css "^2.0.1" -postcss-lab-function@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" - integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== +postcss-lab-function@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" + integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" -postcss-load-config@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" - integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: - cosmiconfig "^5.0.0" - import-cwd "^2.0.0" + lilconfig "^3.0.0" + yaml "^2.3.4" -postcss-loader@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" -postcss-logical@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" - integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== - dependencies: - postcss "^7.0.2" +postcss-logical@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" + integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== -postcss-media-minmax@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" - integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== - dependencies: - postcss "^7.0.2" +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== dependencies: - browserslist "^4.0.0" + browserslist "^4.21.4" caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" + browserslist "^4.21.4" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + postcss-selector-parser "^6.0.5" -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== -postcss-modules-local-by-default@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== +postcss-modules-local-by-default@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" + integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" + icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== +postcss-modules-scope@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" + integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" + postcss-selector-parser "^6.0.4" -postcss-modules-values@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" + icss-utils "^5.0.0" -postcss-nesting@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" - integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== dependencies: - postcss "^7.0.2" + postcss-selector-parser "^6.0.11" -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== +postcss-nesting@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" + integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== dependencies: - postcss "^7.0.0" + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" -postcss-normalize@8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" - integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== dependencies: - "@csstools/normalize.css" "^10.1.0" - browserslist "^4.6.2" - postcss "^7.0.17" - postcss-browser-comments "^3.0.0" - sanitize.css "^10.0.0" + postcss-value-parser "^4.2.0" -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== +postcss-normalize@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-10.0.1.tgz#464692676b52792a06b06880a176279216540dd7" + integrity sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA== dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + "@csstools/normalize.css" "*" + postcss-browser-comments "^4" + sanitize.css "*" -postcss-overflow-shorthand@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" - integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== - dependencies: - postcss "^7.0.2" +postcss-opacity-percentage@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz#5b89b35551a556e20c5d23eb5260fbfcf5245da6" + integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== -postcss-page-break@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" - integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== dependencies: - postcss "^7.0.2" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-place@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" - integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-preset-env@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" - integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== - dependencies: - autoprefixer "^9.6.1" - browserslist "^4.6.4" - caniuse-lite "^1.0.30000981" - css-blank-pseudo "^0.1.4" - css-has-pseudo "^0.10.0" - css-prefers-color-scheme "^3.1.1" - cssdb "^4.4.0" - postcss "^7.0.17" - postcss-attribute-case-insensitive "^4.0.1" - postcss-color-functional-notation "^2.0.1" - postcss-color-gray "^5.0.0" - postcss-color-hex-alpha "^5.0.3" - postcss-color-mod-function "^3.0.3" - postcss-color-rebeccapurple "^4.0.1" - postcss-custom-media "^7.0.8" - postcss-custom-properties "^8.0.11" - postcss-custom-selectors "^5.1.2" - postcss-dir-pseudo-class "^5.0.0" - postcss-double-position-gradients "^1.0.0" - postcss-env-function "^2.0.2" - postcss-focus-visible "^4.0.0" - postcss-focus-within "^3.0.0" - postcss-font-variant "^4.0.0" - postcss-gap-properties "^2.0.0" - postcss-image-set-function "^3.0.1" - postcss-initial "^3.0.0" - postcss-lab-function "^2.0.1" - postcss-logical "^3.0.0" - postcss-media-minmax "^4.0.0" - postcss-nesting "^7.0.0" - postcss-overflow-shorthand "^2.0.0" - postcss-page-break "^2.0.0" - postcss-place "^4.0.1" - postcss-pseudo-class-any-link "^6.0.0" - postcss-replace-overflow-wrap "^3.0.0" - postcss-selector-matches "^4.0.0" - postcss-selector-not "^4.0.0" - -postcss-pseudo-class-any-link@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" - integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== +postcss-overflow-shorthand@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" + integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" + postcss-value-parser "^4.2.0" -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== +postcss-place@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" + integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-replace-overflow-wrap@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" - integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== +postcss-preset-env@^7.0.1: + version "7.8.3" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz#2a50f5e612c3149cc7af75634e202a5b2ad4f1e2" + integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== + dependencies: + "@csstools/postcss-cascade-layers" "^1.1.1" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.13" + browserslist "^4.21.4" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^7.1.0" + postcss-attribute-case-insensitive "^5.0.2" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.10" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.1" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.2.0" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.4" + postcss-page-break "^3.0.4" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-pseudo-class-any-link@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" + integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== dependencies: - postcss "^7.0.2" + browserslist "^4.21.4" + caniuse-api "^3.0.0" -postcss-safe-parser@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz#459dd27df6bc2ba64608824ba39e45dacf5e852d" - integrity sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ== +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== dependencies: - postcss "^8.1.0" + postcss-value-parser "^4.2.0" -postcss-selector-matches@^4.0.0: +postcss-replace-overflow-wrap@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" - integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== -postcss-selector-not@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" - integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-parser@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" - integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== - dependencies: - dot-prop "^5.2.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== +postcss-selector-not@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" + integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" + postcss-selector-parser "^6.0.10" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.16" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-svgo@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" - integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" + postcss-value-parser "^4.2.0" + svgo "^2.7.0" -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" + postcss-selector-parser "^6.0.5" -postcss-value-parser@^3.0.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" - integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - postcss@7.0.36: version "7.0.36" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" @@ -11522,7 +10789,7 @@ postcss@7.0.36: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.35: version "7.0.39" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== @@ -11530,29 +10797,19 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.1.0: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== +postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.4: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.7" picocolors "^1.0.0" - source-map-js "^1.0.2" + source-map-js "^1.2.0" -preact@10.4.1: - version "10.4.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" - integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== - -preact@^10.5.9: - version "10.11.3" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19" - integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== - -precond@0.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" - integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ== +preact@^10.16.0, preact@^10.5.9: + version "10.21.0" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.21.0.tgz#5b0335c873a1724deb66e517830db4fd310c24f6" + integrity sha512-aQAIxtzWEwH8ou+OovWVSVNlFImL7xUCwJX3YMqA3U8iKCNC34999fFOnWjYNsylgfPgMexpbk7WYOLtKr/mxg== prelude-ls@^1.2.1: version "1.2.1" @@ -11564,37 +10821,25 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - prettier@^2.1.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632" - integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw== + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -pretty-bytes@^5.3.0: +pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-error@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" - integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== dependencies: lodash "^4.17.20" - renderkid "^2.0.4" + renderkid "^3.0.0" -pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: +pretty-format@^26.0.0, pretty-format@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== @@ -11604,12 +10849,31 @@ pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.4.1: - version "29.4.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.1.tgz#0da99b532559097b8254298da7c75a0785b1751c" - integrity sha512-dt/Z761JUVsrIKaY215o1xQJBGlSmTx/h4cSqXqjHLnU1+Kt+mavVE7UgqJJO5ukx5HjSswHfmXz4LjS2oIJfg== +pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: - "@jest/schemas" "^29.4.0" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -11630,28 +10894,10 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -promise-to-callback@^1.0.0: +process-warning@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" - integrity sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA== - dependencies: - is-fn "^1.0.0" - set-immediate-shim "^1.0.1" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" + integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== promise@^8.1.0: version "8.3.0" @@ -11660,15 +10906,7 @@ promise@^8.1.0: dependencies: asap "~2.0.6" -prompts@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" - integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prompts@^2.0.1: +prompts@^2.0.1, prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -11701,41 +10939,16 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== +proxy-compare@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/proxy-compare/-/proxy-compare-2.5.1.tgz#17818e33d1653fbac8c2ec31406bce8a2966f600" + integrity sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA== -psl@^1.1.28, psl@^1.1.33: +psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -11744,92 +10957,50 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== -qrcode@1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" - integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q== +qrcode@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.3.tgz#03afa80912c0dccf12bc93f615a535aad1066170" + integrity sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg== dependencies: - buffer "^5.4.3" - buffer-alloc "^1.2.0" - buffer-from "^1.1.1" dijkstrajs "^1.0.1" - isarray "^2.0.1" - pngjs "^3.3.0" - yargs "^13.2.4" + encode-utf8 "^1.0.3" + pngjs "^5.0.0" + yargs "^15.3.1" -qs@6.11.0, qs@^6.11.0: +qs@6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +qs@^6.11.0: + version "6.12.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" + integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== + dependencies: + side-channel "^1.0.6" -query-string@6.13.5: - version "6.13.5" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" - integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q== +query-string@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== dependencies: - decode-uri-component "^0.2.0" + decode-uri-component "^0.2.2" + filter-obj "^1.1.0" split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q== - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - -querystring@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -11840,6 +11011,16 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +radix3@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/radix3/-/radix3-1.1.2.tgz#fd27d2af3896c6bf4bcdfab6427c69c2afc69ec0" + integrity sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA== + raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -11847,47 +11028,39 @@ raf@^3.4.1: dependencies: performance-now "^2.1.0" -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: +randombytes@^2.1.0: 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.3: - 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" - range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" -react-app-polyfill@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz#a0bea50f078b8a082970a9d853dc34b6dcc6a3cf" - integrity sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA== +react-app-polyfill@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7" + integrity sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w== dependencies: - core-js "^3.6.5" + core-js "^3.19.2" object-assign "^4.1.1" promise "^8.1.0" raf "^3.4.1" - regenerator-runtime "^0.13.7" - whatwg-fetch "^3.4.1" + regenerator-runtime "^0.13.9" + whatwg-fetch "^3.6.2" react-blockies@^1.4.1: version "1.4.1" @@ -11897,72 +11070,62 @@ react-blockies@^1.4.1: prop-types "^15.5.10" react-bootstrap@^2.5.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.7.0.tgz#4a8f0311bccac477dc925366763c536f46e4393b" - integrity sha512-Jcrn6aUuRVBeSB6dzKODKZU1TONOdhAxu0IDm4Sv74SJUm98dMdhSotF2SNvFEADANoR+stV+7TK6SNX1wWu5w== - dependencies: - "@babel/runtime" "^7.17.2" - "@restart/hooks" "^0.4.6" - "@restart/ui" "^1.4.1" - "@types/react-transition-group" "^4.4.4" - classnames "^2.3.1" + version "2.10.2" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.10.2.tgz#3b609eb0170e31b3d9ace297d3a016c202a42642" + integrity sha512-UvB7mRqQjivdZNxJNEA2yOQRB7L9N43nBnKc33K47+cH90/ujmnMwatTCwQLu83gLhrzAl8fsa6Lqig/KLghaA== + dependencies: + "@babel/runtime" "^7.22.5" + "@restart/hooks" "^0.4.9" + "@restart/ui" "^1.6.8" + "@types/react-transition-group" "^4.4.6" + classnames "^2.3.2" dom-helpers "^5.2.1" invariant "^2.2.4" prop-types "^15.8.1" prop-types-extra "^1.1.0" - react-transition-group "^4.4.2" + react-transition-group "^4.4.5" uncontrollable "^7.2.1" warning "^4.0.3" -react-dev-utils@^11.0.0: - version "11.0.4" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" - integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== - dependencies: - "@babel/code-frame" "7.10.4" - address "1.1.2" - browserslist "4.14.2" - chalk "2.4.2" - cross-spawn "7.0.3" - detect-port-alt "1.1.6" - escape-string-regexp "2.0.0" - filesize "6.1.0" - find-up "4.1.0" - fork-ts-checker-webpack-plugin "4.1.6" - global-modules "2.0.0" - globby "11.0.1" - gzip-size "5.1.1" - immer "8.0.1" - is-root "2.1.0" - loader-utils "2.0.0" - open "^7.0.2" - pkg-up "3.1.0" - prompts "2.4.0" - react-error-overlay "^6.0.9" - recursive-readdir "2.2.2" - shell-quote "1.7.2" - strip-ansi "6.0.0" - text-table "0.2.0" - -react-dom@^16.8.6: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" - integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" react-dom@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "^0.23.2" -react-error-overlay@^6.0.9: +react-error-overlay@^6.0.11: version "6.0.11" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== @@ -11976,9 +11139,9 @@ react-i18next@^11.15.3: html-parse-stringify "^3.0.1" react-icons@^4.3.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.7.1.tgz#0f4b25a5694e6972677cb189d2a72eabea7a8345" - integrity sha512-yHd3oKGMgm7zxo3EA7H2n7vxSoiGmHk5t6Ou4bXsfcgWyhfDKMpyKfhHR6Bjnn63c+YXBLBPUql9H4wPJM6sXw== + version "4.12.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.12.0.tgz#54806159a966961bfd5cdb26e492f4dafd6a8d78" + integrity sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw== react-is@^16.13.1, react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" @@ -11991,9 +11154,9 @@ react-is@^17.0.1: integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-lifecycles-compat@^3.0.4: version "3.0.4" @@ -12007,10 +11170,10 @@ react-number-format@^4.4.1: dependencies: prop-types "^15.7.2" -react-refresh@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" - integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== +react-refresh@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" + integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== react-responsive@^9.0.2: version "9.0.2" @@ -12050,86 +11213,74 @@ react-router@5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-scripts@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-4.0.0.tgz#36f3d84ffff708ac0618fd61e71eaaea11c26417" - integrity sha512-icJ/ctwV5XwITUOupBP9TUVGdWOqqZ0H08tbJ1kVC5VpNWYzEZ3e/x8axhV15ZXRsixLo27snwQE7B6Zd9J2Tg== - dependencies: - "@babel/core" "7.12.3" - "@pmmmwh/react-refresh-webpack-plugin" "0.4.2" - "@svgr/webpack" "5.4.0" - "@typescript-eslint/eslint-plugin" "^4.5.0" - "@typescript-eslint/parser" "^4.5.0" - babel-eslint "^10.1.0" - babel-jest "^26.6.0" - babel-loader "8.1.0" - babel-plugin-named-asset-import "^0.3.7" - babel-preset-react-app "^10.0.0" +react-scripts@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003" + integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== + dependencies: + "@babel/core" "^7.16.0" + "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" + "@svgr/webpack" "^5.5.0" + babel-jest "^27.4.2" + babel-loader "^8.2.3" + babel-plugin-named-asset-import "^0.3.8" + babel-preset-react-app "^10.0.1" bfj "^7.0.2" - camelcase "^6.1.0" - case-sensitive-paths-webpack-plugin "2.3.0" - css-loader "4.3.0" - dotenv "8.2.0" - dotenv-expand "5.1.0" - eslint "^7.11.0" - eslint-config-react-app "^6.0.0" - eslint-plugin-flowtype "^5.2.0" - eslint-plugin-import "^2.22.1" - eslint-plugin-jest "^24.1.0" - eslint-plugin-jsx-a11y "^6.3.1" - eslint-plugin-react "^7.21.5" - eslint-plugin-react-hooks "^4.2.0" - eslint-plugin-testing-library "^3.9.2" - eslint-webpack-plugin "^2.1.0" - file-loader "6.1.1" - fs-extra "^9.0.1" - html-webpack-plugin "4.5.0" - identity-obj-proxy "3.0.0" - jest "26.6.0" - jest-circus "26.6.0" - jest-resolve "26.6.0" - jest-watch-typeahead "0.6.1" - mini-css-extract-plugin "0.11.3" - optimize-css-assets-webpack-plugin "5.0.4" - pnp-webpack-plugin "1.6.4" - postcss-flexbugs-fixes "4.2.1" - postcss-loader "3.0.0" - postcss-normalize "8.0.1" - postcss-preset-env "6.7.0" - postcss-safe-parser "5.0.2" - react-app-polyfill "^2.0.0" - react-dev-utils "^11.0.0" - react-refresh "^0.8.3" - resolve "1.18.1" - resolve-url-loader "^3.1.2" - sass-loader "8.0.2" - semver "7.3.2" - style-loader "1.3.0" - terser-webpack-plugin "4.2.3" - ts-pnp "1.2.0" - url-loader "4.1.1" - webpack "4.44.2" - webpack-dev-server "3.11.0" - webpack-manifest-plugin "2.2.0" - workbox-webpack-plugin "5.1.4" + browserslist "^4.18.1" + camelcase "^6.2.1" + case-sensitive-paths-webpack-plugin "^2.4.0" + css-loader "^6.5.1" + css-minimizer-webpack-plugin "^3.2.0" + dotenv "^10.0.0" + dotenv-expand "^5.1.0" + eslint "^8.3.0" + eslint-config-react-app "^7.0.1" + eslint-webpack-plugin "^3.1.1" + file-loader "^6.2.0" + fs-extra "^10.0.0" + html-webpack-plugin "^5.5.0" + identity-obj-proxy "^3.0.0" + jest "^27.4.3" + jest-resolve "^27.4.2" + jest-watch-typeahead "^1.0.0" + mini-css-extract-plugin "^2.4.5" + postcss "^8.4.4" + postcss-flexbugs-fixes "^5.0.2" + postcss-loader "^6.2.1" + postcss-normalize "^10.0.1" + postcss-preset-env "^7.0.1" + prompts "^2.4.2" + react-app-polyfill "^3.0.0" + react-dev-utils "^12.0.1" + react-refresh "^0.11.0" + resolve "^1.20.0" + resolve-url-loader "^4.0.0" + sass-loader "^12.3.0" + semver "^7.3.5" + source-map-loader "^3.0.0" + style-loader "^3.3.1" + tailwindcss "^3.0.2" + terser-webpack-plugin "^5.2.5" + webpack "^5.64.4" + webpack-dev-server "^4.6.0" + webpack-manifest-plugin "^4.0.2" + workbox-webpack-plugin "^6.4.1" optionalDependencies: - fsevents "^2.1.3" + fsevents "^2.3.2" react-swipeable@^6.1.0: version "6.2.2" resolved "https://registry.yarnpkg.com/react-swipeable/-/react-swipeable-6.2.2.tgz#52ba570f3a7a90db7093094ec476f3d151f727d1" integrity sha512-Oz7nSFrssvq2yvy05aNL3F+yBUqSvLsK6x1mu+rQFOpMdQVnt4izKt1vyjvvTb70q6GQOaSpaB6qniROW2MAzQ== -react-toastify@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-6.2.0.tgz#f2d76747c70b9de91f71f253d9feae6b53dc836c" - integrity sha512-XpjFrcBhQ0/nBOL4syqgP/TywFnOyxmstYLWgSQWcj39qpp+WU4vPt3C/ayIDx7RFyxRWfzWTdR2qOcDGo7G0w== +react-toastify@^10.0.5: + version "10.0.5" + resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-10.0.5.tgz#6b8f8386060c5c856239f3036d1e76874ce3bd1e" + integrity sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw== dependencies: - clsx "^1.1.1" - prop-types "^15.7.2" - react-transition-group "^4.4.1" + clsx "^2.1.0" -react-transition-group@^4.4.1, react-transition-group@^4.4.2: +react-transition-group@^4.4.5: version "4.4.5" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== @@ -12139,62 +11290,24 @@ react-transition-group@^4.4.1, react-transition-group@^4.4.2: loose-envify "^1.4.0" prop-types "^15.6.2" -react@^16.8.6: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" - integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - react@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" + pify "^2.3.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -12204,44 +11317,15 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^1.0.33: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^3.0.6, readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~1.0.15: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -12249,20 +11333,17 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -recursive-readdir@2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" - integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== - dependencies: - minimatch "3.0.4" +real-require@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" + integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g== +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" + minimatch "^3.0.5" redent@^3.0.0: version "3.0.0" @@ -12272,10 +11353,23 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -12284,67 +11378,50 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.7: +regenerator-runtime@^0.13.9: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== - dependencies: - "@babel/runtime" "^7.8.4" +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" + "@babel/runtime" "^7.8.4" regex-parser@^2.2.11: - version "2.2.11" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" - integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + version "2.3.0" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" + integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg== -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" -regexpu-core@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" - integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -12352,69 +11429,26 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" +rehackt@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.1.0.tgz#a7c5e289c87345f70da8728a7eb878e5d03c696b" + integrity sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw== + relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -renderkid@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" - integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== dependencies: css-select "^4.1.3" dom-converter "^0.2.0" htmlparser2 "^6.1.0" lodash "^4.17.21" - strip-ansi "^3.0.1" - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== - dependencies: - is-finite "^1.0.0" - -request@^2.85.0, request@^2.87.0, request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" + strip-ansi "^6.0.1" require-directory@^2.1.1: version "2.1.1" @@ -12436,13 +11470,6 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg== - dependencies: - resolve-from "^3.0.0" - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -12450,11 +11477,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -12486,34 +11508,42 @@ resolve-url-loader@^3.1.2: rework-visit "1.0.0" source-map "0.6.1" +resolve-url-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" + integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^7.0.35" + source-map "0.6.1" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== -resolve@1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" - integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== - dependencies: - is-core-module "^2.0.0" - path-parse "^1.0.6" +resolve.exports@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.3.2: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.3.2: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -12522,15 +11552,10 @@ response-iterator@^0.2.6: resolved "https://registry.yarnpkg.com/response-iterator/-/response-iterator-0.2.6.tgz#249005fb14d2e4eeb478a3f735a28fd8b4c9f3da" integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== reusify@^1.0.4: version "1.0.4" @@ -12550,30 +11575,6 @@ rework@1.0.1: convert-source-map "^0.3.3" css "^2.0.0" -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w== - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg== - -rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -12589,52 +11590,29 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4: +rlp@^2.0.0, rlp@^2.2.3: version "2.2.7" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== dependencies: bn.js "^5.2.0" -rollup-plugin-babel@^4.3.3: - version "4.4.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" - integrity sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - rollup-pluginutils "^2.8.1" - -rollup-plugin-terser@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413" - integrity sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w== +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== dependencies: - "@babel/code-frame" "^7.5.5" - jest-worker "^24.9.0" - rollup-pluginutils "^2.8.2" + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" serialize-javascript "^4.0.0" - terser "^4.6.2" - -rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: - version "2.8.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" - integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== - dependencies: - estree-walker "^0.6.1" - -rollup@^1.31.1: - version "1.32.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" - integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== - dependencies: - "@types/estree" "*" - "@types/node" "*" - acorn "^7.1.0" + terser "^5.0.0" -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== +rollup@^2.43.1: + version "2.79.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" run-parallel@^1.1.9: version "1.2.0" @@ -12643,18 +11621,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== - dependencies: - aproba "^1.1.1" - -rustbn.js@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" - integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== - rxjs@^6.6.3: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" @@ -12662,6 +11628,16 @@ rxjs@^6.6.3: dependencies: tslib "^1.9.0" +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -12679,83 +11655,49 @@ safe-event-emitter@^1.0.1: dependencies: events "^3.0.0" -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" +safe-stable-stringify@^2.1.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sanitize.css@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" - integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== - -sass-graph@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" - integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^13.3.2" +sanitize.css@*: + version "13.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" + integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== -sass-loader@8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" - integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== +sass-loader@^12.3.0: + version "12.6.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== dependencies: - clone-deep "^4.0.1" - loader-utils "^1.2.3" - neo-async "^2.6.1" - schema-utils "^2.6.1" - semver "^6.3.0" + klona "^2.0.4" + neo-async "^2.6.2" -sass-loader@^10.0.4: - version "10.4.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.4.1.tgz#bea4e173ddf512c9d7f53e9ec686186146807cbf" - integrity sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ== +sass-loader@^13.2.0: + version "13.3.3" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.3.tgz#60df5e858788cffb1a3215e5b92e9cba61e7e133" + integrity sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA== dependencies: - klona "^2.0.4" - loader-utils "^2.0.0" neo-async "^2.6.2" - schema-utils "^3.0.0" - semver "^7.3.2" -sass@^1.57.1: - version "1.58.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.0.tgz#ee8aea3ad5ea5c485c26b3096e2df6087d0bb1cc" - integrity sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg== +sass@^1.58.3: + version "1.77.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.1.tgz#018cdfb206afd14724030c02e9fefd8f30a76cd0" + integrity sha512-OMEyfirt9XEfyvocduUIOlUSkWOXS/LAt6oblR/ISXCTukyavjex+zQNm51pPCOiFKY1QpWvEH1EeCkgyV3I6w== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -12773,31 +11715,23 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" -schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7.1: +schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -12806,28 +11740,30 @@ schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7 ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q== - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - secp256k1@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" @@ -12842,49 +11778,28 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -selfsigned@^1.10.7: - version "1.10.14" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574" - integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA== +selfsigned@^2.1.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: - node-forge "^0.10.0" - -semaphore@>=1.0.1, semaphore@^1.0.3: - version "1.1.0" - resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" - integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== - -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + "@types/node-forge" "^1.3.0" + node-forge "^1" -semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" +semver@^5.4.1, semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw== +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@~5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== send@0.18.0: version "0.18.0" @@ -12912,10 +11827,10 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" -serialize-javascript@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" @@ -12942,27 +11857,34 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" -setimmediate@^1.0.4, setimmediate@^1.0.5: +setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== @@ -12977,38 +11899,19 @@ setprototypeof@1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -sha.js@^2.4.0, sha.js@^2.4.8: +sha.js@^2.4.0, sha.js@^2.4.11, 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" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" + safe-buffer "^5.0.1" shallow-equal@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -13016,40 +11919,36 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +shell-quote@^1.7.3, shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1, signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -13067,93 +11966,47 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -slice-ansi@^4.0.0: +slash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sockjs-client@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" - integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== - dependencies: - debug "^3.2.5" - eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" - json3 "^3.3.2" - url-parse "^1.4.3" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -sockjs@0.3.20: - version "0.3.20" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" - integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: - faye-websocket "^0.10.0" - uuid "^3.4.0" - websocket-driver "0.6.5" + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== +sonic-boom@^2.2.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" + integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg== dependencies: - is-plain-obj "^1.0.0" + atomic-sleep "^1.0.0" -source-list-map@^2.0.0: +source-list-map@^2.0.0, source-list-map@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +source-map-loader@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.2.tgz#af23192f9b344daa729f6772933194cc5fa54fee" + integrity sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: +source-map-resolve@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== @@ -13164,7 +12017,7 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.20: +source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -13182,14 +12035,7 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A== - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== @@ -13199,37 +12045,18 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== +source-map@^0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== - spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -13258,53 +12085,22 @@ 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== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" - -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -stack-utils@^2.0.2, stack-utils@^2.0.3: +stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== @@ -13316,13 +12112,12 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" + escodegen "^1.8.1" statuses@2.0.1: version "2.0.1" @@ -13334,27 +12129,10 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== - dependencies: - readable-stream "^2.0.1" - -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" +std-env@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== stream-browserify@^3.0.0: version "3.0.0" @@ -13364,34 +12142,10 @@ stream-browserify@^3.0.0: inherits "~2.0.4" readable-stream "^3.5.0" -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== +stream-shift@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" + integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== strict-uri-encode@^2.0.0: version "2.0.0" @@ -13406,21 +12160,20 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +string-length@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-5.0.1.tgz#3d647f497b6e8e8d41e422f7e0b23bc536c8381e" + integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== + dependencies: + char-regex "^2.0.0" + strip-ansi "^7.0.1" + string-natural-compare@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -13429,59 +12182,68 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" +string.prototype.matchall@^4.0.10, string.prototype.matchall@^4.0.6: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" - side-channel "^1.0.4" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string_decoder@^1.0.0, string_decoder@^1.1.1: +string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -13498,40 +12260,19 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: - is-utf8 "^0.2.0" + ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -13543,24 +12284,21 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-comments@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" - integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== - dependencies: - babel-extract-comments "^1.0.0" - babel-plugin-transform-object-rest-spread "^6.26.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" @@ -13568,13 +12306,6 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA== - dependencies: - get-stdin "^4.0.1" - strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -13582,50 +12313,43 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-loader@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" - integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== +style-loader@^3.3.1: + version "3.3.4" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" + integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== dependencies: - loader-utils "^2.0.0" - schema-utils "^2.7.0" - -styled-components@^5.3.3: - version "5.3.6" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.6.tgz#27753c8c27c650bee9358e343fc927966bfd00d1" - integrity sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^1.1.0" - "@emotion/stylis" "^0.8.4" - "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1.12.0" - css-to-react-native "^3.0.0" - hoist-non-react-statics "^3.0.0" - shallowequal "^1.1.0" - supports-color "^5.5.0" - -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== +superstruct@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.4.tgz#0adb99a7578bd2f1c526220da6571b2d485d91ca" + integrity sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ== -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -13671,7 +12395,7 @@ svg-parser@^2.0.2: resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== -svgo@^1.0.0, svgo@^1.2.2: +svgo@^1.2.2: version "1.3.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== @@ -13690,6 +12414,19 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + symbol-observable@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" @@ -13700,66 +12437,63 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -table@^6.0.9: - version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -tapable@^1.0.0, tapable@^1.1.3: +system-architecture@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/system-architecture/-/system-architecture-0.1.0.tgz#71012b3ac141427d97c67c56bc7921af6bff122d" + integrity sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA== + +tailwindcss@^3.0.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519" + integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.0" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +tapable@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" - integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== - dependencies: - block-stream "*" - fstream "^1.0.12" - inherits "2" - -tar@^6.0.2: - version "6.1.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" - integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^4.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== -tempy@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8" - integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== dependencies: - temp-dir "^1.0.0" - type-fest "^0.3.1" - unique-string "^1.0.0" + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" terminal-link@^2.0.0: version "2.1.1" @@ -13769,52 +12503,24 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" - integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== - dependencies: - cacache "^15.0.5" - find-cache-dir "^3.3.1" - jest-worker "^26.5.0" - p-limit "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - source-map "^0.6.1" - terser "^5.3.4" - webpack-sources "^1.4.3" - -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: - version "4.8.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" - integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== +terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" -terser@^5.3.4: - version "5.16.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.3.tgz#3266017a9b682edfe019b8ecddd2abaae7b39c6b" - integrity sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q== +terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: + version "5.31.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1" + integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -13827,45 +12533,46 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-table@0.2.0, text-table@^0.2.0: +text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +thread-stream@^0.15.1: + version "0.15.2" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-0.15.2.tgz#fb95ad87d2f1e28f07116eb23d85aba3bc0425f4" + integrity sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA== dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" + real-require "^0.1.0" + +throat@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" + integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A== - tiny-invariant@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== tiny-warning@^1.0.0: version "1.0.3" @@ -13877,31 +12584,11 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - 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" @@ -13909,43 +12596,27 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" - integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" punycode "^2.1.1" universalify "^0.2.0" url-parse "^1.5.3" -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== dependencies: - psl "^1.1.28" - punycode "^2.1.1" + punycode "^2.1.0" tr46@^2.1.0: version "2.1.0" @@ -13964,23 +12635,16 @@ treeify@^1.1.0: resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw== - -"true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== - dependencies: - glob "^7.1.2" - tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + ts-invariant@^0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" @@ -13999,55 +12663,33 @@ ts-node@9.0.0: source-map-support "^0.5.17" yn "3.1.1" -ts-pnp@1.2.0, ts-pnp@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" - integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== - -tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" -tslib@1.14.1, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@1.14.1, tslib@^1.8.1, 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== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tsutils@^3.17.1, tsutils@^3.21.0: +tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -14067,6 +12709,11 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -14077,21 +12724,6 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -14100,42 +12732,79 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -type@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" - integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" -typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: +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" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - typescript@4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.5.tgz#ae9dddfd1069f1cb5beb3ef3b2170dd7c1332389" integrity sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ== +ufo@^1.4.0, ufo@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.3.tgz#3325bd3c977b6c6cd3160bf4ff52989adc9d3344" + integrity sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw== + +uint8arrays@^3.0.0, uint8arrays@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" + integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== + dependencies: + multiformats "^9.4.2" + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -14156,6 +12825,42 @@ uncontrollable@^7.2.1: invariant "^2.2.4" react-lifecycles-compat "^3.0.4" +uncontrollable@^8.0.1: + version "8.0.4" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-8.0.4.tgz#a0a8307f638795162fafd0550f4a1efa0f8c5eb6" + integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ== + +uncrypto@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/uncrypto/-/uncrypto-0.1.3.tgz#e1288d609226f2d02d8d69ee861fa20d8348ef2b" + integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== + +underscore@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unenv@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/unenv/-/unenv-1.9.0.tgz#469502ae85be1bd3a6aa60f810972b1a904ca312" + integrity sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g== + dependencies: + consola "^3.2.3" + defu "^6.1.3" + mime "^3.0.0" + node-fetch-native "^1.6.1" + pathe "^1.1.1" + +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -14179,51 +12884,12 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== - -uniqs@^2.0.0: +unique-string@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ== - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg== + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== dependencies: - crypto-random-string "^1.0.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + crypto-random-string "^2.0.0" universalify@^0.2.0: version "0.2.0" @@ -14231,9 +12897,9 @@ universalify@^0.2.0: integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -14245,28 +12911,50 @@ unquote@~1.1.1: resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== +unstorage@^1.9.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/unstorage/-/unstorage-1.10.2.tgz#fb7590ada8b30e83be9318f85100158b02a76dae" + integrity sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ== + dependencies: + anymatch "^3.1.3" + chokidar "^3.6.0" + destr "^2.0.3" + h3 "^1.11.1" + listhen "^1.7.2" + lru-cache "^10.2.0" + mri "^1.2.0" + node-fetch-native "^1.6.2" + ofetch "^1.3.3" + ufo "^1.4.0" + +untun@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/untun/-/untun-0.1.3.tgz#5d10dee37a3a5737ff03d158be877dae0a0e58a6" + integrity sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ== dependencies: - has-value "^0.3.1" - isobject "^3.0.0" + citty "^0.1.5" + consola "^3.2.3" + pathe "^1.1.1" -upath@^1.1.1, upath@^1.1.2, upath@^1.2.0: +upath@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.13: + version "1.0.15" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz#60ed9f8cba4a728b7ecf7356f641a31e3a691d97" + integrity sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA== dependencies: - escalade "^3.1.1" + escalade "^3.1.2" picocolors "^1.0.0" -uri-js@^4.2.2: +uqr@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/uqr/-/uqr-0.1.2.tgz#5c6cd5dcff9581f9bb35b982cb89e2c483a41d7d" + integrity sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA== + +uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== @@ -14278,16 +12966,7 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== -url-loader@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -url-parse@^1.4.3, url-parse@^1.5.3: +url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -14295,18 +12974,10 @@ url-parse@^1.4.3, url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== utf8@3.0.0: version "3.0.0" @@ -14318,14 +12989,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - util.promisify@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" @@ -14336,20 +12999,6 @@ util.promisify@~1.0.0: has-symbols "^1.0.1" object.getownpropertydescriptors "^2.1.0" -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== - dependencies: - inherits "2.0.1" - -util@^0.11.0: - 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" - utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" @@ -14360,37 +13009,32 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^3.3.2, uuid@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^8.3.0: +uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -v8-to-istanbul@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" - integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" source-map "^0.7.3" -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== +valtio@1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/valtio/-/valtio-1.11.2.tgz#b8049c02dfe65620635d23ebae9121a741bb6530" + integrity sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw== dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" + proxy-compare "2.5.1" + use-sync-external-store "1.2.0" value-equal@^1.0.1: version "1.0.1" @@ -14402,25 +13046,6 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - void-elements@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" @@ -14440,7 +13065,7 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -walker@^1.0.7, walker@~1.0.5: +walker@^1.0.7: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -14473,23 +13098,13 @@ warning@^4.0.0, warning@^4.0.3: dependencies: loose-envify "^1.0.0" -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" - integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" - integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== +watchpack@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== dependencies: + glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" @@ -14498,69 +13113,35 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -web-vitals@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-0.2.4.tgz#ec3df43c834a207fd7cdefd732b2987896e08511" - integrity sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg== - -web3-provider-engine@16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-16.0.1.tgz#2600a39ede364cdc0a1fc773bf40a94f2177e605" - integrity sha512-/Eglt2aocXMBiDj7Se/lyZnNDaHBaoJlaUfbP5HkLJQC/HlGbR+3/W+dINirlJDhh7b54DzgykqY7ksaU5QgTg== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^4.4.2" - eth-json-rpc-filters "^4.2.1" - eth-json-rpc-infura "^5.1.0" - eth-json-rpc-middleware "^6.0.0" - eth-rpc-errors "^3.0.0" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" +web-vitals@^2.1.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" + integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== web3-utils@^1.3.4: - version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.2.tgz#c32dec5e9b955acbab220eefd7715bc540b75cc9" - integrity sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA== + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" + integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== dependencies: + "@ethereumjs/util" "^8.1.0" bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" + ethereum-cryptography "^2.1.2" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" utf8 "3.0.0" -web3modal@^1.9.8: - version "1.9.12" - resolved "https://registry.yarnpkg.com/web3modal/-/web3modal-1.9.12.tgz#cb000888fa422a96e3df552d4784e347ba35efcc" - integrity sha512-RiLY2tNOEUCobtsMTmhwl/FoHZGxRZz7SSdLsh6qbbybPNUO0rFPY8xam9SpPwlLd2cUDGiWkLgDUJde0sHxdw== - dependencies: - detect-browser "^5.1.0" - prop-types "^15.7.2" - react "^16.8.6" - react-dom "^16.8.6" - styled-components "^5.3.3" - tslib "^1.10.0" - 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== +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -14571,75 +13152,62 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-dev-middleware@^3.7.2: - version "3.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" - integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== +webpack-dev-middleware@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-server@3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" - integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== - dependencies: - ansi-html "0.0.7" - bonjour "^3.5.0" - chokidar "^2.1.8" + schema-utils "^4.0.0" + +webpack-dev-server@^4.6.0: + version "4.15.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" + integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.5" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.1" - express "^4.17.1" - html-entities "^1.3.1" - http-proxy-middleware "0.19.1" - import-local "^2.0.0" - internal-ip "^4.3.0" - ip "^1.1.5" - is-absolute-url "^3.0.3" - killable "^1.0.1" - loglevel "^1.6.8" - opn "^5.5.0" - p-retry "^3.0.1" - portfinder "^1.0.26" - schema-utils "^1.0.0" - selfsigned "^1.10.7" - semver "^6.3.0" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" serve-index "^1.9.1" - sockjs "0.3.20" - sockjs-client "1.4.0" + sockjs "^0.3.24" spdy "^4.0.2" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.7.2" - webpack-log "^2.0.0" - ws "^6.2.1" - yargs "^13.3.2" + webpack-dev-middleware "^5.3.4" + ws "^8.13.0" -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" - -webpack-manifest-plugin@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" - integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== +webpack-manifest-plugin@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz#10f8dbf4714ff93a215d5a45bcc416d80506f94f" + integrity sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow== dependencies: - fs-extra "^7.0.0" - lodash ">=3.5 <5" - object.entries "^1.1.0" - tapable "^1.0.0" + tapable "^2.0.0" + webpack-sources "^2.2.0" -webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: +webpack-sources@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== @@ -14647,43 +13215,50 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack- source-list-map "^2.0.0" source-map "~0.6.1" -webpack@4.44.2: - version "4.44.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" - integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.3.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" - -websocket-driver@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" - integrity sha512-oBx6ZM1Gs5q2jwZuSN/Qxyy/fbgomV8+vqsmipaPKB/74hjHlKuM07jNmRhn4qa2AdUwsgxrltq+gaPsHgcl0Q== +webpack-sources@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== dependencies: - websocket-extensions ">=0.1.1" + source-list-map "^2.0.1" + source-map "^0.6.1" -websocket-driver@>=0.5.1: +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.64.4: + version "5.91.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" + integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.16.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -14704,15 +13279,10 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -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-fetch@^3.4.1: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== +whatwg-fetch@^3.6.2: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== whatwg-mimetype@^2.3.0: version "2.3.0" @@ -14727,6 +13297,15 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" @@ -14747,234 +13326,246 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" + has-tostringtag "^1.0.2" -which@1, which@^1.2.9, which@^1.3.1: +which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@^2.0.1, which@^2.0.2: +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -workbox-background-sync@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz#5ae0bbd455f4e9c319e8d827c055bb86c894fd12" - integrity sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA== - dependencies: - workbox-core "^5.1.4" - -workbox-broadcast-update@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz#0eeb89170ddca7f6914fa3523fb14462891f2cfc" - integrity sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA== - dependencies: - workbox-core "^5.1.4" - -workbox-build@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-5.1.4.tgz#23d17ed5c32060c363030c8823b39d0eabf4c8c7" - integrity sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow== - dependencies: - "@babel/core" "^7.8.4" - "@babel/preset-env" "^7.8.4" - "@babel/runtime" "^7.8.4" - "@hapi/joi" "^15.1.0" - "@rollup/plugin-node-resolve" "^7.1.1" - "@rollup/plugin-replace" "^2.3.1" - "@surma/rollup-plugin-off-main-thread" "^1.1.1" +word-wrap@^1.2.5, word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +workbox-background-sync@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.6.1.tgz#08d603a33717ce663e718c30cc336f74909aff2f" + integrity sha512-trJd3ovpWCvzu4sW0E8rV3FUyIcC0W8G+AZ+VcqzzA890AsWZlUGOTSxIMmIHVusUw/FDq1HFWfy/kC/WTRqSg== + dependencies: + idb "^7.0.1" + workbox-core "6.6.1" + +workbox-broadcast-update@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.6.1.tgz#0fad9454cf8e4ace0c293e5617c64c75d8a8c61e" + integrity sha512-fBhffRdaANdeQ1V8s692R9l/gzvjjRtydBOvR6WCSB0BNE2BacA29Z4r9/RHd9KaXCPl6JTdI9q0bR25YKP8TQ== + dependencies: + workbox-core "6.6.1" + +workbox-build@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.6.1.tgz#6010e9ce550910156761448f2dbea8cfcf759cb0" + integrity sha512-INPgDx6aRycAugUixbKgiEQBWD0MPZqU5r0jyr24CehvNuLPSXp/wGOpdRJmts656lNiXwqV7dC2nzyrzWEDnw== + dependencies: + "@apideck/better-ajv-errors" "^0.3.1" + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.3" + ajv "^8.6.0" common-tags "^1.8.0" fast-json-stable-stringify "^2.1.0" - fs-extra "^8.1.0" + fs-extra "^9.0.1" glob "^7.1.6" - lodash.template "^4.5.0" + lodash "^4.17.20" pretty-bytes "^5.3.0" - rollup "^1.31.1" - rollup-plugin-babel "^4.3.3" - rollup-plugin-terser "^5.3.1" - source-map "^0.7.3" - source-map-url "^0.4.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" stringify-object "^3.3.0" - strip-comments "^1.0.2" - tempy "^0.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" upath "^1.2.0" - workbox-background-sync "^5.1.4" - workbox-broadcast-update "^5.1.4" - workbox-cacheable-response "^5.1.4" - workbox-core "^5.1.4" - workbox-expiration "^5.1.4" - workbox-google-analytics "^5.1.4" - workbox-navigation-preload "^5.1.4" - workbox-precaching "^5.1.4" - workbox-range-requests "^5.1.4" - workbox-routing "^5.1.4" - workbox-strategies "^5.1.4" - workbox-streams "^5.1.4" - workbox-sw "^5.1.4" - workbox-window "^5.1.4" - -workbox-cacheable-response@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz#9ff26e1366214bdd05cf5a43da9305b274078a54" - integrity sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA== - dependencies: - workbox-core "^5.1.4" - -workbox-core@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-5.1.4.tgz#8bbfb2362ecdff30e25d123c82c79ac65d9264f4" - integrity sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg== - -workbox-expiration@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-5.1.4.tgz#92b5df461e8126114943a3b15c55e4ecb920b163" - integrity sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ== - dependencies: - workbox-core "^5.1.4" - -workbox-google-analytics@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz#b3376806b1ac7d7df8418304d379707195fa8517" - integrity sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA== - dependencies: - workbox-background-sync "^5.1.4" - workbox-core "^5.1.4" - workbox-routing "^5.1.4" - workbox-strategies "^5.1.4" - -workbox-navigation-preload@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz#30d1b720d26a05efc5fa11503e5cc1ed5a78902a" - integrity sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ== - dependencies: - workbox-core "^5.1.4" - -workbox-precaching@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-5.1.4.tgz#874f7ebdd750dd3e04249efae9a1b3f48285fe6b" - integrity sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA== - dependencies: - workbox-core "^5.1.4" - -workbox-range-requests@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz#7066a12c121df65bf76fdf2b0868016aa2bab859" - integrity sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw== - dependencies: - workbox-core "^5.1.4" - -workbox-routing@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-5.1.4.tgz#3e8cd86bd3b6573488d1a2ce7385e547b547e970" - integrity sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw== - dependencies: - workbox-core "^5.1.4" - -workbox-strategies@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-5.1.4.tgz#96b1418ccdfde5354612914964074d466c52d08c" - integrity sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA== - dependencies: - workbox-core "^5.1.4" - workbox-routing "^5.1.4" - -workbox-streams@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-5.1.4.tgz#05754e5e3667bdc078df2c9315b3f41210d8cac0" - integrity sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw== - dependencies: - workbox-core "^5.1.4" - workbox-routing "^5.1.4" - -workbox-sw@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-5.1.4.tgz#2bb34c9f7381f90d84cef644816d45150011d3db" - integrity sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA== - -workbox-webpack-plugin@5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz#7bfe8c16e40fe9ed8937080ac7ae9c8bde01e79c" - integrity sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ== - dependencies: - "@babel/runtime" "^7.5.5" - fast-json-stable-stringify "^2.0.0" - source-map-url "^0.4.0" - upath "^1.1.2" - webpack-sources "^1.3.0" - workbox-build "^5.1.4" - -workbox-window@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-5.1.4.tgz#2740f7dea7f93b99326179a62f1cc0ca2c93c863" - integrity sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw== + workbox-background-sync "6.6.1" + workbox-broadcast-update "6.6.1" + workbox-cacheable-response "6.6.1" + workbox-core "6.6.1" + workbox-expiration "6.6.1" + workbox-google-analytics "6.6.1" + workbox-navigation-preload "6.6.1" + workbox-precaching "6.6.1" + workbox-range-requests "6.6.1" + workbox-recipes "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + workbox-streams "6.6.1" + workbox-sw "6.6.1" + workbox-window "6.6.1" + +workbox-cacheable-response@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.6.1.tgz#284c2b86be3f4fd191970ace8c8e99797bcf58e9" + integrity sha512-85LY4veT2CnTCDxaVG7ft3NKaFbH6i4urZXgLiU4AiwvKqS2ChL6/eILiGRYXfZ6gAwDnh5RkuDbr/GMS4KSag== + dependencies: + workbox-core "6.6.1" + +workbox-core@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.6.1.tgz#7184776d4134c5ed2f086878c882728fc9084265" + integrity sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw== + +workbox-expiration@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.6.1.tgz#a841fa36676104426dbfb9da1ef6a630b4f93739" + integrity sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A== + dependencies: + idb "^7.0.1" + workbox-core "6.6.1" + +workbox-google-analytics@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.6.1.tgz#a07a6655ab33d89d1b0b0a935ffa5dea88618c5d" + integrity sha512-1TjSvbFSLmkpqLcBsF7FuGqqeDsf+uAXO/pjiINQKg3b1GN0nBngnxLcXDYo1n/XxK4N7RaRrpRlkwjY/3ocuA== + dependencies: + workbox-background-sync "6.6.1" + workbox-core "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + +workbox-navigation-preload@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.6.1.tgz#61a34fe125558dd88cf09237f11bd966504ea059" + integrity sha512-DQCZowCecO+wRoIxJI2V6bXWK6/53ff+hEXLGlQL4Rp9ZaPDLrgV/32nxwWIP7QpWDkVEtllTAK5h6cnhxNxDA== + dependencies: + workbox-core "6.6.1" + +workbox-precaching@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.6.1.tgz#dedeeba10a2d163d990bf99f1c2066ac0d1a19e2" + integrity sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A== + dependencies: + workbox-core "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + +workbox-range-requests@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.6.1.tgz#ddaf7e73af11d362fbb2f136a9063a4c7f507a39" + integrity sha512-4BDzk28govqzg2ZpX0IFkthdRmCKgAKreontYRC5YsAPB2jDtPNxqx3WtTXgHw1NZalXpcH/E4LqUa9+2xbv1g== + dependencies: + workbox-core "6.6.1" + +workbox-recipes@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.6.1.tgz#ea70d2b2b0b0bce8de0a9d94f274d4a688e69fae" + integrity sha512-/oy8vCSzromXokDA+X+VgpeZJvtuf8SkQ8KL0xmRivMgJZrjwM3c2tpKTJn6PZA6TsbxGs3Sc7KwMoZVamcV2g== + dependencies: + workbox-cacheable-response "6.6.1" + workbox-core "6.6.1" + workbox-expiration "6.6.1" + workbox-precaching "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + +workbox-routing@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.6.1.tgz#cba9a1c7e0d1ea11e24b6f8c518840efdc94f581" + integrity sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg== + dependencies: + workbox-core "6.6.1" + +workbox-strategies@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.6.1.tgz#38d0f0fbdddba97bd92e0c6418d0b1a2ccd5b8bf" + integrity sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw== + dependencies: + workbox-core "6.6.1" + +workbox-streams@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.6.1.tgz#b2f7ba7b315c27a6e3a96a476593f99c5d227d26" + integrity sha512-maKG65FUq9e4BLotSKWSTzeF0sgctQdYyTMq529piEN24Dlu9b6WhrAfRpHdCncRS89Zi2QVpW5V33NX8PgH3Q== + dependencies: + workbox-core "6.6.1" + workbox-routing "6.6.1" + +workbox-sw@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.6.1.tgz#d4c4ca3125088e8b9fd7a748ed537fa0247bd72c" + integrity sha512-R7whwjvU2abHH/lR6kQTTXLHDFU2izht9kJOvBRYK65FbwutT4VvnUAJIgHvfWZ/fokrOPhfoWYoPCMpSgUKHQ== + +workbox-webpack-plugin@^6.4.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.1.tgz#4f81cc1ad4e5d2cd7477a86ba83c84ee2d187531" + integrity sha512-zpZ+ExFj9NmiI66cFEApyjk7hGsfJ1YMOaLXGXBoZf0v7Iu6hL0ZBe+83mnDq3YYWAfA3fnyFejritjOHkFcrA== dependencies: - workbox-core "^5.1.4" - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" + fast-json-stable-stringify "^2.1.0" + pretty-bytes "^5.4.1" + upath "^1.2.0" + webpack-sources "^1.4.3" + workbox-build "6.6.1" -worker-rpc@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" - integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== +workbox-window@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.6.1.tgz#f22a394cbac36240d0dadcbdebc35f711bb7b89e" + integrity sha512-wil4nwOY58nTdCvif/KEZjQ2NP8uk3gGeRNy2jPBbzypU4BT4D9L8xiwbmDBpZlSgJd2xsT9FvSNU0gsxV51JQ== dependencies: - microevent.ts "~0.1.1" + "@types/trusted-types" "^2.0.2" + workbox-core "6.6.1" -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrap-ansi@^6.2.0: version "6.2.0" @@ -14985,6 +13576,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -15000,58 +13600,20 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@7.4.6: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@7.5.3: - version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" - integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== - -ws@^5.1.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" - integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== - dependencies: - async-limiter "~1.0.0" - -ws@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" - -ws@^7.4.6: +ws@^7.4.6, ws@^7.5.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -xhr2-cookies@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g== - dependencies: - cookiejar "^2.1.1" - -xhr@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" +ws@^8.13.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== xml-name-validator@^3.0.0: version "3.0.0" @@ -15063,50 +13625,35 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -xtend@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - integrity sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ== - dependencies: - object-keys "~0.4.0" - y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== +y18n@^5.0.5: + version "5.0.8" + 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" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yaml@^2.3.4: + version "2.4.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" + integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== yargs-parser@^18.1.2: version "18.1.3" @@ -15116,23 +13663,12 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^13.2.4, yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@^15.4.1: +yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -15149,6 +13685,19 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" @@ -15170,3 +13719,8 @@ zen-observable@0.8.15: version "0.8.15" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== + +zod@3.22.4: + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== From f1793d01f17ed1d19ce339798dd045677592634a Mon Sep 17 00:00:00 2001 From: Jorge Destephen Lavaire Date: Wed, 15 May 2024 10:51:00 -0600 Subject: [PATCH 270/278] Update constants.tsx --- src/utils/constants.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 22e47f8..2fedf86 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -100,7 +100,7 @@ export const API_ENDPOINT = "https://api.cryptex.finance"; export const GRAPHQL_ENDPOINT = { mainnet: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-graph", goerli: "https://api.thegraph.com/subgraphs/name/jdestephen/cryptex-goerli-demo", - arbitrum: "https://api.thegraph.com/subgraphs/name/jdestephen/cryptex-arbitrum-demo", + arbitrum: "https://subgraph.satsuma-prod.com/0b9d5e79fdb9/cryptex/cryptex-arbitrum/api", arbitrum_goerli: "https://api.thegraph.com/subgraphs/name/jdestephen/arbitrum-goerli-demo", optimism: "https://api.thegraph.com/subgraphs/name/cryptexfinance/cryptex-optimism", okovan: "https://api.thegraph.com/subgraphs/name/jdestephen/tcap-demo", From a134aad714f9ad172da0d4e8e7de8c14157c8c5d Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 15 May 2024 16:54:04 -0600 Subject: [PATCH 271/278] added web3modal --- package.json | 6 +- src/App.tsx | 315 +++------------- .../Farm/LiquidityRewards/index.tsx | 8 +- .../Farm/UniV3Rewards/ClaimReward.tsx | 2 +- src/components/Farm/UniV3Rewards/Rewards.tsx | 4 +- src/components/Farm/UniV3Rewards/Stake.tsx | 8 +- src/components/Governance/Delegate.tsx | 4 +- src/components/Governance/KeeperForm.tsx | 12 +- src/components/Governance/StakerStats.tsx | 2 +- src/components/Governance/Withdraw.tsx | 2 +- src/components/Header.tsx | 283 +------------- src/components/SewageFruitz/Sewagefruitz.tsx | 6 +- .../Vaults/monitoring/Liquidate.tsx | 4 +- src/components/Vaults/monitoring/index.tsx | 2 +- src/components/Vaults/monitoring/index2.tsx | 2 +- src/components/Vaults/vault/index.tsx | 18 +- src/components/modals/Delegate.tsx | 2 +- src/components/modals/Stake.tsx | 4 +- src/hooks/useBalances.tsx | 88 ++--- src/hooks/useRatios.tsx | 3 + src/styles/app.scss | 2 + src/styles/header.scss | 16 +- src/styles/summary.scss | 2 +- tsconfig.json | 2 +- yarn.lock | 344 ++++++++++-------- 25 files changed, 350 insertions(+), 791 deletions(-) diff --git a/package.json b/package.json index 1620394..b36070a 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@types/jest": "^26.0.15", "@types/react": "^18.0.24", "@types/react-dom": "^18.0.8", - "@web3modal/ethers5": "^4.1.11", + "@web3modal/ethers5": "4.1.0", "bootstrap": "^4.5.3", "compressorjs": "1.1.1", "ethers": "5.7.2", @@ -42,7 +42,6 @@ "sass": "^1.58.3", "sass-loader": "^13.2.0", "sourcemap-codec": "^1.4.8", - "typescript": "4.0.5", "walletlink": "^2.4.2", "web-vitals": "^2.1.0" }, @@ -50,12 +49,11 @@ "@babel/core": "7.12.3", "@babel/preset-env": "7.12.1", "@types/react-router-dom": "^5.1.6", - "@typescript-eslint/parser": "^4.5.0", "dotenv": "8.2.0", "postcss-normalize": "^10.0.1", "prettier": "^2.1.2", "pretty-quick": "3.1.0", - "ts-node": "9.0.0" + "typescript": "^5.2.2" }, "scripts": { "start": "react-scripts start", diff --git a/src/App.tsx b/src/App.tsx index b99bbd5..1fa29d5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,11 +1,12 @@ /* eslint-disable prefer-destructuring */ -import React, { Suspense, useState, useContext, useEffect } from "react"; +import React, { Suspense, useState, useEffect } from "react"; import { Switch, Route, useRouteMatch } from "react-router-dom"; import { ethers } from "ethers"; import { Provider, Contract, setMulticallAddress } from "ethers-multicall"; import { ToastContainer } from "react-toastify"; import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; import { createWeb3Modal, defaultConfig } from '@web3modal/ethers5/react' +import { useWeb3ModalProvider, useWeb3ModalAccount } from '@web3modal/ethers5/react' import "./i18n"; import "react-toastify/dist/ReactToastify.css"; @@ -42,12 +43,10 @@ import UniV2Pair from "./contracts/UniswapV2Pair.json"; import Mushroom from "./contracts/Mushroom.json"; import { isInLayer1, - isPolygon, isValidNetwork, getDefaultProvider, toFragment, isArbitrum, - isOptimism, isGoerli, } from "./utils/utils"; import { GRAPHQL_ENDPOINT, NETWORKS } from "./utils/constants"; @@ -84,7 +83,7 @@ const metadata = { icons: ['https://avatars.mywebsite.com/'] } -/* + const ethersConfig = defaultConfig({ metadata, defaultChainId: 1, // used for the Coinbase SDK @@ -94,9 +93,22 @@ createWeb3Modal({ ethersConfig, chains: [mainnet, arbitrum], projectId, - enableAnalytics: true // Optional - defaults to your Cloud configuration + themeMode: 'dark', + featuredWalletIds: [ + 'c57ca95b47569778a828d19178114f4db188b89b763c899ba0be274e97267d96', + '4622a2b2d6af1c9844944291e5e7351a6aa24cd7b23099efac1b2fd875da31a0', + 'fd20dc426fb37566d803205b19bbc1d4096b248ac04548e3cfb6b3a38bd033aa', + '1ae92b26df02f0abca6304df07debccd18262fdf5fe82daa81593582dac9a369', + '971e689d0a5be527bac79629b4ee9b925e82208e5168b733496a09c0faed0709' + ], + themeVariables: { + '--w3m-font-family': "Nineteen Ninety Seven", + '--w3m-accent': "#1d1d3c", + '--w3m-font-size-master': "11px", + '--w3m-border-radius-master': "5", + } }) -*/ + const App = () => { const signer = hooks.useSigner(); @@ -109,6 +121,9 @@ const App = () => { process.env.REACT_APP_NETWORK_ID === "1" ? GRAPHQL_ENDPOINT.mainnet : GRAPHQL_ENDPOINT.goerli ) ); + const { chainId: walletChainId, isConnected } = useWeb3ModalAccount() + const { walletProvider } = useWeb3ModalProvider() + const networks = hooks.useNetworks(); const [currentSignerAddress, setCurrentSignerAddress] = useState(""); const vaults = hooks.useVaults(); @@ -134,34 +149,10 @@ const App = () => { cNetwork = NETWORKS.mainnet; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); break; - case NETWORKS.goerli.chainId: - cNetwork = NETWORKS.goerli; - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.goerli)); - break; case NETWORKS.arbitrum.chainId: cNetwork = NETWORKS.arbitrum; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum)); break; - case NETWORKS.arbitrum_goerli.chainId: - cNetwork = NETWORKS.arbitrum_goerli; - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.arbitrum_goerli)); - break; - case NETWORKS.optimism.chainId: - cNetwork = NETWORKS.optimism; - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.optimism)); - break; - case NETWORKS.okovan.chainId: - cNetwork = NETWORKS.okovan; - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.okovan)); - break; - case NETWORKS.polygon.chainId: - cNetwork = NETWORKS.polygon; - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.polygon)); - break; - case NETWORKS.mumbai.chainId: - cNetwork = NETWORKS.mumbai; - setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mumbai)); - break; default: cNetwork = NETWORKS.mainnet; setApolloClient(clientOracle(GRAPHQL_ENDPOINT.mainnet)); @@ -204,7 +195,10 @@ const App = () => { contracts = cryptexJson[5].goerli.contracts; break; default: - contracts = cryptexJson[5].goerli.contracts; + contracts = cryptexJson[1].mainnet.contracts; + ethPoolAddress = NETWORKS.mainnet.ethPool; + daiPoolAddress = NETWORKS.mainnet.daiPool; + ctxPoolAddress = NETWORKS.mainnet.ctxPool; break; } @@ -587,191 +581,6 @@ const App = () => { oracles.setCurrentJPEGZOracleRead(currentJPEGZOracleRead); }; - const setOptimismContracts = async (currentSigner: ethers.Signer) => { - const contracts = cryptexJson[10].optimism.contracts; - - // Set Vaults - const currentSNXVault = new ethers.Contract( - contracts.SNXVaultHandler.address, - contracts.SNXVaultHandler.abi, - currentSigner - ); - vaults.setCurrentSNXVault(currentSNXVault); - const currentUNIVault = new ethers.Contract( - contracts.UNIVaultHandler.address, - contracts.UNIVaultHandler.abi, - currentSigner - ); - vaults.setCurrentUNIVault(currentUNIVault); - - const currentSNXVaultRead = new Contract( - contracts.SNXVaultHandler.address, - contracts.SNXVaultHandler.abi - ); - vaults.setCurrentSNXVaultRead(currentSNXVaultRead); - const currentUNIVaultRead = new Contract( - contracts.UNIVaultHandler.address, - contracts.UNIVaultHandler.abi - ); - vaults.setCurrentUNIVaultRead(currentUNIVaultRead); - - // Set Tokens - const currentSNXToken = new ethers.Contract(NETWORKS.optimism.snx, ERC20.abi, currentSigner); - tokens.setCurrentSNXToken(currentSNXToken); - const currentUNIToken = new ethers.Contract(NETWORKS.optimism.uni, ERC20.abi, currentSigner); - tokens.setCurrentUNIToken(currentUNIToken); - - const currentSNXTokenRead = new Contract(NETWORKS.optimism.snx, ERC20.abi); - tokens.setCurrentSNXTokenRead(currentSNXTokenRead); - const currentUNITokenRead = new Contract(NETWORKS.optimism.uni, ERC20.abi); - tokens.setCurrentUNITokenRead(currentUNITokenRead); - - // Set Oracles - const currentSNXOracle = new ethers.Contract( - contracts.SNXOracle.address, - contracts.SNXOracle.abi, - currentSigner - ); - oracles.setCurrentSNXOracle(currentSNXOracle); - const currentUNIOracle = new ethers.Contract( - contracts.UNIOracle.address, - contracts.UNIOracle.abi, - currentSigner - ); - oracles.setCurrentUNIOracle(currentUNIOracle); - - const currentSNXOracleRead = new Contract(contracts.SNXOracle.address, contracts.SNXOracle.abi); - oracles.setCurrentSNXOracleRead(currentSNXOracleRead); - const currentUNIOracleRead = new Contract(contracts.UNIOracle.address, contracts.UNIOracle.abi); - oracles.setCurrentUNIOracleRead(currentUNIOracleRead); - }; - - const setPolygonContracts = async ( - chainId: number, - currentSigner: ethers.Signer, - ethcallProvider: Provider - ) => { - await ethcallProvider.init(); - signer.setCurrentEthcallProvider(ethcallProvider); - let contracts; - let daiAddress = NETWORKS.polygon.dai; - let maticAddress = NETWORKS.polygon.matic; - - if (chainId === NETWORKS.polygon.chainId) { - contracts = cryptexJson[137].polygon.contracts; - } else { - contracts = cryptexJson[80001].mumbai.contracts; - daiAddress = NETWORKS.mumbai.dai; - maticAddress = NETWORKS.mumbai.matic; - } - - // Set Vaults - const currentDAIVault = new ethers.Contract( - contracts.DAIVaultHandler.address, - contracts.DAIVaultHandler.abi, - currentSigner - ); - vaults.setCurrentDAIVault(currentDAIVault); - const currentMaticVault = new ethers.Contract( - contracts.MATICVaultHandler.address, - contracts.MATICVaultHandler.abi, - currentSigner - ); - vaults.setCurrentMaticVault(currentMaticVault); - const currentWBTCVault = new ethers.Contract( - contracts.WBTCVaultHandler.address, - contracts.WBTCVaultHandler.abi, - currentSigner - ); - vaults.setCurrentWBTCVault(currentWBTCVault); - - const currentDAIVaultRead = new Contract( - contracts.DAIVaultHandler.address, - contracts.DAIVaultHandler.abi - ); - vaults.setCurrentDAIVaultRead(currentDAIVaultRead); - const currentMATICVaultRead = new Contract( - contracts.MATICVaultHandler.address, - toFragment(contracts.MATICVaultHandler.abi) - ); - vaults.setCurrentMaticVaultRead(currentMATICVaultRead); - const currentWBTCVaultRead = new Contract( - contracts.WBTCVaultHandler.address, - contracts.WBTCVaultHandler.abi - ); - vaults.setCurrentWBTCVaultRead(currentWBTCVaultRead); - - // Set Tokens - const currentDAIToken = new ethers.Contract(daiAddress, WETH.abi, currentSigner); - tokens.setCurrentDAIToken(currentDAIToken); - const currentMATICToken = new ethers.Contract(maticAddress, ERC20.abi, currentSigner); - tokens.setCurrentMATICToken(currentMATICToken); - const currentWBTCToken = new ethers.Contract( - contracts.WBTC.address, - contracts.WBTC.abi, - currentSigner - ); - tokens.setCurrentWBTCToken(currentWBTCToken); - const currentTCAPToken = new ethers.Contract( - contracts.TCAP.address, - contracts.TCAP.abi, - currentSigner - ); - tokens.setCurrentTCAPToken(currentTCAPToken); - - const currentDAITokenRead = new Contract(daiAddress, WETH.abi); - tokens.setCurrentDAITokenRead(currentDAITokenRead); - const currentMATICTokenRead = new Contract(maticAddress, ERC20.abi); - tokens.setCurrentMATICTokenRead(currentMATICTokenRead); - const currentWBTCTokenRead = new Contract(contracts.WBTC.address, ERC20.abi); - tokens.setCurrentWBTCTokenRead(currentWBTCTokenRead); - const currentTCAPTokenRead = new Contract(contracts.TCAP.address, contracts.TCAP.abi); - tokens.setCurrentTCAPTokenRead(currentTCAPTokenRead); - - // Set Oracles - const currentDAIOracle = new ethers.Contract( - contracts.DAIOracle.address, - contracts.DAIOracle.abi, - currentSigner - ); - oracles.setCurrentDAIOracle(currentDAIOracle); - const currentTCAPOracle = new ethers.Contract( - contracts.TCAPOracle.address, - contracts.TCAPOracle.abi, - currentSigner - ); - oracles.setCurrentTCAPOracle(currentTCAPOracle); - const currentMATICOracle = new ethers.Contract( - contracts.MATICOracle.address, - contracts.MATICOracle.abi, - currentSigner - ); - oracles.setCurrentMATICOracle(currentMATICOracle); - const currentWBTCOracle = new ethers.Contract( - contracts.WBTCOracle.address, - contracts.WBTCOracle.abi, - currentSigner - ); - oracles.setCurrentWBTCOracle(currentWBTCOracle); - const currentDAIOracleRead = new Contract(contracts.DAIOracle.address, contracts.DAIOracle.abi); - oracles.setCurrentDAIOracleRead(currentDAIOracleRead); - const currentTCAPOracleRead = new Contract( - contracts.TCAPOracle.address, - contracts.TCAPOracle.abi - ); - oracles.setCurrentTCAPOracleRead(currentTCAPOracleRead); - const currentMATICOracleRead = new Contract( - contracts.MATICOracle.address, - contracts.MATICOracle.abi - ); - oracles.setCurrentMATICOracleRead(currentMATICOracleRead); - const currentWBTCOracleRead = new Contract( - contracts.WBTCOracle.address, - contracts.WBTCOracle.abi - ); - oracles.setCurrentWBTCOracleRead(currentWBTCOracleRead); - }; - const setContracts = async ( currentSigner: ethers.Signer, ethcallProvider: Provider, @@ -796,22 +605,10 @@ const App = () => { daiAddress = NETWORKS.goerli.dai; linkAddress = contracts.LINK.address; break; - case NETWORKS.optimism.chainId: - contracts = cryptexJson[10].optimism.contracts; - wethAddress = NETWORKS.optimism.weth; - daiAddress = NETWORKS.optimism.dai; - linkAddress = NETWORKS.optimism.link; - break; - case NETWORKS.okovan.chainId: - contracts = cryptexJson[69].okovan.contracts; - wethAddress = NETWORKS.okovan.weth; - daiAddress = NETWORKS.okovan.dai; - linkAddress = ""; - break; default: - contracts = cryptexJson[5].goerli.contracts; - wethAddress = NETWORKS.goerli.weth; - daiAddress = NETWORKS.goerli.dai; + contracts = cryptexJson[1].mainnet.contracts; + wethAddress = NETWORKS.mainnet.weth; + daiAddress = NETWORKS.mainnet.dai; linkAddress = contracts.LINK.address; break; } @@ -922,65 +719,43 @@ const App = () => { if (isInLayer1(chainId)) { setEthereumContracts(chainId, currentSigner); } - if (isOptimism(chainId)) { - setOptimismContracts(currentSigner); - } }; - /* web3Modal.on("connect", async (networkProvider) => { + const onConnectWallet = async () => { + if (!walletProvider || !walletChainId) return; + setLoadingContracts(true); - const currentProvider = new ethers.providers.Web3Provider(networkProvider); - const network = await currentProvider.getNetwork(); + const currentProvider = new ethers.providers.Web3Provider(walletProvider); const isNftFruit = - window.location.toString().includes("sewagefruitz") && isGoerli(network.chainId); + window.location.toString().includes("sewagefruitz") && isGoerli(walletChainId); - if (!isValidNetwork(network.chainId) && !isNftFruit) { + if (!isValidNetwork(walletChainId) && !isNftFruit) { setInvalidNetwork(true); } const walletName = currentProvider.provider.isMetaMask ? "metamask" : "other"; const currentSigner = currentProvider.getSigner(); signer.setCurrentSigner(currentSigner); const ethcallProvider = new Provider(currentProvider); - if (isArbitrum(network.chainId)) { - await setArbitrumContracts(network.chainId, currentSigner, ethcallProvider); - } else if (isPolygon(network.chainId)) { - await setPolygonContracts(network.chainId, currentSigner, ethcallProvider); + if (isArbitrum(walletChainId)) { + await setArbitrumContracts(walletChainId, currentSigner, ethcallProvider); } else { - await setContracts(currentSigner, ethcallProvider, network.chainId || 5); + await setContracts(currentSigner, ethcallProvider, walletChainId || 5); } - const isBrowserWallet = - networkProvider.isMetaMask || getProviderInfo(networkProvider.id === "walletlink"); + const isBrowserWallet = !!walletProvider.isMetaMask; const cAddress = await currentSigner.getAddress(); setCurrentSignerAddress(cAddress); - setCurrentNetwork(network.chainId, walletName, isBrowserWallet); - - // @ts-ignore - networkProvider.on("chainChanged", (chainId: number) => { - if (chainId !== network.chainId) { - setCurrentNetwork(chainId, "", isBrowserWallet); - window.location.reload(); - } - }); - if (networkProvider.isFortmatic) { - // @ts-ignore - networkProvider.on("accountsChanged", (accounts: string[]) => { - if (accounts.length === 0) { - web3Modal.clearCachedProvider(); - } - window.location.reload(); - }); - } + setCurrentNetwork(walletChainId, walletName, isBrowserWallet); setLoadingContracts(false); - }); */ + }; useEffect(() => { async function loadProvider() { // if (web3Modal.cachedProvider && !signer.signer) { - if (!signer.signer) { - if (!isLoadingContracts) { - // await web3Modal.connect(); + if (isConnected) { + if (!isLoadingContracts && walletProvider) { + onConnectWallet(); } } else { setLoadingContracts(true); @@ -990,8 +765,6 @@ const App = () => { const ethcallProvider = new Provider(randomSigner.provider); if (isArbitrum(parseInt(chainId))) { setArbitrumContracts(parseInt(chainId), randomSigner, ethcallProvider); - } else if (isPolygon(parseInt(chainId))) { - setPolygonContracts(parseInt(chainId), randomSigner, ethcallProvider); } else { setContracts(randomSigner, ethcallProvider, parseInt(chainId)); } @@ -1002,7 +775,7 @@ const App = () => { // Execute the created function directly loadProvider(); // eslint-disable-next-line - }, []); + }, [isConnected, walletChainId]); const handlers = useSwipeable({ onSwipedLeft: () => setShowSidebar(true), diff --git a/src/components/Farm/LiquidityRewards/index.tsx b/src/components/Farm/LiquidityRewards/index.tsx index bdec7e4..88ae306 100644 --- a/src/components/Farm/LiquidityRewards/index.tsx +++ b/src/components/Farm/LiquidityRewards/index.tsx @@ -63,7 +63,7 @@ const LiquidityRewards = () => { const refresh = async () => { try { setUpdateData(!updateData); - } catch (error) { + } catch (error: any) { // catch error in case the vault screen is changed } }; @@ -261,7 +261,7 @@ const LiquidityRewards = () => { break; } notifyUser(tx, refresh); - } catch (error) { + } catch (error: any) { if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); } else { @@ -300,7 +300,7 @@ const LiquidityRewards = () => { break; } notifyUser(tx, refresh); - } catch (error) { + } catch (error: any) { if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { @@ -330,7 +330,7 @@ const LiquidityRewards = () => { break; } notifyUser(tx, refresh); - } catch (error) { + } catch (error: any) { if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { diff --git a/src/components/Farm/UniV3Rewards/ClaimReward.tsx b/src/components/Farm/UniV3Rewards/ClaimReward.tsx index d02464c..872dc59 100644 --- a/src/components/Farm/UniV3Rewards/ClaimReward.tsx +++ b/src/components/Farm/UniV3Rewards/ClaimReward.tsx @@ -54,7 +54,7 @@ const ClaimReward = ({ notifyUser(tx, refresh); setRewardText(""); onHide(); - } catch (error) { + } catch (error: any) { errorNotification(t("errors.tran-rejected")); } } else { diff --git a/src/components/Farm/UniV3Rewards/Rewards.tsx b/src/components/Farm/UniV3Rewards/Rewards.tsx index 310d724..a7b90fd 100644 --- a/src/components/Farm/UniV3Rewards/Rewards.tsx +++ b/src/components/Farm/UniV3Rewards/Rewards.tsx @@ -265,7 +265,7 @@ const Rewards = ({ const refresh = async () => { try { await refetch(); - } catch (error) { + } catch (error: any) { console.log(error); } }; @@ -299,7 +299,7 @@ const Rewards = ({ const tx = await stakerContract.withdrawToken(lpTokenId, ownerAddress, "0x"); notifyUser(tx, refresh); refresh(); - } catch (error) { + } catch (error: any) { errorNotification("Transaction Rejected"); console.log(error); } diff --git a/src/components/Farm/UniV3Rewards/Stake.tsx b/src/components/Farm/UniV3Rewards/Stake.tsx index 4b0dc57..d53b2e2 100644 --- a/src/components/Farm/UniV3Rewards/Stake.tsx +++ b/src/components/Farm/UniV3Rewards/Stake.tsx @@ -61,7 +61,7 @@ const Stake = ({ setBtnDisabled(true); const tx = await nfpmContract?.approve(UNIV3.stakerAddress, position.lpTokenId); notifyUser(tx, refresh); - } catch (error) { + } catch (error: any) { console.log(error); errorNotification(t("errors.tran-rejected")); } @@ -78,7 +78,7 @@ const Stake = ({ encodeIncentive(incentive) ); notifyUser(tx, refresh); - } catch (error) { + } catch (error: any) { console.log(error); errorNotification(t("errors.tran-rejected")); } @@ -90,7 +90,7 @@ const Stake = ({ setBtnDisabled(true); const tx = await stakerContract?.stakeToken(incentive, position.lpTokenId); notifyUser(tx, refresh); - } catch (error) { + } catch (error: any) { console.log(error); errorNotification(t("errors.tran-rejected")); } @@ -102,7 +102,7 @@ const Stake = ({ setBtnDisabled(true); const tx = await stakerContract?.unstakeToken(incentive, position.lpTokenId); notifyUser(tx, refresh); - } catch (error) { + } catch (error: any) { console.log(error); errorNotification(t("errors.tran-rejected")); } diff --git a/src/components/Governance/Delegate.tsx b/src/components/Governance/Delegate.tsx index 9bf23b4..3ca42c5 100644 --- a/src/components/Governance/Delegate.tsx +++ b/src/components/Governance/Delegate.tsx @@ -82,7 +82,7 @@ const Delegate = ({ setStakeText(""); onHide(); addTodayWithdrawTime(); - } catch (error) { + } catch (error: any) { errorNotification(t("errors.not-ctx")); } } else { @@ -103,7 +103,7 @@ const Delegate = ({ notifyUser(tx, refresh); setStakeText(""); setIsApproved(true); - } catch (error) { + } catch (error: any) { if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); } else { diff --git a/src/components/Governance/KeeperForm.tsx b/src/components/Governance/KeeperForm.tsx index 7b0eb55..08c82ca 100644 --- a/src/components/Governance/KeeperForm.tsx +++ b/src/components/Governance/KeeperForm.tsx @@ -279,8 +279,8 @@ const KeeperForm = ({ } }; - const isFormDataValid = (): boolean => - isValidKeeper(delegatee) && + const isFormDataValid = async (): Promise => + await isValidKeeper(delegatee) && isNameValid(name) && isExpertiseValid(expertise) && isWhyValid(why) && @@ -319,7 +319,8 @@ const KeeperForm = ({ const createKeeper = async (event: React.MouseEvent) => { event.preventDefault(); setSaving(true); - if (delegatorFactory && isFormDataValid() && currentAddress !== "") { + const isValid = await isFormDataValid(); + if (delegatorFactory && isValid && currentAddress !== "") { if (address && delegatee) { try { const tx = await delegatorFactory.createDelegator(address); @@ -328,7 +329,7 @@ const KeeperForm = ({ await saveKeeper(); refresh(); onHide(); - } catch (error) { + } catch (error: any) { console.log(error); errorNotification(t("governance.errors.creating-keeper")); } @@ -341,7 +342,8 @@ const KeeperForm = ({ const updateKeeper = async () => { setSaving(true); - if (isFormDataValid() && currentAddress !== "") { + const iValid = await isFormDataValid(); + if (iValid && currentAddress !== "") { const formData = new FormData(); formData.append("keeper_id", keeperInfo.id); formData.append("name", name); diff --git a/src/components/Governance/StakerStats.tsx b/src/components/Governance/StakerStats.tsx index 7da2952..51f5e04 100644 --- a/src/components/Governance/StakerStats.tsx +++ b/src/components/Governance/StakerStats.tsx @@ -93,7 +93,7 @@ const StakerStats = ({ refresh, updateData, withdrawTimes, updateTimes, t }: pro try { const tx = await governance.delegatorFactory.getReward(); notifyUser(tx, refresh); - } catch (error) { + } catch (error: any) { if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); } else { diff --git a/src/components/Governance/Withdraw.tsx b/src/components/Governance/Withdraw.tsx index ec7222f..19a27e2 100644 --- a/src/components/Governance/Withdraw.tsx +++ b/src/components/Governance/Withdraw.tsx @@ -52,7 +52,7 @@ const Withdraw = ({ notifyUser(tx, refresh); setWithdrawText(""); onHide(); - } catch (error) { + } catch (error: any) { errorNotification(t("governance.errors.need-to-wait")); } } else { diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 77b3611..60eb011 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -1,293 +1,55 @@ -import React, { useContext, useEffect, useState } from "react"; +import React, { useContext } from "react"; import Nav from "react-bootstrap/esm/Nav"; -import Button from "react-bootstrap/esm/Button"; -import Dropdown from "react-bootstrap/Dropdown"; -import OverlayTrigger from "react-bootstrap/esm/OverlayTrigger"; -import Tooltip from "react-bootstrap/esm/Tooltip"; +import { useWeb3Modal } from '@web3modal/ethers5/react' import { useTranslation } from "react-i18next"; import "../styles/header.scss"; -import Davatar from "@davatar/react"; -import { networkContext, signerContext } from "../state"; -import { - makeShortAddress, - getENS, - isInLayer1, - isOptimism, - isPolygon, - isArbitrum, -} from "../utils/utils"; -import { NETWORKS, FEATURES } from "../utils/constants"; -import { ReactComponent as LogoutIcon } from "../assets/images/welcome/logout.svg"; -import { ReactComponent as ETHIcon } from "../assets/images/graph/weth.svg"; -import { ReactComponent as OPTIMISMIcon } from "../assets/images/graph/optimism.svg"; -import { ReactComponent as ARBITRUMIcon } from "../assets/images/arbitrum.svg"; -import { ReactComponent as POLYGONIcon } from "../assets/images/polygon2.svg"; +import { signerContext } from "../state"; +import { Button } from "react-bootstrap"; type props = { signerAddress: string; isMobile: boolean; }; -/* type propsDD = { - className: string; -}; */ const Header = ({ signerAddress, isMobile }: props) => { const { t } = useTranslation(); + const { open } = useWeb3Modal() const signer = useContext(signerContext); - const currentNetwork = useContext(networkContext); - const [address, setAddress] = useState("0x0000000000000000000000000000000000000000"); - const [addressField, setAddressField] = useState(""); // const [language, setLanguage] = useState("EN"); - const [loading, setLoading] = useState(false); - const copyCodeToClipboard = (e: React.MouseEvent) => { - e.preventDefault(); - // Create new element - const el = document.createElement("textarea"); - // Set value (string to be copied) - el.value = address; - // Set non-editable to avoid focus and move outside of view - el.setAttribute("readonly", ""); - document.body.appendChild(el); - // Select text inside element - el.select(); - // Copy text to clipboard - document.execCommand("copy"); - // Remove temporary element - document.body.removeChild(el); - }; - - async function addNetwork(newChainId: string) { - let chainName = "Optimism"; - let currency = "Ether (ETH)"; - let symbol = "ETH"; - let rpcUrl = "https://mainnet.optimism.io/"; - let blockExplorerUrl = "https://optimistic.etherscan.io"; - - if (newChainId === NETWORKS.arbitrum_goerli.hexChainId) { - chainName = "Arbitrum Goerli"; - currency = "GoerliETH"; - symbol = "AGOR"; - rpcUrl = "https://goerli-rollup.arbitrum.io/rpc"; - blockExplorerUrl = "https://goerli.arbiscan.io/"; - } - if (newChainId === NETWORKS.okovan.hexChainId) { - chainName = "Optimistic Ethereum (Kovan)"; - rpcUrl = "https://kovan.optimism.io"; - blockExplorerUrl = "https://kovan-optimistic.etherscan.io"; - } - if (newChainId === NETWORKS.polygon.hexChainId) { - chainName = "Polygon Mainnet"; - currency = "Matic Token"; - symbol = "MATIC"; - rpcUrl = "https://rpc-mainnet.maticvigil.com/"; - blockExplorerUrl = "https://polygonscan.com/"; - } - if (newChainId === NETWORKS.mumbai.hexChainId) { - chainName = "Mumbai"; - currency = "Matic Token"; - symbol = "MATIC"; - rpcUrl = "https://rpc-mumbai.maticvigil.com/"; - blockExplorerUrl = "https://mumbai.polygonscan.com/"; - } - - try { - await window.ethereum.request({ - method: "wallet_addEthereumChain", - params: [ - { - chainId: newChainId, - chainName, - nativeCurrency: { - name: currency, - symbol, - decimals: 18, - }, - rpcUrls: [rpcUrl], - blockExplorerUrls: [blockExplorerUrl], - }, - ], - }); - } catch (addError) { - // handle "add" error - } - } - - const onNetworkChange = async (newChainId: string | null) => { - if (currentNetwork.isBrowserWallet) { - try { - await window.ethereum.request({ - method: "wallet_switchEthereumChain", - params: [{ chainId: newChainId }], - }); - } catch (error) { - // This error code indicates that the chain has not been added to MetaMask. - if ( - error.code === 4902 && - (newChainId === NETWORKS.optimism.hexChainId || - newChainId === NETWORKS.okovan.hexChainId || - newChainId === NETWORKS.arbitrum_goerli.hexChainId || - newChainId === NETWORKS.polygon.hexChainId) - ) { - addNetwork(newChainId); - } - } - } - }; - - useEffect(() => { + /* useEffect(() => { const loadAddress = async () => { setLoading(true); if (signerAddress !== "" && signer.signer) { - const ens = await getENS(signerAddress); - if (ens) { - setAddressField(ens); - } else { - setAddressField(makeShortAddress(signerAddress)); - } - setAddress(signerAddress); setLoading(false); } /* let lng = localStorage.getItem("language"); if (lng) { if (lng === "en-US") lng = "en"; setLanguage(lng.toUpperCase()); - } */ + } }; loadAddress(); // eslint-disable-next-line - }, [signerAddress, currentNetwork.chainId]); + }, [signerAddress, currentNetwork.chainId]); */ - const showDropdown = (): boolean => !isMobile || (isMobile && !loading); + // const showDropdown = (): boolean => !isMobile || (isMobile && !loading); - const ArbitrumToggle = () => ( + /* const ArbitrumToggle = () => ( <>
{process.env.REACT_APP_NETWORK_ID === "1" ? "Arbitrum" : "A. Goerli"}
- ); - - const ArbitrumOpt = () => ( - - <>{ArbitrumToggle()} - - ); - - const EthereumToggle = () => ( - <> - -
{process.env.REACT_APP_NETWORK_ID === "1" ? "Ethereum" : "Goerli"}
- - ); - - const EthereumOpt = () => { - let { chainId } = NETWORKS.mainnet; - let { hexChainId } = NETWORKS.mainnet; - if (process.env.REACT_APP_NETWORK_ID === "5") { - chainId = NETWORKS.goerli.chainId; - hexChainId = NETWORKS.goerli.hexChainId; - } + ); */ - return ( - - {EthereumToggle()} - - ); - }; - - const OptimismToggle = () => ( - <> - -
{process.env.REACT_APP_NETWORK_ID === "1" ? "Optimism" : "Kovan"}
- - ); - - const OptimismOpt = () => ( - - {OptimismToggle()} - - ); - - const PolygonToggle = () => ( - <> - -
{process.env.REACT_APP_NETWORK_ID === "1" ? "Polygon" : "Mumbai"}
- - ); - - const PolygonOpt = () => ( - - {PolygonToggle()} - - ); return (
); diff --git a/src/components/SewageFruitz/Sewagefruitz.tsx b/src/components/SewageFruitz/Sewagefruitz.tsx index 04b3104..4946341 100644 --- a/src/components/SewageFruitz/Sewagefruitz.tsx +++ b/src/components/SewageFruitz/Sewagefruitz.tsx @@ -133,7 +133,7 @@ const SewageFruitz = () => { let tokenId = 0; try { tokenId = await getTokenId(currentAddress); - } catch (error) { + } catch (error: any) { console.log(error); } if (tokenId > 0) { @@ -205,7 +205,7 @@ const SewageFruitz = () => { const tx = await mushroom.mushroomNft?.mint(signerAddress, merkleProof); notifyUser(tx, refresh); setMinting(false); - } catch (error) { + } catch (error: any) { console.log(error.message); errorNotification(t("errors.tran-rejected")); setMinting(false); @@ -217,7 +217,7 @@ const SewageFruitz = () => { try { const tx = await mushroom.mushroomNft?.publicMint(); notifyUser(tx, refresh); - } catch (error) { + } catch (error: any) { console.log(error.message); errorNotification(t("errors.tran-rejected")); } diff --git a/src/components/Vaults/monitoring/Liquidate.tsx b/src/components/Vaults/monitoring/Liquidate.tsx index 22a66c1..38d90f3 100644 --- a/src/components/Vaults/monitoring/Liquidate.tsx +++ b/src/components/Vaults/monitoring/Liquidate.tsx @@ -121,7 +121,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = setBurnFee(ethFee); setBurnFeeUsd(toUSD(ethFee, ethPriceText).toFixed(2)); setValuesUpdated(!valuesUpdated); - } catch (error) { + } catch (error: any) { // Error happens when trying to calculate reward on a not liquidable vault if (error.code !== "UNPREDICTABLE_GAS_LIMIT") { console.log(error); @@ -181,7 +181,7 @@ const Liquidate = ({ show, currentAddress, liqVault, onHide, refresh }: props) = await loadVaultData(); setMaxIndex(""); onHide(); - } catch (error) { + } catch (error: any) { errorNotification("Burn fee less than required."); } } else { diff --git a/src/components/Vaults/monitoring/index.tsx b/src/components/Vaults/monitoring/index.tsx index 3ff5ffb..1744b6c 100644 --- a/src/components/Vaults/monitoring/index.tsx +++ b/src/components/Vaults/monitoring/index.tsx @@ -319,7 +319,7 @@ const Monitoring = ({ setVaultToUpdate }: props) => { toUSD(reqTcapText, prices.tcapOraclePrice) - toUSD(ethFee, prices.wethOraclePrice) ); - } catch (error) { + } catch (error: any) { if (error.code !== "UNPREDICTABLE_GAS_LIMIT") { console.log(error.code); } diff --git a/src/components/Vaults/monitoring/index2.tsx b/src/components/Vaults/monitoring/index2.tsx index e9e678d..40886ac 100644 --- a/src/components/Vaults/monitoring/index2.tsx +++ b/src/components/Vaults/monitoring/index2.tsx @@ -257,7 +257,7 @@ const Monitoring = ({ currentAddress, setVaultToUpdate }: props) => { toUSD(reqTcapText, prices.tcapOraclePrice) - toUSD(ethFee, prices.wethOraclePrice) ); - } catch (error) { + } catch (error: any) { if (error.code !== "UNPREDICTABLE_GAS_LIMIT") { console.log(error.code); } diff --git a/src/components/Vaults/vault/index.tsx b/src/components/Vaults/vault/index.tsx index 372a3eb..23ae59a 100644 --- a/src/components/Vaults/vault/index.tsx +++ b/src/components/Vaults/vault/index.tsx @@ -396,7 +396,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setActiveAction("remove"); } } - } catch (error) { + } catch (error: any) { console.log(error); } }; @@ -451,7 +451,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { try { ethers.utils.parseEther(value); return true; - } catch (error) { + } catch (error: any) { return false; } }; @@ -641,7 +641,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setBurnUSD("0"); setBurnFee("0"); } - } catch (error) { + } catch (error: any) { changeVault(0, true); setBurnUSD("0"); setBurnFee("0"); @@ -683,7 +683,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const tx = await currentVault?.addCollateral(amount); notifyUser(tx, refresh); } - } catch (error) { + } catch (error: any) { console.error(error); if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); @@ -741,7 +741,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const tx = await currentVault?.removeCollateral(amount); notifyUser(tx, refresh); } - } catch (error) { + } catch (error: any) { console.error(error); if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); @@ -802,7 +802,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { const tx = await currentVault?.mint(amount, { value: BigNumber.from(increasedFee) }); notifyUser(tx, refresh); } - } catch (error) { + } catch (error: any) { console.error(error); if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); @@ -864,7 +864,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { setBurnFee(ethFee.toString()); const tx = await currentVault?.burn(amount, { value: BigNumber.from(increasedFee) }); notifyUser(tx, refresh); - } catch (error) { + } catch (error: any) { console.error(error); if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); @@ -1280,7 +1280,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { try { const tx = await currentVault?.createVault(); notifyUser(tx, refresh); - } catch (error) { + } catch (error: any) { if (error.code === 4001 || error.code === -32603) { errorNotification(t("errors.tran-rejected")); } @@ -1291,7 +1291,7 @@ const Vault = ({ currentAddress, vaultInitData, goBack }: props) => { try { const tx = await currentCollateral?.approve(currentVault?.address, approveValue); notifyUser(tx, refresh); - } catch (error) { + } catch (error: any) { if (error.code === 4001 || error.code === -32603) { errorNotification(t("errors.tran-rejected")); } diff --git a/src/components/modals/Delegate.tsx b/src/components/modals/Delegate.tsx index fd00a0e..d1ededc 100644 --- a/src/components/modals/Delegate.tsx +++ b/src/components/modals/Delegate.tsx @@ -31,7 +31,7 @@ export const Delegate = ({ show, onHide, refresh }: props) => { notifyUser(tx, refresh); setAddressText(""); onHide(); - } catch (error) { + } catch (error: any) { if (error.code === 4001 || error.code === -32603) { errorNotification("Transaction rejected"); } else { diff --git a/src/components/modals/Stake.tsx b/src/components/modals/Stake.tsx index 934ca89..44896f2 100644 --- a/src/components/modals/Stake.tsx +++ b/src/components/modals/Stake.tsx @@ -57,7 +57,7 @@ export const Stake = ({ show, poolTitle, poolToken, pool, balance, onHide, refre notifyUser(tx, refresh); setStakeText(""); onHide(); - } catch (error) { + } catch (error: any) { if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); } else { @@ -78,7 +78,7 @@ export const Stake = ({ show, poolTitle, poolToken, pool, balance, onHide, refre notifyUser(tx, refresh); setStakeText(""); setIsApproved(true); - } catch (error) { + } catch (error: any) { if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); } else { diff --git a/src/hooks/useBalances.tsx b/src/hooks/useBalances.tsx index f4634b9..8d72512 100644 --- a/src/hooks/useBalances.tsx +++ b/src/hooks/useBalances.tsx @@ -1,8 +1,8 @@ import { useContext, useEffect, useState } from "react"; import { ethers } from "ethers"; import { Provider } from "ethers-multicall"; -import { arbitrumContext, ethereumContext, optimismContext } from "../state/index"; -import { isArbitrum, isInLayer1, isOptimism, validOracles } from "../utils/utils"; +import { arbitrumContext, ethereumContext } from "../state/index"; +import { isArbitrum, isInLayer1, validOracles } from "../utils/utils"; import { BalancesType } from "./types"; export const useBalances = ( @@ -12,7 +12,6 @@ export const useBalances = ( ): [BalancesType, boolean] => { const arbitrumContracts = useContext(arbitrumContext); const ethereumContracts = useContext(ethereumContext); - const optimismContracts = useContext(optimismContext); const [loadingBalances, setLoadingBalances] = useState(true); const [balances, setBalances] = useState({ tcapBalance: "0", @@ -60,65 +59,44 @@ export const useBalances = ( }); }; - const loadBalanceOptimism = async () => { - if (optimismContracts.tcapTokenRead) { - const tcapBalanceCall = await optimismContracts.tcapTokenRead?.balanceOf(address); - const tcapSupplyBalanceCall = await optimismContracts.tcapTokenRead?.totalSupply(); - - // @ts-ignore - const [tcapBalance, tcapSupply] = await ethcallProvider?.all([ - tcapBalanceCall, - tcapSupplyBalanceCall, - ]); - setBalances({ - tcapBalance: ethers.utils.formatEther(tcapBalance), - jpegzBalance: "0", - ctxBalance: "0", - tcapSupplly: ethers.utils.formatEther(tcapSupply), - jpegzSupplly: "0", - }); - } - }; - const loadBalance = async () => { - if (arbitrumContracts && ethereumContracts && optimismContracts) { - if (isArbitrum(chainId) && validOracles(chainId, arbitrumContracts)) { - await loadBalanceArbitrum(); - } - if (isInLayer1(chainId) && validOracles(chainId, ethereumContracts)) { - await loadBalanceEthereum(); + try { + if (arbitrumContracts && ethereumContracts) { + if (isArbitrum(chainId) && validOracles(chainId, arbitrumContracts)) { + await loadBalanceArbitrum(); + } + if (isInLayer1(chainId) && validOracles(chainId, ethereumContracts)) { + await loadBalanceEthereum(); + } } - if (isOptimism(chainId) && validOracles(chainId, optimismContracts)) { - await loadBalanceOptimism(); - } - } - setLoadingBalances(false); + setLoadingBalances(false); + } catch (error: any) { } }; const loadIndexSupply = async () => { - if (ethcallProvider) { - let indexTokenRead = ethereumContracts.tcapTokenRead; - if (isArbitrum(chainId)) { - indexTokenRead = arbitrumContracts.jpegzTokenRead; - } - if (isOptimism(chainId)) { - indexTokenRead = optimismContracts.tcapTokenRead; - } + try { + if (ethcallProvider) { + let indexTokenRead = ethereumContracts.tcapTokenRead; + if (isArbitrum(chainId)) { + indexTokenRead = arbitrumContracts.jpegzTokenRead; + } - if (indexTokenRead) { - const indexSupplyCall = await indexTokenRead?.totalSupply(); - // @ts-ignore - const [indexSupply] = await ethcallProvider?.all([indexSupplyCall]); - const indexSupplyVal = ethers.utils.formatEther(indexSupply); + if (indexTokenRead) { + const indexSupplyCall = await indexTokenRead?.totalSupply(); + const indexSupply = await ethcallProvider?.all([indexSupplyCall]); + const indexSupplyVal = ethers.utils.formatEther(indexSupply); - setBalances({ - tcapBalance: "0", - jpegzBalance: "0", - ctxBalance: "0", - tcapSupplly: !isArbitrum(chainId) ? indexSupplyVal : "0", - jpegzSupplly: isArbitrum(chainId) ? indexSupplyVal : "0", - }); + setBalances({ + tcapBalance: "0", + jpegzBalance: "0", + ctxBalance: "0", + tcapSupplly: !isArbitrum(chainId) ? indexSupplyVal : "0", + jpegzSupplly: isArbitrum(chainId) ? indexSupplyVal : "0", + }); + } } + } catch (error: any) { + } }; @@ -126,7 +104,7 @@ export const useBalances = ( () => { if (ethcallProvider && address !== "") { loadBalance(); - } else { + } else if (ethcallProvider) { loadIndexSupply(); setLoadingBalances(false); } diff --git a/src/hooks/useRatios.tsx b/src/hooks/useRatios.tsx index fe10999..e7b84e5 100644 --- a/src/hooks/useRatios.tsx +++ b/src/hooks/useRatios.tsx @@ -29,6 +29,7 @@ export const useRatios = (): VaultsRatioType => { hardWethRatio: 125, hardDaiRatio: 125, hardUsdcRatio: 125, + hardWbtcRatio: 125, }); const loadRatios = async () => { @@ -87,6 +88,7 @@ export const useRatios = (): VaultsRatioType => { let hardEthRatio = 0; let hardDaiRatio = 0; let hardUsdcRatio = 0; + let hardWbtcRatio = 0; if (isInLayer1(currentNetwork.chainId)) { // @ts-ignore [daiRatio, ethRatio, aaveRatio, linkRatio, hardEthRatio, hardDaiRatio, hardUsdcRatio] = @@ -117,6 +119,7 @@ export const useRatios = (): VaultsRatioType => { hardWethRatio: hardEthRatio, hardDaiRatio, hardUsdcRatio, + hardWbtcRatio, }); } }; diff --git a/src/styles/app.scss b/src/styles/app.scss index 5e5db3e..63a0e8a 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -739,6 +739,8 @@ form { } } + + @media (max-width: 850px) { .box { display: flex; diff --git a/src/styles/header.scss b/src/styles/header.scss index 7f35392..d605740 100644 --- a/src/styles/header.scss +++ b/src/styles/header.scss @@ -5,7 +5,7 @@ flex-direction: row; justify-content: flex-end; align-items: center; - padding-right: 3rem; + padding-right: 2rem; .network-container { display: flex; @@ -173,6 +173,20 @@ margin-left: 10px; } + button { + border: 1px solid $highlight !important; + } + + [data-testid="connect-button"] { + background-color: $primary !important; + border: 1px solid $highlight; + + button { + background-color: $primary !important; + border: 1px solid $highlight; + } + } + @media (max-width: 769px) { .address { font-size: 1rem; diff --git a/src/styles/summary.scss b/src/styles/summary.scss index a690010..eba83e9 100644 --- a/src/styles/summary.scss +++ b/src/styles/summary.scss @@ -5,7 +5,7 @@ display: flex; flex-direction: row; flex-wrap: wrap; - margin-top: 2rem; + margin-top: 0.5rem; padding: 3rem 2rem; padding-bottom: 2rem; diff --git a/tsconfig.json b/tsconfig.json index 7b1d3c6..9bf382d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "ES2020", "lib": [ "dom", "dom.iterable", diff --git a/yarn.lock b/yarn.lock index 5bfd634..cf0944b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -323,7 +323,7 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": +"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.4", "@babel/parser@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== @@ -2253,7 +2253,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -3471,16 +3471,6 @@ dependencies: "@typescript-eslint/utils" "5.62.0" -"@typescript-eslint/parser@^4.5.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" - integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== - dependencies: - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - debug "^4.3.1" - "@typescript-eslint/parser@^5.5.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" @@ -3491,14 +3481,6 @@ "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" - integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== - dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" @@ -3517,29 +3499,11 @@ debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" - integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== - "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" - integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== - dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" - "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" @@ -3567,14 +3531,6 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" - integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== - dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" - "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" @@ -3588,6 +3544,85 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@vue/compiler-core@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.27.tgz#e69060f4b61429fe57976aa5872cfa21389e4d91" + integrity sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg== + dependencies: + "@babel/parser" "^7.24.4" + "@vue/shared" "3.4.27" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.0" + +"@vue/compiler-dom@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz#d51d35f40d00ce235d7afc6ad8b09dfd92b1cc1c" + integrity sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw== + dependencies: + "@vue/compiler-core" "3.4.27" + "@vue/shared" "3.4.27" + +"@vue/compiler-sfc@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz#399cac1b75c6737bf5440dc9cf3c385bb2959701" + integrity sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA== + dependencies: + "@babel/parser" "^7.24.4" + "@vue/compiler-core" "3.4.27" + "@vue/compiler-dom" "3.4.27" + "@vue/compiler-ssr" "3.4.27" + "@vue/shared" "3.4.27" + estree-walker "^2.0.2" + magic-string "^0.30.10" + postcss "^8.4.38" + source-map-js "^1.2.0" + +"@vue/compiler-ssr@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz#2a8ecfef1cf448b09be633901a9c020360472e3d" + integrity sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw== + dependencies: + "@vue/compiler-dom" "3.4.27" + "@vue/shared" "3.4.27" + +"@vue/reactivity@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.27.tgz#6ece72331bf719953f5eaa95ec60b2b8d49e3791" + integrity sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA== + dependencies: + "@vue/shared" "3.4.27" + +"@vue/runtime-core@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.27.tgz#1b6e1d71e4604ba7442dd25ed22e4a1fc6adbbda" + integrity sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA== + dependencies: + "@vue/reactivity" "3.4.27" + "@vue/shared" "3.4.27" + +"@vue/runtime-dom@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz#fe8d1ce9bbe8921d5dd0ad5c10df0e04ef7a5ee7" + integrity sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q== + dependencies: + "@vue/runtime-core" "3.4.27" + "@vue/shared" "3.4.27" + csstype "^3.1.3" + +"@vue/server-renderer@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.27.tgz#3306176f37e648ba665f97dda3ce705687be63d2" + integrity sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA== + dependencies: + "@vue/compiler-ssr" "3.4.27" + "@vue/shared" "3.4.27" + +"@vue/shared@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.27.tgz#f05e3cd107d157354bb4ae7a7b5fc9cf73c63b50" + integrity sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA== + "@walletconnect/core@2.11.1": version "2.11.1" resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.11.1.tgz#da2be26b8b6514c74f06dc9a5ffb450bdec3456d" @@ -3866,104 +3901,104 @@ "@walletconnect/window-getters" "^1.0.1" tslib "1.14.1" -"@web3modal/common@4.1.11": - version "4.1.11" - resolved "https://registry.yarnpkg.com/@web3modal/common/-/common-4.1.11.tgz#74fe5e870c0cccac10fe6d5fed57f307877beee8" - integrity sha512-zcoaixcI3dLC/D0QlhpT8MNCd717O1/3r1AemC5/9Wbk2F+YKXkzJZHmWlXoTvlTw9DH07rJzs9YTPxFyn855w== +"@web3modal/common@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@web3modal/common/-/common-4.1.0.tgz#1a55872b39895896639c0ced2b5262fb48cb21bd" + integrity sha512-9BUoIYEEW2Zf69OYLculsdhjjqNkXho3gN7HkKyDJ2T1NVnMkf+YuSJwaQGGK4TLR+y+IiSkvYqPHJFXJXKYVg== dependencies: - bignumber.js "9.1.2" dayjs "1.11.10" -"@web3modal/core@4.1.11": - version "4.1.11" - resolved "https://registry.yarnpkg.com/@web3modal/core/-/core-4.1.11.tgz#7dbc7ab82a98df8feb9033c2ee3ac853e6135fcc" - integrity sha512-e475IIWywEtgH1CCB2Pl1C/wgPu0NzAvtTMOPSGNoHsw1ID2n6j/o4CURQb2HJjOoYQjTKKVkzXa44vFh2p9xw== +"@web3modal/core@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@web3modal/core/-/core-4.1.0.tgz#023edca66157e1b9328e78ff3d991cd43c7122bf" + integrity sha512-MJG8djPg0eMKTLjDMvYcoVay4u5t3CuhRkTYuKr5EZA0xKhf5m0s/toblYGP059ZkuD21qO7hLz/CmyeBqusUg== dependencies: - "@web3modal/common" "4.1.11" - "@web3modal/wallet" "4.1.11" + "@web3modal/common" "4.1.0" + "@web3modal/wallet" "4.1.0" valtio "1.11.2" -"@web3modal/ethers5@^4.1.11": - version "4.1.11" - resolved "https://registry.yarnpkg.com/@web3modal/ethers5/-/ethers5-4.1.11.tgz#47be127aa1ac973a96538347724c813b22198723" - integrity sha512-Z+GQs855tNi0QXfJ4Hryl4APQG1Tw8IoJ5XXgGWQVMcrJPRO1iRJdfoM1Bib1XdzvBkMTTkkNbGKC+elXR1rMg== +"@web3modal/ethers5@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@web3modal/ethers5/-/ethers5-4.1.0.tgz#2ed4747d4301dbb108ce4804199f06c2900efe26" + integrity sha512-QfEe5PSOcH/2UFw6tyn8UM67IB4FdUCJkC4AWIg2kAq+na/SgRFLGod89HDIi7gTYePn1ahwL2roMejL8KeH7Q== dependencies: "@coinbase/wallet-sdk" "3.9.1" "@walletconnect/ethereum-provider" "2.11.1" - "@web3modal/polyfills" "4.1.11" - "@web3modal/scaffold" "4.1.11" - "@web3modal/scaffold-react" "4.1.11" - "@web3modal/scaffold-utils" "4.1.11" - "@web3modal/scaffold-vue" "4.1.11" - "@web3modal/siwe" "4.1.11" + "@web3modal/polyfills" "4.1.0" + "@web3modal/scaffold" "4.1.0" + "@web3modal/scaffold-react" "4.1.0" + "@web3modal/scaffold-utils" "4.1.0" + "@web3modal/scaffold-vue" "4.1.0" valtio "1.11.2" + optionalDependencies: + "@web3modal/siwe" "4.1.0" + react ">=17" + react-dom ">=17" + vue ">=3" -"@web3modal/polyfills@4.1.11": - version "4.1.11" - resolved "https://registry.yarnpkg.com/@web3modal/polyfills/-/polyfills-4.1.11.tgz#ab5b98b5594d4d36cb3fe11eec68b84f303c2282" - integrity sha512-+aMmjGrLCKLo4gVAdWgFdOX2ZjExciSLw/YlZ01wLO8Yj3bZbCZ7sjBc9xndHOVMK0QyUzBtpCOpYMJzi+59jg== +"@web3modal/polyfills@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@web3modal/polyfills/-/polyfills-4.1.0.tgz#2d0d61b74faf202498c548722cfd21b27028fb27" + integrity sha512-TdSeTjtmsOHt/P76bxokelCd5h3bNgDZsy1ucjJPCKVkLjp/eSsLaYOjqENDLi+bOMDNn69x1UtDVHbfaLJZFw== dependencies: buffer "6.0.3" -"@web3modal/scaffold-react@4.1.11": - version "4.1.11" - resolved "https://registry.yarnpkg.com/@web3modal/scaffold-react/-/scaffold-react-4.1.11.tgz#67c17cda7bcdbb1a17c99dc62dfabaf5930ad751" - integrity sha512-vouJHj77ZNKvR/Uyb3Hfc2UFSA4ZrrHmA0vbioCbgIh+V1rYT5XcAZDEu4AAo1qJ5NBRU1pkClVwAmQuWGY43w== +"@web3modal/scaffold-react@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold-react/-/scaffold-react-4.1.0.tgz#c7cf1b1f88ee40c482c249f4e544fc445a60a5c7" + integrity sha512-Xj01CeFYMLt6POGuG7cSNGe4qpJKzZJ5gCgBSHWiB7I4c1Lhnl3UyX52UY6DHBNoFMiMm/rSa8LqYmtQ3FimdA== dependencies: - "@web3modal/scaffold" "4.1.11" + "@web3modal/scaffold" "4.1.0" -"@web3modal/scaffold-utils@4.1.11": - version "4.1.11" - resolved "https://registry.yarnpkg.com/@web3modal/scaffold-utils/-/scaffold-utils-4.1.11.tgz#54511d896bc7bfe7bb651da4a9cd2507498af311" - integrity sha512-nsS9yK5tp1N/VfecLLPc8H/dGJCzn0jElWjRS92VfGPhOSiEh5PIrPyCl9o6wUZsp4fH1YUsoSY2EFpPsuCWgw== +"@web3modal/scaffold-utils@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold-utils/-/scaffold-utils-4.1.0.tgz#3ae82324c071983ee0445b2ac9fffc598816a9ac" + integrity sha512-WZuUI6tYmCBb5D3vKXNJVju9WFMipCSLMKPklfasuuLSexSsLE01INT6LnWdEANtGQ6rMezsK3j8yEBM4h9FhQ== dependencies: - "@web3modal/core" "4.1.11" - "@web3modal/polyfills" "4.1.11" + "@web3modal/core" "4.1.0" + "@web3modal/polyfills" "4.1.0" valtio "1.11.2" -"@web3modal/scaffold-vue@4.1.11": - version "4.1.11" - resolved "https://registry.yarnpkg.com/@web3modal/scaffold-vue/-/scaffold-vue-4.1.11.tgz#e1b5677c02532fabc1b5dca45c25be5e730dee0f" - integrity sha512-PmIfD2TlKkZZa6V0sqwDtZ7t62BEk5JjCHd380QaZwGTbPEwS99leTWLKBTaxAPShK2p7+aj2Txss63wIXLRFg== +"@web3modal/scaffold-vue@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold-vue/-/scaffold-vue-4.1.0.tgz#b4f7ce8ef145f0712a57376f483e37b1f4b22d84" + integrity sha512-oe4HTasDjAVD2hDmmOJWS/8FaKTm1Vrt6zDG9Fj6tb/hF4i63EeWj0kNBQ9zL6bQsVfuo6wPzhDRxjBL+W9sMg== dependencies: - "@web3modal/scaffold" "4.1.11" + "@web3modal/scaffold" "4.1.0" -"@web3modal/scaffold@4.1.11": - version "4.1.11" - resolved "https://registry.yarnpkg.com/@web3modal/scaffold/-/scaffold-4.1.11.tgz#13e18823158357f90e10f3cd83cf615d2ac59daf" - integrity sha512-n8bP3cJNQxV8OD3s8bSj8QDbZvjn8a1Ui81jo2a3rIxOUAlD/cKRM8ivmNxiUdBMae8GP5CLiWtkIptmSLw40Q== +"@web3modal/scaffold@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold/-/scaffold-4.1.0.tgz#094ef1831d48ae9881d278778ae4d35d2054f73e" + integrity sha512-BZdE+T65jmm1hLwXjayZZVGim4LU8acUuKUbzvnHHQrop/oaM4cQbAhRdLll6xpWK4hDfvb+Ep9PBu/1IiLDHg== dependencies: - "@web3modal/common" "4.1.11" - "@web3modal/core" "4.1.11" - "@web3modal/siwe" "4.1.11" - "@web3modal/ui" "4.1.11" - "@web3modal/wallet" "4.1.11" + "@web3modal/common" "4.1.0" + "@web3modal/core" "4.1.0" + "@web3modal/ui" "4.1.0" lit "3.1.0" + optionalDependencies: + "@web3modal/siwe" "4.1.0" -"@web3modal/siwe@4.1.11": - version "4.1.11" - resolved "https://registry.yarnpkg.com/@web3modal/siwe/-/siwe-4.1.11.tgz#def52403ec332b4600c8c18134ef0efb658abe5c" - integrity sha512-gndcNA351mkAR0wUsO4dLS9CbpcFo+AQ2CUXF0Jx83DwaBStCVsX3yllfnYKh/gpVetF3B48mRUt9TTTJJ79dA== +"@web3modal/siwe@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@web3modal/siwe/-/siwe-4.1.0.tgz#bf2dcb8e5a83f6803189cfdef2cf29c6c5081a00" + integrity sha512-tFxIA2DyJ6160heEsIyD7sJrBelAsoUdtM8R1yi2Z3+u3pu6I8x2DxnYOGRMetvu+nf6dUFYWoLcJR5PK5Y2Xg== dependencies: - "@web3modal/core" "4.1.11" - "@web3modal/scaffold-utils" "4.1.11" - lit "3.1.0" - valtio "1.11.2" + "@web3modal/core" "4.1.0" + "@web3modal/scaffold-utils" "4.1.0" -"@web3modal/ui@4.1.11": - version "4.1.11" - resolved "https://registry.yarnpkg.com/@web3modal/ui/-/ui-4.1.11.tgz#48a6e57bae1614414c3627d4ba9712441fa61ef0" - integrity sha512-lentHZvUpNjVasvNI8/jrVPIAV1M5zJKZ4Q4AeYwUJdEtlRon1uq10MRylmvlZAjWb98U130uJy245Fz87Th/w== +"@web3modal/ui@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@web3modal/ui/-/ui-4.1.0.tgz#0e182f22130b16c0958c43608320266ac2e859b4" + integrity sha512-Cz2bWrLz0yMjxq1IrHFlLcpdHEqFuo52KYPPgvKqfILj57JRsaPyjzGUYn3OU5g6VMm4rxTJJGyntFanRuuuiA== dependencies: lit "3.1.0" qrcode "1.5.3" -"@web3modal/wallet@4.1.11": - version "4.1.11" - resolved "https://registry.yarnpkg.com/@web3modal/wallet/-/wallet-4.1.11.tgz#07518f9737151abf1d55fae398b523dc99ab7a41" - integrity sha512-6eJSpNcrBxufJFEQu9+ZOMUZxPqa8438RvfYKCU9nLXwoBtweo6ecpQw2yhXDlrfG+uJZhFabtPxROabn2M8Kg== +"@web3modal/wallet@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@web3modal/wallet/-/wallet-4.1.0.tgz#0527323c213b0b4d7c6fa88287a1d01d43c30859" + integrity sha512-HDh+sJ/bVOMJ+xiCqFjr4cMWwJbaqy3E9/dzukMuHVTsJhrXWObrWi5UPNB5gKb4c8/SPSd9Y81zKhG9FL2lOg== dependencies: - "@web3modal/polyfills" "4.1.11" zod "3.22.4" "@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": @@ -4309,11 +4344,6 @@ anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -4735,7 +4765,7 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -bignumber.js@9.1.2, bignumber.js@^9.0.1: +bignumber.js@^9.0.1: 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== @@ -5664,7 +5694,7 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^3.0.2: +csstype@^3.0.2, csstype@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -5887,11 +5917,6 @@ diff-sequences@^29.6.3: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - dijkstrajs@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23" @@ -6149,6 +6174,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -6512,7 +6542,7 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: +eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== @@ -6635,6 +6665,11 @@ estree-walker@^1.0.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -7433,7 +7468,7 @@ globalthis@^1.0.3: define-properties "^1.2.1" gopd "^1.0.1" -globby@^11.0.3, globby@^11.0.4, globby@^11.1.0: +globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -9357,6 +9392,13 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" +magic-string@^0.30.10: + version "0.30.10" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" + integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -9371,11 +9413,6 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -10797,7 +10834,7 @@ postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.4: +postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.4: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -11117,7 +11154,7 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@^18.0.0: +react-dom@>=17, react-dom@^18.0.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -11290,7 +11327,7 @@ react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" -react@^18.0.0: +react@>=17, react@^18.0.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== @@ -12017,7 +12054,7 @@ source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.20: +source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -12652,17 +12689,6 @@ ts-invariant@^0.10.3: dependencies: tslib "^2.1.0" -ts-node@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.0.0.tgz#e7699d2a110cc8c0d3b831715e417688683460b3" - integrity sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg== - dependencies: - arg "^4.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - tsconfig-paths@^3.15.0: version "3.15.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" @@ -12788,10 +12814,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.5.tgz#ae9dddfd1069f1cb5beb3ef3b2170dd7c1332389" - integrity sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ== +typescript@^5.2.2: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== ufo@^1.4.0, ufo@^1.5.3: version "1.5.3" @@ -13051,6 +13077,17 @@ void-elements@3.1.0: resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== +vue@>=3: + version "3.4.27" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.27.tgz#40b7d929d3e53f427f7f5945386234d2854cc2a1" + integrity sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA== + dependencies: + "@vue/compiler-dom" "3.4.27" + "@vue/compiler-sfc" "3.4.27" + "@vue/runtime-dom" "3.4.27" + "@vue/server-renderer" "3.4.27" + "@vue/shared" "3.4.27" + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -13698,11 +13735,6 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 773b2c88e9253644e401ef8237200dd91f434e14 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 15 May 2024 19:19:38 -0600 Subject: [PATCH 272/278] fixing upgrade issues --- src/App.tsx | 2 - src/components/Summary/Summary.tsx | 8 +-- src/components/Vaults/index.tsx | 10 ++-- src/hooks/useBalances.tsx | 51 +++++++++---------- src/hooks/useNetworks.tsx | 2 +- src/hooks/usePrices.tsx | 54 ++++---------------- src/hooks/usePrices2.tsx | 80 +++++------------------------- src/utils/utils.tsx | 38 +------------- 8 files changed, 58 insertions(+), 187 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 1fa29d5..c8ff06c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -134,8 +134,6 @@ const App = () => { const rewards = hooks.useRewards(); const mushroomNft = hooks.useMushroomNft(); const match = useRouteMatch(); - setMulticallAddress(NETWORKS.optimism.chainId, "0xD0E99f15B24F265074747B2A1444eB02b9E30422"); - setMulticallAddress(NETWORKS.okovan.chainId, "0x4EFBb8983D5C18A8b6B5084D936B7D12A0BEe2c9"); setMulticallAddress(NETWORKS.arbitrum.chainId, "0x842eC2c7D803033Edf55E478F461FC547Bc54EB2"); setMulticallAddress( NETWORKS.arbitrum_goerli.chainId, diff --git a/src/components/Summary/Summary.tsx b/src/components/Summary/Summary.tsx index e947e16..82136f1 100644 --- a/src/components/Summary/Summary.tsx +++ b/src/components/Summary/Summary.tsx @@ -42,15 +42,9 @@ const Summary = ({ signerAddress, signerChainId }: props) => { if (signerChainId === NETWORKS.arbitrum.chainId) { return chains[1]; } - return chains[2]; - } - if (signerChainId === NETWORKS.goerli.chainId) { return chains[0]; } - if (signerChainId === NETWORKS.arbitrum_goerli.chainId) { - return chains[1]; - } - return chains[2]; + return chains[0]; }; const [currentChain, setCurrentChain] = useState(getDefaultChain()); diff --git a/src/components/Vaults/index.tsx b/src/components/Vaults/index.tsx index 21a159d..f468728 100644 --- a/src/components/Vaults/index.tsx +++ b/src/components/Vaults/index.tsx @@ -1,4 +1,5 @@ import React, { useContext, useEffect, useState } from "react"; +import { useWeb3ModalAccount } from "@web3modal/ethers5/react"; import Monitoring from "./monitoring/index"; import MonitoringArb from "./monitoring/index2"; import Vault from "./vault/index"; @@ -6,7 +7,9 @@ import { signerContext, networkContext } from "../../state"; import { VaultToUpdateType } from "./types"; import { isArbitrum } from "../../utils/utils"; + const Vaults = () => { + const { address: userAccount } = useWeb3ModalAccount() const signer = useContext(signerContext); const currentNetwork = useContext(networkContext); const [currentAddress, setCurrentAddress] = useState(""); @@ -31,15 +34,14 @@ const Vaults = () => { useEffect( () => { const load = async () => { - if (signer && signer.signer) { - const cAddress = await signer.signer.getAddress(); - setCurrentAddress(cAddress); + if (signer && signer.signer && userAccount) { + setCurrentAddress(userAccount?.toString()); } }; load(); }, // eslint-disable-next-line - [signer.signer] + [signer.signer, userAccount] ); if (isMinting) { diff --git a/src/hooks/useBalances.tsx b/src/hooks/useBalances.tsx index 8d72512..b5e64d3 100644 --- a/src/hooks/useBalances.tsx +++ b/src/hooks/useBalances.tsx @@ -22,8 +22,8 @@ export const useBalances = ( }); const loadBalanceArbitrum = async () => { - const jpegzBalanceCall = await arbitrumContracts.jpegzTokenRead?.balanceOf(address); - const jpegzSupplyCall = await arbitrumContracts.jpegzTokenRead?.totalSupply(); + const jpegzBalanceCall = arbitrumContracts.jpegzTokenRead?.balanceOf(address); + const jpegzSupplyCall = arbitrumContracts.jpegzTokenRead?.totalSupply(); // @ts-ignore const [jpegzBalance, jpegzSupply] = await ethcallProvider?.all([ jpegzBalanceCall, @@ -39,50 +39,53 @@ export const useBalances = ( }; const loadBalanceEthereum = async () => { - const tcapBalanceCall = await ethereumContracts.tcapTokenRead?.balanceOf(address); - const tcapSupplyCall = await ethereumContracts.tcapTokenRead?.totalSupply(); - const ctxBalanceCall = await ethereumContracts.ctxTokenRead?.balanceOf(address); + try { + const tcapBalanceCall = ethereumContracts.tcapTokenRead?.balanceOf(address); + const tcapSupplyCall = ethereumContracts.tcapTokenRead?.totalSupply(); + const ctxBalanceCall = ethereumContracts.ctxTokenRead?.balanceOf(address); - // @ts-ignore - const [tcapBalance, tcapSupply, ctxBalance] = await ethcallProvider?.all([ - tcapBalanceCall, - tcapSupplyCall, - ctxBalanceCall, - ]); + // @ts-ignore + const [tcapBalance, tcapSupply, ctxBalance] = await ethcallProvider?.all([ + tcapBalanceCall, + tcapSupplyCall, + ctxBalanceCall, + ]); - setBalances({ - tcapBalance: ethers.utils.formatEther(tcapBalance), - jpegzBalance: "0", - ctxBalance: ethers.utils.formatEther(ctxBalance), - tcapSupplly: ethers.utils.formatEther(tcapSupply), - jpegzSupplly: "0", - }); + setBalances({ + tcapBalance: ethers.utils.formatEther(tcapBalance), + jpegzBalance: "0", + ctxBalance: ethers.utils.formatEther(ctxBalance), + tcapSupplly: ethers.utils.formatEther(tcapSupply), + jpegzSupplly: "0", + }); + } catch (error: any) {} }; const loadBalance = async () => { try { - if (arbitrumContracts && ethereumContracts) { + if (arbitrumContracts && ethereumContracts && ethcallProvider) { if (isArbitrum(chainId) && validOracles(chainId, arbitrumContracts)) { await loadBalanceArbitrum(); } if (isInLayer1(chainId) && validOracles(chainId, ethereumContracts)) { await loadBalanceEthereum(); } - } - setLoadingBalances(false); + } } catch (error: any) { } + setLoadingBalances(false); }; const loadIndexSupply = async () => { try { if (ethcallProvider) { let indexTokenRead = ethereumContracts.tcapTokenRead; + if (isArbitrum(chainId)) { indexTokenRead = arbitrumContracts.jpegzTokenRead; } if (indexTokenRead) { - const indexSupplyCall = await indexTokenRead?.totalSupply(); + const indexSupplyCall = indexTokenRead?.totalSupply(); const indexSupply = await ethcallProvider?.all([indexSupplyCall]); const indexSupplyVal = ethers.utils.formatEther(indexSupply); @@ -95,9 +98,7 @@ export const useBalances = ( }); } } - } catch (error: any) { - - } + } catch (error: any) {} }; useEffect( diff --git a/src/hooks/useNetworks.tsx b/src/hooks/useNetworks.tsx index d414ed0..062552b 100644 --- a/src/hooks/useNetworks.tsx +++ b/src/hooks/useNetworks.tsx @@ -2,7 +2,7 @@ import React, { useState } from "react"; import { INetworkContext } from "../state"; export const useNetworks = (): INetworkContext => { - const [chainId, setChainId] = useState(); + const [chainId, setChainId] = useState(1); const [name, setName] = useState(); const [wethAddress, setWETHAddress] = useState(""); const [daiAddress, setDAIAddress] = useState(""); diff --git a/src/hooks/usePrices.tsx b/src/hooks/usePrices.tsx index c9e1564..09d19cc 100644 --- a/src/hooks/usePrices.tsx +++ b/src/hooks/usePrices.tsx @@ -1,7 +1,7 @@ import { useContext, useEffect, useState } from "react"; import { ethers, BigNumber } from "ethers"; import { oraclesContext, networkContext, signerContext } from "../state/index"; -import { isArbitrum, isInLayer1, isOptimism, isPolygon, validOracles } from "../utils/utils"; +import { isArbitrum, isInLayer1, validOracles } from "../utils/utils"; import { OraclePricesType } from "./types"; export const usePrices = (): [OraclePricesType, boolean] => { @@ -27,16 +27,16 @@ export const usePrices = (): [OraclePricesType, boolean] => { const loadPrices = async () => { if (signer && oracles && validOracles(currentNetwork.chainId || 1, oracles)) { - const daiOraclePriceCall = await oracles.daiOracleRead?.getLatestAnswer(); + const daiOraclePriceCall = oracles.daiOracleRead?.getLatestAnswer(); const ethcalls = [daiOraclePriceCall]; if (isInLayer1(currentNetwork.chainId)) { - const tcapOraclePriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const aaveOraclePriceCall = await oracles.aaveOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const usdcOraclePriceCall = await oracles.usdcOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); + const tcapOraclePriceCall = oracles.tcapOracleRead?.getLatestAnswer(); + const wethOraclePriceCall = oracles.wethOracleRead?.getLatestAnswer(); + const aaveOraclePriceCall = oracles.aaveOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = oracles.linkOracleRead?.getLatestAnswer(); + const usdcOraclePriceCall = oracles.usdcOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = oracles.wbtcOracleRead?.getLatestAnswer(); ethcalls.push(tcapOraclePriceCall); ethcalls.push(wethOraclePriceCall); ethcalls.push(aaveOraclePriceCall); @@ -44,29 +44,9 @@ export const usePrices = (): [OraclePricesType, boolean] => { ethcalls.push(usdcOraclePriceCall); ethcalls.push(wbtcOraclePriceCall); } - if (isOptimism(currentNetwork.chainId)) { - const tcapOraclePriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await oracles.linkOracleRead?.getLatestAnswer(); - const snxOraclePriceCall = await oracles.snxOracleRead?.getLatestAnswer(); - const uniOraclePriceCall = await oracles.uniOracleRead?.getLatestAnswer(); - ethcalls.push(tcapOraclePriceCall); - ethcalls.push(wethOraclePriceCall); - ethcalls.push(linkOraclePriceCall); - ethcalls.push(snxOraclePriceCall); - ethcalls.push(uniOraclePriceCall); - } - if (isPolygon(currentNetwork.chainId)) { - const tcapOraclePriceCall = await oracles.tcapOracleRead?.getLatestAnswer(); - const maticOraclePriceCall = await oracles.maticOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await oracles.wbtcOracleRead?.getLatestAnswer(); - ethcalls.push(tcapOraclePriceCall); - ethcalls.push(maticOraclePriceCall); - ethcalls.push(wbtcOraclePriceCall); - } if (isArbitrum(currentNetwork.chainId)) { - const jpegzPriceCall = await oracles.jpegzOracleRead?.getLatestAnswer(); - const wethOraclePriceCall = await oracles.wethOracleRead?.getLatestAnswer(); + const jpegzPriceCall = oracles.jpegzOracleRead?.getLatestAnswer(); + const wethOraclePriceCall = oracles.wethOracleRead?.getLatestAnswer(); ethcalls.push(jpegzPriceCall); ethcalls.push(wethOraclePriceCall); } @@ -94,20 +74,6 @@ export const usePrices = (): [OraclePricesType, boolean] => { usdcOraclePrice, wbtcOraclePrice, ] = await signer.ethcallProvider?.all(ethcalls); - } else if (isOptimism(currentNetwork.chainId)) { - // @ts-ignore - [ - daiOraclePrice, - tcapOraclePrice, - wethOraclePrice, - linkOraclePrice, - snxOraclePrice, - uniOraclePrice, - ] = await signer.ethcallProvider?.all(ethcalls); - } else if (isPolygon(currentNetwork.chainId)) { - // @ts-ignore - [daiOraclePrice, tcapOraclePrice, maticOraclePrice, wbtcOraclePrice] = - await signer.ethcallProvider?.all(ethcalls); } else { // @ts-ignore [daiOraclePrice, jpegzOraclePrice, wethOraclePrice] = await signer.ethcallProvider?.all( diff --git a/src/hooks/usePrices2.tsx b/src/hooks/usePrices2.tsx index 271996b..00a6306 100644 --- a/src/hooks/usePrices2.tsx +++ b/src/hooks/usePrices2.tsx @@ -1,8 +1,8 @@ import { useContext, useEffect, useState } from "react"; import { ethers, BigNumber } from "ethers"; import { Provider } from "ethers-multicall"; -import { arbitrumContext, ethereumContext, optimismContext } from "../state/index"; -import { isArbitrum, isInLayer1, isOptimism, validOracles } from "../utils/utils"; +import { arbitrumContext, ethereumContext } from "../state/index"; +import { isArbitrum, isInLayer1, validOracles } from "../utils/utils"; import { OraclePricesType } from "./types"; export const usePrices2 = ( @@ -11,7 +11,6 @@ export const usePrices2 = ( ): [OraclePricesType, boolean] => { const arbitrumContracts = useContext(arbitrumContext); const ethereumContracts = useContext(ethereumContext); - const optimismContracts = useContext(optimismContext); const [loadingPrices, setLoadingPrices] = useState(true); const [oraclePrices, setOraclePrices] = useState({ jpegzOraclePrice: "0", @@ -30,9 +29,9 @@ export const usePrices2 = ( }); const loadPricesArbitrum = async () => { - const jpegzPriceCall = await arbitrumContracts.jpegzOracleRead?.getLatestAnswer(); - const wethOraclePriceCall = await arbitrumContracts.wethOracleRead?.getLatestAnswer(); - const daiOraclePriceCall = await arbitrumContracts.daiOracleRead?.getLatestAnswer(); + const jpegzPriceCall = arbitrumContracts.jpegzOracleRead?.getLatestAnswer(); + const wethOraclePriceCall = arbitrumContracts.wethOracleRead?.getLatestAnswer(); + const daiOraclePriceCall = arbitrumContracts.daiOracleRead?.getLatestAnswer(); let jpegzOraclePrice = BigNumber.from(0); let wethOraclePrice = BigNumber.from(0); @@ -54,13 +53,13 @@ export const usePrices2 = ( }; const loadPricesEthereum = async () => { - const tcapPriceCall = await ethereumContracts.tcapOracleRead?.getLatestAnswer(); - const wethOraclePriceCall = await ethereumContracts.wethOracleRead?.getLatestAnswer(); - const daiOraclePriceCall = await ethereumContracts.daiOracleRead?.getLatestAnswer(); - const aaveOraclePriceCall = await ethereumContracts.aaveOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await ethereumContracts.linkOracleRead?.getLatestAnswer(); - const wbtcOraclePriceCall = await ethereumContracts.wbtcOracleRead?.getLatestAnswer(); - const usdcOraclePriceCall = await ethereumContracts.usdcOracleRead?.getLatestAnswer(); + const tcapPriceCall = ethereumContracts.tcapOracleRead?.getLatestAnswer(); + const wethOraclePriceCall = ethereumContracts.wethOracleRead?.getLatestAnswer(); + const daiOraclePriceCall = ethereumContracts.daiOracleRead?.getLatestAnswer(); + const aaveOraclePriceCall = ethereumContracts.aaveOracleRead?.getLatestAnswer(); + const linkOraclePriceCall = ethereumContracts.linkOracleRead?.getLatestAnswer(); + const wbtcOraclePriceCall = ethereumContracts.wbtcOracleRead?.getLatestAnswer(); + const usdcOraclePriceCall = ethereumContracts.usdcOracleRead?.getLatestAnswer(); let tcapOraclePrice = BigNumber.from(0); let wethOraclePrice = BigNumber.from(0); @@ -107,67 +106,14 @@ export const usePrices2 = ( }); }; - const loadPricesOptimism = async () => { - const tcapPriceCall = await optimismContracts.tcapOracleRead?.getLatestAnswer(); - const wethOraclePriceCall = await optimismContracts.wethOracleRead?.getLatestAnswer(); - const daiOraclePriceCall = await optimismContracts.daiOracleRead?.getLatestAnswer(); - const linkOraclePriceCall = await optimismContracts.linkOracleRead?.getLatestAnswer(); - const snxOraclePriceCall = await optimismContracts.snxOracleRead?.getLatestAnswer(); - const uniOraclePriceCall = await optimismContracts.uniOracleRead?.getLatestAnswer(); - - let tcapOraclePrice = BigNumber.from(0); - let wethOraclePrice = BigNumber.from(0); - let daiOraclePrice = BigNumber.from(0); - let linkOraclePrice = BigNumber.from(0); - let snxOraclePrice = BigNumber.from(0); - let uniOraclePrice = BigNumber.from(0); - - // @ts-ignore - [ - tcapOraclePrice, - wethOraclePrice, - daiOraclePrice, - linkOraclePrice, - snxOraclePrice, - uniOraclePrice, - ] = await ethcallProvider?.all([ - tcapPriceCall, - wethOraclePriceCall, - daiOraclePriceCall, - linkOraclePriceCall, - snxOraclePriceCall, - uniOraclePriceCall, - ]); - - const marketCap = tcapOraclePrice.mul(10000000000); - setOraclePrices({ - jpegzOraclePrice: "0", - jpegzMarketCap: "0", - tcapOraclePrice: ethers.utils.formatEther(tcapOraclePrice), - tcapMarketCap: ethers.utils.formatEther(marketCap), - wethOraclePrice: ethers.utils.formatEther(wethOraclePrice.mul(10000000000)), - daiOraclePrice: ethers.utils.formatEther(daiOraclePrice.mul(10000000000)), - aaveOraclePrice: "0", - linkOraclePrice: ethers.utils.formatEther(linkOraclePrice.mul(10000000000)), - uniOraclePrice: ethers.utils.formatEther(uniOraclePrice.mul(10000000000)), - snxOraclePrice: ethers.utils.formatEther(snxOraclePrice.mul(10000000000)), - maticOraclePrice: "0", - wbtcOraclePrice: "0", - usdcOraclePrice: "0", - }); - }; - const loadPrices = async () => { - if (arbitrumContracts && ethereumContracts && optimismContracts) { + if (arbitrumContracts && ethereumContracts) { if (isArbitrum(chainId) && validOracles(chainId, arbitrumContracts)) { await loadPricesArbitrum(); } if (isInLayer1(chainId) && validOracles(chainId, ethereumContracts)) { await loadPricesEthereum(); } - if (isOptimism(chainId) && validOracles(chainId, optimismContracts)) { - await loadPricesOptimism(); - } setLoadingPrices(false); } }; diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index e4119bc..be9a058 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -99,8 +99,7 @@ export const sendNotification = async (
); toast(toastConstant, { - // @ts-ignore - position: toast.POSITION.TOP_RIGHT, + position: "top-right", autoClose: duration, hideProgressBar: true, delay, @@ -330,35 +329,15 @@ export const getDefaultProvider = (chainId: number | undefined) => { provider = new ethers.providers.InfuraProvider("arbitrum", { infura: process.env.REACT_APP_INFURA_ID, }); - } else if (chainId === NETWORKS.arbitrum_goerli.chainId) { - provider = new ethers.providers.InfuraProvider("arbitrum-goerli", { - infura: process.env.REACT_APP_INFURA_ID, - }); - } else if (chainId === NETWORKS.okovan.chainId) { - provider = ethers.getDefaultProvider(process.env.REACT_APP_ALCHEMY_URL_OKOVAN); - } else if (chainId === NETWORKS.optimism.chainId) { - provider = ethers.getDefaultProvider(NETWORKS.optimism.infuraRpcUrl); } else { let alchemyKey; switch (chainId) { case NETWORKS.mainnet.chainId: alchemyKey = process.env.REACT_APP_ALCHEMY_KEY; break; - case NETWORKS.goerli.chainId: - alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_GOERLI; - break; case NETWORKS.arbitrum.chainId: alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_ARBITRUM; break; - case NETWORKS.arbitrum_goerli.chainId: - alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_ARBITRUM_GOERLI; - break; - case NETWORKS.polygon.chainId: - alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_POLYGON; - break; - case NETWORKS.mumbai.chainId: - alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_MUMBAI; - break; default: alchemyKey = process.env.REACT_APP_ALCHEMY_KEY; break; @@ -417,21 +396,6 @@ export const validOracles = (chainId: number, oracles: any): boolean => { !isUndefined(oracles.wbtcOracleRead); } - if (isOptimism(chainId)) { - valid = - valid && - !isUndefined(oracles.tcapOracleRead) && - !isUndefined(oracles.wethOracleRead) && - !isUndefined(oracles.daiOracleRead) && - !isUndefined(oracles.linkOracleRead) && - !isUndefined(oracles.snxOracleRead) && - !isUndefined(oracles.uniOracleRead); - } - - if (isPolygon(chainId)) { - valid = valid && !isUndefined(oracles.maticOracle) && !isUndefined(oracles.maticOracleRead); - } - if (isArbitrum(chainId)) { valid = valid && !isUndefined(oracles.jpegzOracleRead) && !isUndefined(oracles.wethOracleRead); } From e41b69702c2ef7531b044004c3e73d4c1477fcfe Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 16 May 2024 19:51:23 -0600 Subject: [PATCH 273/278] fixing providers issue --- src/App.tsx | 43 +++-------------------- src/components/Governance/Delegators.tsx | 1 + src/components/Summary/Indexes.tsx | 28 ++++++++------- src/components/Summary/index.tsx | 44 ++---------------------- src/hooks/useBalances.tsx | 3 +- src/utils/utils.tsx | 15 +------- src/utils/web3ModalConfig.tsx | 36 +++++++++++++++++++ 7 files changed, 61 insertions(+), 109 deletions(-) create mode 100644 src/utils/web3ModalConfig.tsx diff --git a/src/App.tsx b/src/App.tsx index c8ff06c..24e2ee7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,7 +5,7 @@ import { ethers } from "ethers"; import { Provider, Contract, setMulticallAddress } from "ethers-multicall"; import { ToastContainer } from "react-toastify"; import { ApolloProvider, ApolloClient, InMemoryCache } from "@apollo/client"; -import { createWeb3Modal, defaultConfig } from '@web3modal/ethers5/react' +import { createWeb3Modal } from '@web3modal/ethers5/react' import { useWeb3ModalProvider, useWeb3ModalAccount } from '@web3modal/ethers5/react' import "./i18n"; @@ -50,6 +50,7 @@ import { isGoerli, } from "./utils/utils"; import { GRAPHQL_ENDPOINT, NETWORKS } from "./utils/constants"; +import { arbitrum, mainnet, walletIds, web3ModalEthersConfig } from "./utils/web3ModalConfig"; const clientOracle = (graphqlEndpoint: string) => new ApolloClient({ @@ -60,47 +61,12 @@ const clientOracle = (graphqlEndpoint: string) => const projectId = process.env.REACT_APP_WALLET_CONNECT_ID || ""; -const mainnet = { - chainId: 1, - name: 'Ethereum', - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://cloudflare-eth.com' -} - -const arbitrum = { - chainId: 42161, - name: 'Arbitrum One', - currency: 'ETH', - explorerUrl: 'https://arbiscan.io/', - rpcUrl: 'https://arb1.arbitrum.io/' -} - -const metadata = { - name: 'Cryptex Finance V1', - description: 'Building innovative, open-source index tokens that empower the crypto and NFT community.', - url: 'https://cryptex.finance/', // origin must match your domain & subdomain - icons: ['https://avatars.mywebsite.com/'] -} - - -const ethersConfig = defaultConfig({ - metadata, - defaultChainId: 1, // used for the Coinbase SDK -}) - createWeb3Modal({ - ethersConfig, + ethersConfig: web3ModalEthersConfig, chains: [mainnet, arbitrum], projectId, themeMode: 'dark', - featuredWalletIds: [ - 'c57ca95b47569778a828d19178114f4db188b89b763c899ba0be274e97267d96', - '4622a2b2d6af1c9844944291e5e7351a6aa24cd7b23099efac1b2fd875da31a0', - 'fd20dc426fb37566d803205b19bbc1d4096b248ac04548e3cfb6b3a38bd033aa', - '1ae92b26df02f0abca6304df07debccd18262fdf5fe82daa81593582dac9a369', - '971e689d0a5be527bac79629b4ee9b925e82208e5168b733496a09c0faed0709' - ], + featuredWalletIds: walletIds, themeVariables: { '--w3m-font-family': "Nineteen Ninety Seven", '--w3m-accent': "#1d1d3c", @@ -750,7 +716,6 @@ const App = () => { useEffect(() => { async function loadProvider() { - // if (web3Modal.cachedProvider && !signer.signer) { if (isConnected) { if (!isLoadingContracts && walletProvider) { onConnectWallet(); diff --git a/src/components/Governance/Delegators.tsx b/src/components/Governance/Delegators.tsx index 2cf0017..835808b 100644 --- a/src/components/Governance/Delegators.tsx +++ b/src/components/Governance/Delegators.tsx @@ -135,6 +135,7 @@ const Delegators = ({ currentSignerAddress }: props) => { }) .then((response) => response.json()) .then((responseJson) => { + // console.log("responseJson: ", responseJson); buildKeeperInfo(responseJson, currentDelegators); }) .catch((error) => { diff --git a/src/components/Summary/Indexes.tsx b/src/components/Summary/Indexes.tsx index b701df4..f129c30 100644 --- a/src/components/Summary/Indexes.tsx +++ b/src/components/Summary/Indexes.tsx @@ -45,20 +45,22 @@ const Indexes = ({ currentChainId, ethCallProvider, balances, prices }: props) = }); if (!isArbitrum(currentChainId)) { - const reponse = await fetch( - "https://api.coingecko.com/api/v3/simple/price?".concat(urlParams.toString()), - { - method: "GET", - mode: "cors", - headers: { - "Content-Type": "application/json", - }, + try { + const reponse = await fetch( + "https://api.coingecko.com/api/v3/simple/price?".concat(urlParams.toString()), + { + method: "GET", + mode: "cors", + headers: { + "Content-Type": "application/json", + }, + } + ); + const resp = await reponse.json(); + if (resp) { + setIndexMarketPrice(resp["total-crypto-market-cap-token"].usd); } - ); - const resp = await reponse.json(); - if (resp) { - setIndexMarketPrice(resp["total-crypto-market-cap-token"].usd); - } + } catch (error) {} } else { setIndexMarketPrice("0"); } diff --git a/src/components/Summary/index.tsx b/src/components/Summary/index.tsx index 0b2d76c..6540304 100644 --- a/src/components/Summary/index.tsx +++ b/src/components/Summary/index.tsx @@ -1,11 +1,10 @@ import React, { useContext, useEffect, useState } from "react"; -// import { Spinner } from "react-bootstrap/esm/"; import { Contract } from "ethers-multicall"; import "../../styles/summary.scss"; import cryptexJson from "../../contracts/cryptex.json"; import UniV2Pair from "../../contracts/UniswapV2Pair.json"; -import { arbitrumContext, ethereumContext, optimismContext, signerContext } from "../../state"; -import { useArbitrum, useEthereum, useOptimism } from "../../hooks"; +import { arbitrumContext, ethereumContext, signerContext } from "../../state"; +import { useArbitrum, useEthereum } from "../../hooks"; import Features from "./Features"; import Summary from "./Summary"; import { NETWORKS } from "../../utils/constants"; @@ -14,7 +13,6 @@ const SummaryPage = () => { const signer = useContext(signerContext); const arbitrum = useArbitrum(); const ethereum = useEthereum(); - const optimism = useOptimism(); const [loading, setLoading] = useState(true); const [signerAddress, setSignerAddress] = useState(""); const [signerChainId, setSignerChainId] = useState( @@ -98,39 +96,6 @@ const SummaryPage = () => { } }; - const setOptimismContracts = () => { - let contracts; - if (process.env.REACT_APP_NETWORK_ID === "1") { - contracts = cryptexJson[10].optimism.contracts; - } else { - contracts = cryptexJson[69].okovan.contracts; - } - - const currentTcapTokenRead = new Contract(contracts.TCAP.address, contracts.TCAP.abi); - optimism.setCurrentTcapTokenRead(currentTcapTokenRead); - const currentTcapOracleRead = new Contract( - contracts.TCAPOracle.address, - contracts.TCAPOracle.abi - ); - optimism.setCurrentTcapOracleRead(currentTcapOracleRead); - const currentWethOracleRead = new Contract( - contracts.WETHOracle.address, - contracts.WETHOracle.abi - ); - optimism.setCurrentWethOracleRead(currentWethOracleRead); - const currentDaiOracleRead = new Contract(contracts.DAIOracle.address, contracts.DAIOracle.abi); - optimism.setCurrentDaiOracleRead(currentDaiOracleRead); - const currentLinkOracleRead = new Contract( - contracts.LinkOracle.address, - contracts.LinkOracle.abi - ); - optimism.setCurrentLinkOracleRead(currentLinkOracleRead); - const currentSnxOracleRead = new Contract(contracts.SNXOracle.address, contracts.SNXOracle.abi); - optimism.setCurrentSnxOracleRead(currentSnxOracleRead); - const currentUniOracleRead = new Contract(contracts.UNIOracle.address, contracts.UNIOracle.abi); - optimism.setCurrentUniOracleRead(currentUniOracleRead); - }; - useEffect(() => { const load = async () => { if (signer.signer) { @@ -139,7 +104,6 @@ const SummaryPage = () => { } setArbitrumContracts(); setEthereumContracts(); - setOptimismContracts(); setLoading(false); }; load(); @@ -152,9 +116,7 @@ const SummaryPage = () => { {!loading && ( - - - + )} diff --git a/src/hooks/useBalances.tsx b/src/hooks/useBalances.tsx index b5e64d3..202e8b3 100644 --- a/src/hooks/useBalances.tsx +++ b/src/hooks/useBalances.tsx @@ -79,14 +79,13 @@ export const useBalances = ( try { if (ethcallProvider) { let indexTokenRead = ethereumContracts.tcapTokenRead; - if (isArbitrum(chainId)) { indexTokenRead = arbitrumContracts.jpegzTokenRead; } if (indexTokenRead) { const indexSupplyCall = indexTokenRead?.totalSupply(); - const indexSupply = await ethcallProvider?.all([indexSupplyCall]); + const [indexSupply] = await ethcallProvider?.all([indexSupplyCall]); const indexSupplyVal = ethers.utils.formatEther(indexSupply); setBalances({ diff --git a/src/utils/utils.tsx b/src/utils/utils.tsx index be9a058..812071e 100644 --- a/src/utils/utils.tsx +++ b/src/utils/utils.tsx @@ -330,21 +330,8 @@ export const getDefaultProvider = (chainId: number | undefined) => { infura: process.env.REACT_APP_INFURA_ID, }); } else { - let alchemyKey; - switch (chainId) { - case NETWORKS.mainnet.chainId: - alchemyKey = process.env.REACT_APP_ALCHEMY_KEY; - break; - case NETWORKS.arbitrum.chainId: - alchemyKey = process.env.REACT_APP_ALCHEMY_KEY_ARBITRUM; - break; - default: - alchemyKey = process.env.REACT_APP_ALCHEMY_KEY; - break; - } - provider = ethers.getDefaultProvider(chainId, { + provider = new ethers.providers.InfuraProvider("mainnet", { infura: process.env.REACT_APP_INFURA_ID, - alchemy: alchemyKey, }); } return provider; diff --git a/src/utils/web3ModalConfig.tsx b/src/utils/web3ModalConfig.tsx new file mode 100644 index 0000000..d65037a --- /dev/null +++ b/src/utils/web3ModalConfig.tsx @@ -0,0 +1,36 @@ +import { defaultConfig } from '@web3modal/ethers5/react' + +const CoinbaseId = 'fd20dc426fb37566d803205b19bbc1d4096b248ac04548e3cfb6b3a38bd033aa'; +const TrustWalletId = '4622a2b2d6af1c9844944291e5e7351a6aa24cd7b23099efac1b2fd875da31a0'; +const RainbowKitId = '1ae92b26df02f0abca6304df07debccd18262fdf5fe82daa81593582dac9a369'; +const OkxWalletId = '971e689d0a5be527bac79629b4ee9b925e82208e5168b733496a09c0faed0709'; + +export const mainnet = { + chainId: 1, + name: 'Ethereum', + currency: 'ETH', + explorerUrl: 'https://etherscan.io', + rpcUrl: 'https://cloudflare-eth.com' +} + +export const arbitrum = { + chainId: 42161, + name: 'Arbitrum One', + currency: 'ETH', + explorerUrl: 'https://arbiscan.io/', + rpcUrl: 'https://arb1.arbitrum.io/' +} + +export const walletIds = [CoinbaseId, TrustWalletId, RainbowKitId, OkxWalletId] + +const metadata = { + name: 'Cryptex Finance V1', + description: 'Building innovative, open-source index tokens that empower the crypto and NFT community.', + url: 'https://cryptex.finance/', // origin must match your domain & subdomain + icons: ['https://avatars.mywebsite.com/'] +} + +export const web3ModalEthersConfig = defaultConfig({ + metadata, + defaultChainId: 1, // used for the Coinbase SDK +}) From 2cc7b61fcc932cd9a22e89752ac0af103d3daa77 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Thu, 16 May 2024 20:16:24 -0600 Subject: [PATCH 274/278] updated graph url --- src/App.tsx | 2 ++ src/utils/constants.tsx | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index 24e2ee7..908d43b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -70,6 +70,8 @@ createWeb3Modal({ themeVariables: { '--w3m-font-family': "Nineteen Ninety Seven", '--w3m-accent': "#1d1d3c", + '--w3m-color-mix': "#212138", + '--w3m-color-mix-strength': 10, '--w3m-font-size-master': "11px", '--w3m-border-radius-master': "5", } diff --git a/src/utils/constants.tsx b/src/utils/constants.tsx index 2fedf86..303dff8 100644 --- a/src/utils/constants.tsx +++ b/src/utils/constants.tsx @@ -98,7 +98,7 @@ export const NETWORKS = { export const API_ENDPOINT = "https://api.cryptex.finance"; export const GRAPHQL_ENDPOINT = { - mainnet: "https://api.thegraph.com/subgraphs/name/cryptexfinance/tcap-graph", + mainnet: "https://subgraph.satsuma-prod.com/0b9d5e79fdb9/cryptex/tcap-graph/api", goerli: "https://api.thegraph.com/subgraphs/name/jdestephen/cryptex-goerli-demo", arbitrum: "https://subgraph.satsuma-prod.com/0b9d5e79fdb9/cryptex/cryptex-arbitrum/api", arbitrum_goerli: "https://api.thegraph.com/subgraphs/name/jdestephen/arbitrum-goerli-demo", From 6d2d323de38e6b506f006ffba90c3eb116ae89fc Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 20 May 2024 10:39:27 -0600 Subject: [PATCH 275/278] fixed create crypt keeper --- src/components/Governance/KeeperForm.tsx | 29 ++++++++++++++++-------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/components/Governance/KeeperForm.tsx b/src/components/Governance/KeeperForm.tsx index 7a8fc39..0fa6233 100644 --- a/src/components/Governance/KeeperForm.tsx +++ b/src/components/Governance/KeeperForm.tsx @@ -214,11 +214,11 @@ const KeeperForm = ({ const isImageValid = (value: File | null): boolean => { if (value === null) { - if (isNew) { + /* if (isNew) { // setImageError(t("errors.empty")); errorNotification(t("errors.empty")); - } - return !isNew; + } */ + return true; } if (value.type !== "image/png" && value.type !== "image/jpg" && value.type !== "image/jpeg") { // setImageError(t("errors.invalid-file-type")); @@ -288,7 +288,7 @@ const KeeperForm = ({ isDiscordValid(discord) && isImageValid(image); - const saveKeeper = async () => { + const saveKeeper = async (accessToken: string) => { const formData = new FormData(); formData.append("address", address); formData.append("name", name); @@ -297,10 +297,15 @@ const KeeperForm = ({ formData.append("why", why); formData.append("discord", discord); formData.append("twitter", twitter); - // @ts-ignore - formData.append("file", image); + if (image !== null) { + // @ts-ignore + formData.append("file", image); + } await fetch(KEEPER_CREATE_ENDPOINT, { method: "POST", + headers: { + Authorization: "Bearer ".concat(accessToken), + }, body: formData, }) .then((response) => response.json()) @@ -320,13 +325,15 @@ const KeeperForm = ({ event.preventDefault(); setSaving(true); const isValid = await isFormDataValid(); + if (delegatorFactory && isValid && currentAddress !== "") { - if (address && delegatee) { + const accessTokenResp = await getAccessToken(); + if (address && delegatee && accessTokenResp.success) { try { const tx = await delegatorFactory.createDelegator(address); notifyUser(tx, refresh); setDelegatee(""); - await saveKeeper(); + await saveKeeper(accessTokenResp.accessToken); refresh(); onHide(); } catch (error: any) { @@ -351,8 +358,10 @@ const KeeperForm = ({ formData.append("why", why); formData.append("discord", discord); formData.append("twitter", twitter); - // @ts-ignore - formData.append("file", image); + if (image !== null){ + // @ts-ignore + formData.append("file", image); + } const accessTokenResp = await getAccessToken(); if (accessTokenResp.success) { await fetch(KEEPER_UPDATE_ENDPOINT, { From 2e32e861e372187bd449245fc9e0bb4cd4ea85df Mon Sep 17 00:00:00 2001 From: jdestephen Date: Wed, 29 May 2024 09:46:03 -0600 Subject: [PATCH 276/278] change error message --- src/components/Governance/Delegate.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Governance/Delegate.tsx b/src/components/Governance/Delegate.tsx index 3ca42c5..df7f3d4 100644 --- a/src/components/Governance/Delegate.tsx +++ b/src/components/Governance/Delegate.tsx @@ -83,7 +83,8 @@ const Delegate = ({ onHide(); addTodayWithdrawTime(); } catch (error: any) { - errorNotification(t("errors.not-ctx")); + console.error("Transaction error: ", error); + errorNotification("Transaction error."); } } else { errorNotification(t("errors.not-ctx")); From 06ab1a64e246be6c0888a570fb06c3f4298b3fde Mon Sep 17 00:00:00 2001 From: jdestephen Date: Mon, 17 Jun 2024 23:33:09 -0600 Subject: [PATCH 277/278] show approve when no allowance --- src/components/Governance/Delegate.tsx | 106 ++++++++++++++----------- 1 file changed, 58 insertions(+), 48 deletions(-) diff --git a/src/components/Governance/Delegate.tsx b/src/components/Governance/Delegate.tsx index df7f3d4..8d13a4d 100644 --- a/src/components/Governance/Delegate.tsx +++ b/src/components/Governance/Delegate.tsx @@ -29,37 +29,45 @@ const Delegate = ({ const signer = useContext(signerContext); const [stakeText, setStakeText] = useState(""); const [ctxBalance, setCtxBalance] = useState(""); - const [isApproved, setIsApproved] = useState(false); const [canDelegate, setCanDelegate] = useState(true); + const [allowance, setAllowance] = useState(0n); + const [ctxAmount, setCtxAmount] = useState(BigNumber.from("0")); - // Infinite Approval - const infiniteApproveValue = BigNumber.from("39614081250000000000000000000"); + const loadData = async () => { + if (signer.signer && tokens.ctxTokenRead && delegatorFactory && delegatorAddress) { + const currentAddress = await signer.signer.getAddress(); + const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(currentAddress); + const delegatorAllowanceCall = await tokens.ctxTokenRead?.allowance( + currentAddress, + delegatorFactory?.address + ); - useEffect(() => { - async function load() { - if (signer.signer && tokens.ctxTokenRead && delegatorFactory && delegatorAddress) { - const currentAddress = await signer.signer.getAddress(); - const currentCtxBalanceCall = await tokens.ctxTokenRead?.balanceOf(currentAddress); - const delegatorAllowanceCall = await tokens.ctxTokenRead?.allowance( - currentAddress, - delegatorFactory?.address - ); - // @ts-ignore - const [currentCtxBalance, delegatorAllowance] = await signer.ethcallProvider?.all([ - currentCtxBalanceCall, - delegatorAllowanceCall, - ]); - const ctxString = ethers.utils.formatEther(currentCtxBalance); - setCtxBalance(ctxString); - setIsApproved(delegatorAllowance.toString() !== "0"); - } + // @ts-ignore + const [currentCtxBalance, delegatorAllowance] = await signer.ethcallProvider?.all([ + currentCtxBalanceCall, + delegatorAllowanceCall, + ]); + + const ctxString = ethers.utils.formatEther(currentCtxBalance); + setCtxBalance(ctxString); + setAllowance(delegatorAllowance); + // setIsApproved(delegatorAllowance.toString() !== "0"); } - load(); + } + + useEffect(() => { + loadData(); // eslint-disable-next-line }, [delegatorAddress]); const onChangeStake = (event: React.ChangeEvent) => { setStakeText(event.target.value); + try { + const ctxAmount = ethers.utils.parseEther(event.target.value); + setCtxAmount(ctxAmount); + } catch (error) { + setCtxAmount(BigNumber.from("0")); + } }; const maxStake = async (e: React.MouseEvent) => { @@ -99,11 +107,11 @@ const Delegate = ({ const infiniteApproveTokens = async (event: React.MouseEvent) => { event.preventDefault(); if (tokens.ctxToken) { + setCanDelegate(false); try { - const tx = await tokens.ctxToken.approve(delegatorFactory?.address, infiniteApproveValue); + const tx = await tokens.ctxToken.approve(delegatorFactory?.address, ctxAmount.add(10000)); + setTimeout(() => loadData(), 5000); notifyUser(tx, refresh); - setStakeText(""); - setIsApproved(true); } catch (error: any) { if (error.code === 4001) { errorNotification(t("errors.tran-rejected")); @@ -111,6 +119,7 @@ const Delegate = ({ errorNotification(t("errors.tran-rejected")); } } + setCanDelegate(true); } }; @@ -134,31 +143,27 @@ const Delegate = ({
- {isApproved ? ( - <> -

{t("governance.stake-info")}

- {t("governance.amount-stake")} - - - {t("max")} - - - - - ) : ( -

{t("governance.stake-info2")}

- )} + <> +

{t("governance.stake-info")}

+ {t("governance.amount-stake")} + + + {t("max")} + + + +
- {isApproved ? ( + {ctxAmount.lte(allowance) ? ( )} From 2b5022291058f988defdf4ce35438838fdb43c03 Mon Sep 17 00:00:00 2001 From: jdestephen Date: Tue, 18 Jun 2024 10:44:23 -0600 Subject: [PATCH 278/278] sett max fixed --- src/components/Governance/Delegate.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/Governance/Delegate.tsx b/src/components/Governance/Delegate.tsx index 8d13a4d..385448a 100644 --- a/src/components/Governance/Delegate.tsx +++ b/src/components/Governance/Delegate.tsx @@ -73,6 +73,12 @@ const Delegate = ({ const maxStake = async (e: React.MouseEvent) => { e.preventDefault(); setStakeText(ctxBalance); + try { + const ctxAmount = ethers.utils.parseEther(ctxBalance); + setCtxAmount(ctxAmount); + } catch (error) { + setCtxAmount(BigNumber.from("0")); + } }; const stake = async (event: React.MouseEvent) => {