diff --git a/assets/icons/coinbase.svg b/assets/icons/coinbase.svg new file mode 100644 index 0000000..fc1f430 --- /dev/null +++ b/assets/icons/coinbase.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/metamask.svg b/assets/icons/metamask.svg new file mode 100644 index 0000000..3a5cab1 --- /dev/null +++ b/assets/icons/metamask.svg @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/portis.svg b/assets/icons/portis.svg new file mode 100644 index 0000000..97947a4 --- /dev/null +++ b/assets/icons/portis.svg @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/wallet-connect-icon.svg b/assets/icons/wallet-connect-icon.svg new file mode 100644 index 0000000..599a251 --- /dev/null +++ b/assets/icons/wallet-connect-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/components/AccountDropdown.vue b/components/AccountDropdown.vue index 2a13e9b..6761f3b 100644 --- a/components/AccountDropdown.vue +++ b/components/AccountDropdown.vue @@ -1,6 +1,6 @@ diff --git a/components/sidebar/context/SidebarWithdraw.vue b/components/sidebar/context/SidebarWithdraw.vue index 5a49155..b873f2b 100644 --- a/components/sidebar/context/SidebarWithdraw.vue +++ b/components/sidebar/context/SidebarWithdraw.vue @@ -79,7 +79,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import atokens from '~/constant/atokens' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' @@ -87,6 +87,7 @@ import ButtonCTA from '~/components/common/input/ButtonCTA.vue' import { useNotification } from '~/composables/useNotification' import Button from '~/components/Button.vue' import { useSidebar } from '~/composables/useSidebar' +import { useNetwork } from '~/composables/useNetwork' export default defineComponent({ components: { InputNumeric, Input, ToggleButton, ButtonCTA, Button }, @@ -95,7 +96,8 @@ export default defineComponent({ }, setup(props) { const { close } = useSidebar() - const { networkName, account, web3 } = useWeb3() + const { account, library } = useWeb3() + const { activeNetworkId } = useNetwork() const { dsa } = useDSA() const { getTokenByKey, valInt } = useToken() const { formatNumber, formatUsdMax, formatUsd } = useFormatting() @@ -109,7 +111,7 @@ export default defineComponent({ const amount = ref('') const amountParsed = computed(() => parseSafeFloat(amount.value)) - const rootTokenKey = computed(() => atokens[networkName.value].rootTokens.includes(props.tokenKey) ? props.tokenKey : 'eth') + const rootTokenKey = computed(() => atokens[activeNetworkId.value].rootTokens.includes(props.tokenKey) ? props.tokenKey : 'eth') const token = computed(() => getTokenByKey(rootTokenKey.value)) const symbol = computed(() => token.value?.symbol) @@ -126,7 +128,7 @@ export default defineComponent({ return { amount: { message: validateAmount(amountParsed.value, balance.value), show: hasAmountValue }, - accountAddress: { message: web3.value && !web3.value.utils.isAddress(accountAddress.value) ? 'Enter valid address!' : null, show: accountAddress.value.length > 0 }, + accountAddress: { message: library.value && !library.value.utils.isAddress(accountAddress.value) ? 'Enter valid address!' : null, show: accountAddress.value.length > 0 }, auth: { message: validateIsLoggedIn(!!account.value), show: true }, } }) diff --git a/components/sidebar/context/aaveV2/SidebarAaveV2Borrow.vue b/components/sidebar/context/aaveV2/SidebarAaveV2Borrow.vue index 6d07c7e..7923e36 100644 --- a/components/sidebar/context/aaveV2/SidebarAaveV2Borrow.vue +++ b/components/sidebar/context/aaveV2/SidebarAaveV2Borrow.vue @@ -76,7 +76,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import atokens from '~/constant/atokens' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' @@ -84,6 +84,7 @@ import ButtonCTA from '~/components/common/input/ButtonCTA.vue' import { useNotification } from '~/composables/useNotification' import Button from '~/components/Button.vue' import { useSidebar } from '~/composables/useSidebar' +import { useNetwork } from '~/composables/useNetwork' export default defineComponent({ components: { InputNumeric, ToggleButton, ButtonCTA, Button }, @@ -92,7 +93,8 @@ export default defineComponent({ }, setup(props) { const { close } = useSidebar() - const { networkName, account } = useWeb3() + const { account } = useWeb3() + const { activeNetworkId } = useNetwork() const { dsa } = useDSA() const { getTokenByKey, valInt } = useToken() const { formatNumber, formatUsdMax, formatUsd } = useFormatting() @@ -117,7 +119,7 @@ export default defineComponent({ const amount = ref('') const amountParsed = computed(() => parseSafeFloat(amount.value)) - const rootTokenKey = computed(() => atokens[networkName.value].rootTokens.includes(props.tokenKey) ? props.tokenKey : 'eth') + const rootTokenKey = computed(() => atokens[activeNetworkId.value].rootTokens.includes(props.tokenKey) ? props.tokenKey : 'eth') const currentPosition = computed(() => displayPositions.value.find((position) => position.key === rootTokenKey.value) diff --git a/components/sidebar/context/aaveV2/SidebarAaveV2Payback.vue b/components/sidebar/context/aaveV2/SidebarAaveV2Payback.vue index 94b063a..da98647 100644 --- a/components/sidebar/context/aaveV2/SidebarAaveV2Payback.vue +++ b/components/sidebar/context/aaveV2/SidebarAaveV2Payback.vue @@ -99,7 +99,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import atokens from '~/constant/atokens' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' @@ -107,6 +107,7 @@ import ButtonCTA from '~/components/common/input/ButtonCTA.vue' import { useNotification } from '~/composables/useNotification' import Button from '~/components/Button.vue' import { useSidebar } from '~/composables/useSidebar' +import { useNetwork } from '~/composables/useNetwork' export default defineComponent({ components: { InputNumeric, ToggleButton, ButtonCTA, Button }, @@ -115,7 +116,8 @@ export default defineComponent({ }, setup(props) { const { close } = useSidebar() - const { networkName, account } = useWeb3() + const { account } = useWeb3() + const { activeNetworkId } = useNetwork() const { dsa } = useDSA() const { getTokenByKey, valInt } = useToken() const { getBalanceByKey, getBalanceRawByKey, fetchBalances } = useBalances() @@ -139,7 +141,7 @@ export default defineComponent({ const amount = ref('') const amountParsed = computed(() => parseSafeFloat(amount.value)) - const rootTokenKey = computed(() => atokens[networkName.value].rootTokens.includes(props.tokenKey) ? props.tokenKey : 'eth') + const rootTokenKey = computed(() => atokens[activeNetworkId.value].rootTokens.includes(props.tokenKey) ? props.tokenKey : 'eth') const currentPosition = computed(() => displayPositions.value.find((position) => position.key === rootTokenKey.value) diff --git a/components/sidebar/context/aaveV2/SidebarAaveV2Supply.vue b/components/sidebar/context/aaveV2/SidebarAaveV2Supply.vue index 5064fed..ec2889d 100644 --- a/components/sidebar/context/aaveV2/SidebarAaveV2Supply.vue +++ b/components/sidebar/context/aaveV2/SidebarAaveV2Supply.vue @@ -80,7 +80,7 @@ import { useValidation } from "~/composables/useValidation"; import { useToken } from "~/composables/useToken"; import { useParsing } from "~/composables/useParsing"; import { useMaxAmountActive } from "~/composables/useMaxAmountActive"; -import { useWeb3 } from "~/composables/useWeb3"; +import { useWeb3 } from "@instadapp/vue-web3"; import atokens from "~/constant/atokens"; import ToggleButton from "~/components/common/input/ToggleButton.vue"; import { useDSA } from "~/composables/useDSA"; @@ -88,6 +88,7 @@ import ButtonCTA from "~/components/common/input/ButtonCTA.vue"; import Button from "~/components/Button.vue"; import { useSidebar } from "~/composables/useSidebar"; import DSA from "dsa-connect"; +import { useNetwork } from "~/composables/useNetwork"; export default defineComponent({ components: { InputNumeric, ToggleButton, ButtonCTA, Button }, props: { @@ -95,7 +96,8 @@ export default defineComponent({ }, setup(props) { const { close } = useSidebar(); - const { networkName, account } = useWeb3(); + const { account } = useWeb3(); + const { activeNetworkId } = useNetwork() const { dsa } = useDSA(); const { getTokenByKey, valInt } = useToken(); const { getBalanceByKey, fetchBalances } = useBalances(); @@ -129,7 +131,7 @@ export default defineComponent({ const amountParsed = computed(() => parseSafeFloat(amount.value)); const rootTokenKey = computed(() => - atokens[networkName.value].rootTokens.includes(props.tokenKey) + atokens[activeNetworkId.value].rootTokens.includes(props.tokenKey) ? props.tokenKey : "eth" ); diff --git a/components/sidebar/context/aaveV2/SidebarAaveV2Withdraw.vue b/components/sidebar/context/aaveV2/SidebarAaveV2Withdraw.vue index 678c41a..e792f85 100644 --- a/components/sidebar/context/aaveV2/SidebarAaveV2Withdraw.vue +++ b/components/sidebar/context/aaveV2/SidebarAaveV2Withdraw.vue @@ -81,7 +81,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import atokens from '~/constant/atokens' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' @@ -89,6 +89,7 @@ import ButtonCTA from '~/components/common/input/ButtonCTA.vue' import { useNotification } from '~/composables/useNotification' import Button from '~/components/Button.vue' import { useSidebar } from '~/composables/useSidebar' +import { useNetwork } from '~/composables/useNetwork' export default defineComponent({ components: { InputNumeric, ToggleButton, ButtonCTA, Button }, @@ -97,7 +98,8 @@ export default defineComponent({ }, setup(props) { const { close } = useSidebar() - const { networkName, account } = useWeb3() + const { account } = useWeb3() + const { activeNetworkId } = useNetwork() const { dsa } = useDSA() const { getTokenByKey, valInt } = useToken() const { formatNumber, formatUsdMax, formatUsd } = useFormatting() @@ -132,7 +134,7 @@ export default defineComponent({ const amount = ref('') const amountParsed = computed(() => parseSafeFloat(amount.value)) - const rootTokenKey = computed(() => atokens[networkName.value].rootTokens.includes(props.tokenKey) ? props.tokenKey : 'eth') + const rootTokenKey = computed(() => atokens[activeNetworkId.value].rootTokens.includes(props.tokenKey) ? props.tokenKey : 'eth') const token = computed(() => getTokenByKey(rootTokenKey.value)) const symbol = computed(() => token.value?.symbol) diff --git a/components/sidebar/context/compound/SidebarCompoundBorrow.vue b/components/sidebar/context/compound/SidebarCompoundBorrow.vue index 251c487..8f64fe3 100644 --- a/components/sidebar/context/compound/SidebarCompoundBorrow.vue +++ b/components/sidebar/context/compound/SidebarCompoundBorrow.vue @@ -65,7 +65,7 @@ import { useValidators } from '~/composables/useValidators' import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' import ButtonCTA from '~/components/common/input/ButtonCTA.vue' @@ -76,6 +76,7 @@ import { useCompoundPosition } from '~/composables/protocols/useCompoundPosition import ctokens from '~/constant/ctokens' import tokenIdMapping from '~/constant/tokenIdMapping' import { useBalances } from '~/composables/useBalances' +import { useNetwork } from '~/composables/useNetwork' export default defineComponent({ components: { InputNumeric, ToggleButton, ButtonCTA, Button }, @@ -84,7 +85,8 @@ export default defineComponent({ }, setup(props) { const { close } = useSidebar() - const { networkName, account } = useWeb3() + const { account } = useWeb3() + const { activeNetworkId } = useNetwork() const { dsa } = useDSA() const { getTokenByKey, valInt } = useToken() const { fetchBalances } = useBalances() @@ -96,7 +98,7 @@ export default defineComponent({ const tokenId = computed(() => props.tokenId) const tokenKey = computed(() => tokenIdMapping.idToToken[tokenId.value]) - const rootTokenKey = computed(() => ctokens[networkName.value].rootTokens.includes(tokenKey.value) ? tokenKey.value : 'eth') + const rootTokenKey = computed(() => ctokens[activeNetworkId.value].rootTokens.includes(tokenKey.value) ? tokenKey.value : 'eth') const { stats, status: initialStatus, position, displayPositions, liquidation, liquidationPrice, liquidationMaxPrice, refreshPosition } = useCompoundPosition({ overridePosition: (position) => { diff --git a/components/sidebar/context/compound/SidebarCompoundPayback.vue b/components/sidebar/context/compound/SidebarCompoundPayback.vue index af7d811..3485359 100644 --- a/components/sidebar/context/compound/SidebarCompoundPayback.vue +++ b/components/sidebar/context/compound/SidebarCompoundPayback.vue @@ -90,7 +90,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' import ButtonCTA from '~/components/common/input/ButtonCTA.vue' @@ -100,6 +100,7 @@ import { useSidebar } from '~/composables/useSidebar' import { useCompoundPosition } from '~/composables/protocols/useCompoundPosition' import ctokens from '~/constant/ctokens' import tokenIdMapping from '~/constant/tokenIdMapping' +import { useNetwork } from '~/composables/useNetwork' export default defineComponent({ components: { InputNumeric, ToggleButton, ButtonCTA, Button }, @@ -108,7 +109,8 @@ export default defineComponent({ }, setup(props) { const { close } = useSidebar() - const { networkName, account } = useWeb3() + const { account } = useWeb3() + const { activeNetworkId } = useNetwork() const { dsa } = useDSA() const { getTokenByKey, valInt } = useToken() const { getBalanceByKey, getBalanceRawByKey, fetchBalances } = useBalances() @@ -119,7 +121,7 @@ export default defineComponent({ const tokenId = computed(() => props.tokenId) const tokenKey = computed(() => tokenIdMapping.idToToken[tokenId.value]) - const rootTokenKey = computed(() => ctokens[networkName.value].rootTokens.includes(tokenKey.value) ? tokenKey.value : 'eth') + const rootTokenKey = computed(() => ctokens[activeNetworkId.value].rootTokens.includes(tokenKey.value) ? tokenKey.value : 'eth') const { status, position, displayPositions, liquidation, liquidationPrice, liquidationMaxPrice, refreshPosition } = useCompoundPosition({ diff --git a/components/sidebar/context/compound/SidebarCompoundSupply.vue b/components/sidebar/context/compound/SidebarCompoundSupply.vue index d62f1f8..e3689d1 100644 --- a/components/sidebar/context/compound/SidebarCompoundSupply.vue +++ b/components/sidebar/context/compound/SidebarCompoundSupply.vue @@ -79,7 +79,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' import ButtonCTA from '~/components/common/input/ButtonCTA.vue' @@ -88,6 +88,7 @@ import { useSidebar } from '~/composables/useSidebar' import tokenIdMapping from '~/constant/tokenIdMapping' import ctokens from '~/constant/ctokens' import { useCompoundPosition } from '~/composables/protocols/useCompoundPosition' +import { useNetwork } from '~/composables/useNetwork' export default defineComponent({ components: { InputNumeric, ToggleButton, ButtonCTA, Button }, @@ -96,7 +97,8 @@ export default defineComponent({ }, setup(props) { const { close } = useSidebar() - const { networkName, account } = useWeb3() + const { account } = useWeb3() + const { activeNetworkId } = useNetwork() const { dsa } = useDSA() const { getTokenByKey, valInt } = useToken() const { getBalanceByKey, fetchBalances } = useBalances() @@ -108,7 +110,7 @@ export default defineComponent({ const tokenId = computed(() => props.tokenId) const tokenKey = computed(() => tokenIdMapping.idToToken[tokenId.value]) - const rootTokenKey = computed(() => ctokens[networkName.value].rootTokens.includes(tokenKey.value) ? tokenKey.value : 'eth') + const rootTokenKey = computed(() => ctokens[activeNetworkId.value].rootTokens.includes(tokenKey.value) ? tokenKey.value : 'eth') const { status, position, displayPositions, liquidation, liquidationPrice, liquidationMaxPrice, refreshPosition } = useCompoundPosition({ overridePosition: (position) => { diff --git a/components/sidebar/context/compound/SidebarCompoundWithdraw.vue b/components/sidebar/context/compound/SidebarCompoundWithdraw.vue index c49e3d4..27765a4 100644 --- a/components/sidebar/context/compound/SidebarCompoundWithdraw.vue +++ b/components/sidebar/context/compound/SidebarCompoundWithdraw.vue @@ -79,7 +79,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' import ButtonCTA from '~/components/common/input/ButtonCTA.vue' @@ -90,6 +90,7 @@ import tokenIdMapping from '~/constant/tokenIdMapping' import ctokens from '~/constant/ctokens' import { useCompoundPosition } from '~/composables/protocols/useCompoundPosition' import { useBalances } from '~/composables/useBalances' +import { useNetwork } from '~/composables/useNetwork' export default defineComponent({ components: { InputNumeric, ToggleButton, ButtonCTA, Button }, @@ -98,7 +99,8 @@ export default defineComponent({ }, setup(props) { const { close } = useSidebar() - const { networkName, account } = useWeb3() + const { account } = useWeb3() + const { activeNetworkId } = useNetwork() const { dsa } = useDSA() const { fetchBalances } = useBalances() const { getTokenByKey, valInt } = useToken() @@ -110,7 +112,7 @@ export default defineComponent({ const tokenId = computed(() => props.tokenId) const tokenKey = computed(() => tokenIdMapping.idToToken[tokenId.value]) - const rootTokenKey = computed(() => ctokens[networkName.value].rootTokens.includes(tokenKey.value) ? tokenKey.value : 'eth') + const rootTokenKey = computed(() => ctokens[activeNetworkId.value].rootTokens.includes(tokenKey.value) ? tokenKey.value : 'eth') const { stats, status, position, displayPositions, liquidation, liquidationPrice, liquidationMaxPrice, refreshPosition } = useCompoundPosition({ diff --git a/components/sidebar/context/liquity/SidebarLiquityTroveBorrow.vue b/components/sidebar/context/liquity/SidebarLiquityTroveBorrow.vue index 6876d90..841046f 100644 --- a/components/sidebar/context/liquity/SidebarLiquityTroveBorrow.vue +++ b/components/sidebar/context/liquity/SidebarLiquityTroveBorrow.vue @@ -97,7 +97,7 @@ import { useValidators } from '~/composables/useValidators' import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' import ButtonCTA from '~/components/common/input/ButtonCTA.vue' diff --git a/components/sidebar/context/liquity/SidebarLiquityTroveOpenNew.vue b/components/sidebar/context/liquity/SidebarLiquityTroveOpenNew.vue index 89418ef..86e560a 100644 --- a/components/sidebar/context/liquity/SidebarLiquityTroveOpenNew.vue +++ b/components/sidebar/context/liquity/SidebarLiquityTroveOpenNew.vue @@ -107,7 +107,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import atokens from '~/constant/atokens' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' diff --git a/components/sidebar/context/liquity/SidebarLiquityTrovePayback.vue b/components/sidebar/context/liquity/SidebarLiquityTrovePayback.vue index 60687c5..cbe54f9 100644 --- a/components/sidebar/context/liquity/SidebarLiquityTrovePayback.vue +++ b/components/sidebar/context/liquity/SidebarLiquityTrovePayback.vue @@ -95,7 +95,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' import ButtonCTA from '~/components/common/input/ButtonCTA.vue' @@ -108,7 +108,7 @@ export default defineComponent({ components: { InputNumeric, ToggleButton, ButtonCTA, Button }, setup() { const { close } = useSidebar() - const { networkName, account } = useWeb3() + const { account } = useWeb3() const { dsa } = useDSA() const { valInt } = useToken() const { getBalanceByKey, fetchBalances } = useBalances() diff --git a/components/sidebar/context/liquity/SidebarLiquityTroveSupply.vue b/components/sidebar/context/liquity/SidebarLiquityTroveSupply.vue index 78b4a4e..a2b5692 100644 --- a/components/sidebar/context/liquity/SidebarLiquityTroveSupply.vue +++ b/components/sidebar/context/liquity/SidebarLiquityTroveSupply.vue @@ -84,7 +84,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' import ButtonCTA from '~/components/common/input/ButtonCTA.vue' diff --git a/components/sidebar/context/liquity/SidebarLiquityTroveWithdraw.vue b/components/sidebar/context/liquity/SidebarLiquityTroveWithdraw.vue index 05951aa..fc3b515 100644 --- a/components/sidebar/context/liquity/SidebarLiquityTroveWithdraw.vue +++ b/components/sidebar/context/liquity/SidebarLiquityTroveWithdraw.vue @@ -96,7 +96,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' import ButtonCTA from '~/components/common/input/ButtonCTA.vue' diff --git a/components/sidebar/context/makerdao/SidebarMakerdaoBorrow.vue b/components/sidebar/context/makerdao/SidebarMakerdaoBorrow.vue index f0aacb9..9cc2d1a 100644 --- a/components/sidebar/context/makerdao/SidebarMakerdaoBorrow.vue +++ b/components/sidebar/context/makerdao/SidebarMakerdaoBorrow.vue @@ -69,7 +69,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' import ButtonCTA from '~/components/common/input/ButtonCTA.vue' @@ -87,7 +87,7 @@ export default defineComponent({ }, setup(props) { const { close } = useSidebar() - const { networkName, account } = useWeb3() + const { account } = useWeb3() const { dsa } = useDSA() const { getTokenByKey, valInt } = useToken() const { fetchBalances } = useBalances() diff --git a/components/sidebar/context/makerdao/SidebarMakerdaoPayback.vue b/components/sidebar/context/makerdao/SidebarMakerdaoPayback.vue index 39c1376..93d38ce 100644 --- a/components/sidebar/context/makerdao/SidebarMakerdaoPayback.vue +++ b/components/sidebar/context/makerdao/SidebarMakerdaoPayback.vue @@ -91,7 +91,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' import ButtonCTA from '~/components/common/input/ButtonCTA.vue' @@ -107,7 +107,7 @@ export default defineComponent({ }, setup(props) { const { close } = useSidebar() - const { networkName, account } = useWeb3() + const { account } = useWeb3() const { dsa } = useDSA() const { getTokenByKey, valInt } = useToken() const { getBalanceByKey, getBalanceRawByKey, fetchBalances } = useBalances() diff --git a/components/sidebar/context/makerdao/SidebarMakerdaoSupply.vue b/components/sidebar/context/makerdao/SidebarMakerdaoSupply.vue index 8b2076c..182cb3f 100644 --- a/components/sidebar/context/makerdao/SidebarMakerdaoSupply.vue +++ b/components/sidebar/context/makerdao/SidebarMakerdaoSupply.vue @@ -79,7 +79,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' import ButtonCTA from '~/components/common/input/ButtonCTA.vue' diff --git a/components/sidebar/context/makerdao/SidebarMakerdaoWithdraw.vue b/components/sidebar/context/makerdao/SidebarMakerdaoWithdraw.vue index 553dde0..5f3ccd3 100644 --- a/components/sidebar/context/makerdao/SidebarMakerdaoWithdraw.vue +++ b/components/sidebar/context/makerdao/SidebarMakerdaoWithdraw.vue @@ -77,7 +77,7 @@ import { useValidation } from '~/composables/useValidation' import { useToken } from '~/composables/useToken' import { useParsing } from '~/composables/useParsing' import { useMaxAmountActive } from '~/composables/useMaxAmountActive' -import { useWeb3 } from '~/composables/useWeb3' +import { useWeb3 } from '@instadapp/vue-web3' import ToggleButton from '~/components/common/input/ToggleButton.vue' import { useDSA } from '~/composables/useDSA' import ButtonCTA from '~/components/common/input/ButtonCTA.vue' diff --git a/components/sidebar/context/strategy/SidebarStrategy.vue b/components/sidebar/context/strategy/SidebarStrategy.vue new file mode 100644 index 0000000..d48f4cc --- /dev/null +++ b/components/sidebar/context/strategy/SidebarStrategy.vue @@ -0,0 +1,172 @@ + + + \ No newline at end of file diff --git a/components/sidebar/context/strategy/SidebarStrategySelection.vue b/components/sidebar/context/strategy/SidebarStrategySelection.vue new file mode 100644 index 0000000..e1218e7 --- /dev/null +++ b/components/sidebar/context/strategy/SidebarStrategySelection.vue @@ -0,0 +1,56 @@ + + + \ No newline at end of file diff --git a/composables/protocols/useAaveV2Position.ts b/composables/protocols/useAaveV2Position.ts index f893894..67d1474 100644 --- a/composables/protocols/useAaveV2Position.ts +++ b/composables/protocols/useAaveV2Position.ts @@ -3,15 +3,16 @@ import { AbiItem } from "web3-utils"; import aaveV2ABI from "~/abis/read/aaveV2.json"; import { computed, ref, watch } from "@nuxtjs/composition-api"; import { useDSA } from "~/composables/useDSA"; -import { useWeb3 } from "~/composables/useWeb3"; +import { useWeb3 } from "@instadapp/vue-web3"; import BigNumber from "bignumber.js"; import atokensV2 from "~/constant/atokensV2"; import tokens from "~/constant/tokens"; -import { Network } from "~/composables/useNetwork"; +import { Network, useNetwork } from "~/composables/useNetwork"; import { useBigNumber } from "~/composables/useBigNumber"; import { usePosition } from "~/composables/usePosition"; import { useToken } from "~/composables/useToken"; import { useSorting } from "~/composables/useSorting"; +import useEventBus from "../useEventBus"; const { times, @@ -25,7 +26,7 @@ const { } = useBigNumber(); const { getType } = usePosition(); -const position = ref({ +export const position = ref({ totalSupplyInEth: new BigNumber(0), totalBorrowInEth: new BigNumber(0), totalBorrowStableInEth: new BigNumber(0), @@ -65,10 +66,12 @@ export function useAaveV2Position( ) { overridePosition = overridePosition || (pos => pos); - const { web3, chainId, networkName } = useWeb3(); + const { library, chainId } = useWeb3(); + const { activeNetworkId } = useNetwork(); const { activeAccount } = useDSA(); const { getTokenByKey, allATokensV2 } = useToken(); const { byMaxSupplyOrBorrowDesc } = useSorting() + const { onEvent } = useEventBus() const resolver = computed(() => chainId.value === 1 @@ -77,7 +80,7 @@ export function useAaveV2Position( ); const fetchPosition = async () => { - if (!web3.value) { + if (!library.value) { return; } @@ -85,20 +88,20 @@ export function useAaveV2Position( return; } - const aaveResolverInstance = new web3.value.eth.Contract( + const aaveResolverInstance = new library.value.eth.Contract( aaveV2ABI as AbiItem[], resolver.value ); - const aaveTokensArr = atokensV2[networkName.value].allTokens.map( - a => tokens[networkName.value].getTokenByKey(a.root).address + const aaveTokensArr = atokensV2[activeNetworkId.value].allTokens.map( + a => tokens[activeNetworkId.value].getTokenByKey(a.root).address ); const aaveRawData = await aaveResolverInstance.methods .getPosition(activeAccount.value.address, aaveTokensArr) .call(); - const newPos = calculateAavePosition(aaveRawData, networkName.value); + const newPos = calculateAavePosition(aaveRawData, activeNetworkId.value); return newPos; }; @@ -107,9 +110,10 @@ export function useAaveV2Position( position.value = await fetchPosition(); }; + onEvent("protocol::aaveV2::refresh", refreshPosition); watch( - web3, + library, async val => { if (val) { refreshPosition(); @@ -165,7 +169,7 @@ export function useAaveV2Position( ); const rewardTokenPriceInUsd = computed(() => { - if (networkName.value === Network.Polygon) { + if (activeNetworkId.value === Network.Polygon) { return ensureValue( position.value.data.find(position => position.key === "matic") ?.priceInUsd diff --git a/composables/protocols/useCompoundPosition.ts b/composables/protocols/useCompoundPosition.ts index 7078957..f2b56b1 100644 --- a/composables/protocols/useCompoundPosition.ts +++ b/composables/protocols/useCompoundPosition.ts @@ -3,10 +3,10 @@ import { AbiItem } from "web3-utils"; import compoundABI from "~/abis/read/compound.json"; import { computed, ref, watch } from "@nuxtjs/composition-api"; import { useDSA } from "~/composables/useDSA"; -import { useWeb3 } from "~/composables/useWeb3"; +import { useWeb3 } from "@instadapp/vue-web3"; import BigNumber from "bignumber.js"; import tokens from "~/constant/tokens"; -import { Network } from "~/composables/useNetwork"; +import { Network, useNetwork } from "~/composables/useNetwork"; import { useBigNumber } from "~/composables/useBigNumber"; import { usePosition } from "~/composables/usePosition"; import { useToken } from "~/composables/useToken"; @@ -14,6 +14,7 @@ import addresses from "~/constant/addresses"; import ctokens from "~/constant/ctokens"; import tokenIdMapping from "~/constant/tokenIdMapping"; import { useSorting } from "~/composables/useSorting"; +import useEventBus from "../useEventBus"; const { times, @@ -27,7 +28,7 @@ const { } = useBigNumber(); const { getType } = usePosition(); -const position = ref({ +export const position = ref({ totalSupplyInEth: new BigNumber(0), totalBorrowInEth: new BigNumber(0), totalBorrowStableInEth: new BigNumber(0), @@ -62,14 +63,16 @@ export function useCompoundPosition( ) { overridePosition = overridePosition || (pos => pos); - const { web3, networkName } = useWeb3(); + const { library } = useWeb3(); + const { activeNetworkId } = useNetwork() + const { onEvent } = useEventBus() const { activeAccount } = useDSA(); const { getTokenByKey } = useToken(); const { byMaxSupplyOrBorrowDesc } = useSorting() const resolver = computed(() => addresses.mainnet.resolver.compound); const fetchPosition = async () => { - if (!web3.value) { + if (!library.value) { return; } @@ -77,12 +80,12 @@ export function useCompoundPosition( return; } - const resolverInstance = new web3.value.eth.Contract( + const resolverInstance = new library.value.eth.Contract( compoundABI as AbiItem[], resolver.value ); - const tokensArr = ctokens[networkName.value].allTokens.map(a => a.address); + const tokensArr = ctokens[activeNetworkId.value].allTokens.map(a => a.address); const compoundRawData = await resolverInstance.methods .getPosition(activeAccount.value.address, tokensArr) @@ -90,7 +93,7 @@ export function useCompoundPosition( const newPos = calculateCompoundPosition( compoundRawData, - networkName.value + activeNetworkId.value ); return newPos; @@ -100,8 +103,10 @@ export function useCompoundPosition( position.value = await fetchPosition(); }; + onEvent("protocol::compound::refresh", refreshPosition); + watch( - web3, + library, async val => { if (val) { refreshPosition(); @@ -162,7 +167,7 @@ export function useCompoundPosition( return []; } - return ctokens[networkName.value].allTokens + return ctokens[activeNetworkId.value].allTokens .flatMap(ctoken => { const token = getTokenByKey(ctoken.root); if (!token) { diff --git a/composables/protocols/useLiquityPosition.ts b/composables/protocols/useLiquityPosition.ts index 87d3258..03eb632 100644 --- a/composables/protocols/useLiquityPosition.ts +++ b/composables/protocols/useLiquityPosition.ts @@ -2,15 +2,16 @@ import { computed, Ref, ref, watch } from "@nuxtjs/composition-api"; import { useBalances } from "../useBalances"; import { useBigNumber } from "../useBigNumber"; import { useToken } from "../useToken"; -import { useWeb3 } from "~/composables/useWeb3"; +import { useWeb3 } from "@instadapp/vue-web3"; import { AbiItem } from "web3-utils"; import BigNumber from "bignumber.js"; BigNumber.config({ POW_PRECISION: 200 }); import abis from "~/constant/abis"; import addresses from "~/constant/addresses"; import { useDSA } from "../useDSA"; +import useEventBus from "../useEventBus"; -const trove = ref({ +export const trove = ref({ collateral: "0", debt: "0", stabilityAmount: "0", @@ -26,7 +27,7 @@ const trove = ref({ liquidation: "0" }); -const troveTypes = ref([ +export const troveTypes = ref([ { totalCollateral: "0", price: "0", @@ -41,7 +42,7 @@ const troveTypes = ref([ } ]); -const troveOverallDetails = computed(() => +export const troveOverallDetails = computed(() => troveTypes.value.find(t => t.tokenKey === trove.value.tokenKey) ); @@ -49,7 +50,8 @@ export function useLiquityPosition( collateralAmountRef: Ref = null, debtAmountRef: Ref = null ) { - const { web3 } = useWeb3(); + const { library } = useWeb3(); + const { onEvent } = useEventBus() const { activeAccount } = useDSA(); const { isZero, times, div, max, minus, plus } = useBigNumber(); @@ -137,22 +139,22 @@ export function useLiquityPosition( ); const fetchPosition = async () => { - if (!web3.value) { + if (!library.value) { return; } - troveTypes.value = await getTroveTypes(web3.value); + troveTypes.value = await getTroveTypes(library.value); if (!activeAccount.value) { return; } - trove.value = await getTrove(activeAccount.value.address, web3.value); + trove.value = await getTrove(activeAccount.value.address, library.value); }; async function getTrovePositionHints(collateralInWei, debtInWei) { try { - const liquityInstance = new web3.value.eth.Contract( + const liquityInstance = new library.value.eth.Contract( abis.resolver.liquity as AbiItem[], addresses.mainnet.resolver.liquity ); @@ -178,8 +180,11 @@ export function useLiquityPosition( } } + onEvent("protocol::liquity::refresh", fetchPosition); + + watch( - web3, + library, async val => { if (val) { fetchPosition(); diff --git a/composables/protocols/useMakerdaoPosition.ts b/composables/protocols/useMakerdaoPosition.ts index d6c1394..becee68 100644 --- a/composables/protocols/useMakerdaoPosition.ts +++ b/composables/protocols/useMakerdaoPosition.ts @@ -7,8 +7,9 @@ import makerVaults from "~/constant/tokens/vaults"; import { useBigNumber } from "~/composables/useBigNumber"; import { useDSA } from "~/composables/useDSA"; import { useToken } from "~/composables/useToken"; -import { useWeb3 } from "~/composables/useWeb3"; +import { useWeb3 } from "@instadapp/vue-web3"; import { AbiItem } from "web3-utils"; +import useEventBus from "../useEventBus"; const defaultVault = { id: null, @@ -31,7 +32,7 @@ const isNewVault = ref(false); const vaultTypes = ref([]); const vaultType = ref(""); -const vault = computed(() => { +export const vault = computed(() => { const vlt = vaults.value.find(v => v.id === vaultId.value); if (!isNewVault.value && !!vlt) { return vlt; @@ -54,7 +55,8 @@ export function useMakerdaoPosition( collateralAmountRef: Ref = null, debtAmountRef: Ref = null ) { - const { web3, chainId, networkName } = useWeb3(); + const { library } = useWeb3(); + const { onEvent } = useEventBus() const { activeAccount } = useDSA(); const { isZero, ensureValue, times, div, max, gt } = useBigNumber(); const { getTokenByKey } = useToken(); @@ -117,23 +119,25 @@ export function useMakerdaoPosition( ); const fetchPosition = async () => { - if (!web3.value) { + if (!library.value) { return; } - vaultTypes.value = await getVaultTypes(web3.value); + vaultTypes.value = await getVaultTypes(library.value); if (!activeAccount.value) { return; } - vaults.value = await getVaults(activeAccount.value.address, web3.value); + vaults.value = await getVaults(activeAccount.value.address, library.value); if (vaults.value.length > 0 && !vaultId.value) { vaultId.value = vaults.value[0].id; } }; + onEvent("protocol::makerdao::refresh", fetchPosition); + watch( - web3, + library, async val => { if (val) { fetchPosition(); diff --git a/composables/useBalances.ts b/composables/useBalances.ts index 6703772..26b0c5f 100644 --- a/composables/useBalances.ts +++ b/composables/useBalances.ts @@ -11,8 +11,8 @@ import addresses from "~/constant/addresses"; import tokens from "~/constant/tokens"; import uniPoolTokens from "~/constant/uniPoolTokens"; import { useDSA } from "./useDSA"; -import { Network } from "./useNetwork"; -import { useWeb3 } from "./useWeb3"; +import { Network, useNetwork } from "./useNetwork"; +import { useWeb3 } from "@instadapp/vue-web3"; import Web3 from "web3"; import { AbiItem } from "web3-utils"; import { useToken } from "./useToken"; @@ -20,8 +20,14 @@ import { useBigNumber } from "./useBigNumber"; import { useSorting } from "./useSorting"; const balances = reactive({ - user: null, - dsa: null + user: { + mainnet: {}, + polygon: {} + }, + dsa: { + mainnet: {}, + polygon: {} + } }); const prices = reactive({ @@ -32,7 +38,8 @@ const prices = reactive({ export function useBalances() { const { $axios } = useContext(); const { times, plus, ensureValue } = useBigNumber(); - const { account, networkName, web3 } = useWeb3(); + const { account, library } = useWeb3(); + const { activeNetworkId } = useNetwork() const { activeAccount } = useDSA(); const { getTokenByKey } = useToken(); const { by } = useSorting(); @@ -48,12 +55,12 @@ export function useBalances() { if (!account.value) return; balances.user = { mainnet: - networkName.value === Network.Mainnet - ? await getBalances(account.value, Network.Mainnet, web3.value) + activeNetworkId.value === Network.Mainnet + ? await getBalances(account.value, Network.Mainnet, library.value) : {}, polygon: - networkName.value === Network.Polygon - ? await getBalances(account.value, Network.Polygon, web3.value) + activeNetworkId.value === Network.Polygon + ? await getBalances(account.value, Network.Polygon, library.value) : {} }; } @@ -63,19 +70,19 @@ export function useBalances() { balances.dsa = { mainnet: - networkName.value === Network.Mainnet + activeNetworkId.value === Network.Mainnet ? await getBalances( activeAccount.value.address, Network.Mainnet, - web3.value + library.value ) : {}, polygon: - networkName.value === Network.Polygon + activeNetworkId.value === Network.Polygon ? await getBalances( activeAccount.value.address, Network.Polygon, - web3.value + library.value ) : {} }; @@ -88,27 +95,27 @@ export function useBalances() { const getBalanceByAddress = (address, network = null, type = "dsa") => { return ( - balances[type]?.[network || networkName.value][address]?.balance || "0" + balances[type]?.[network || activeNetworkId.value][address]?.balance || "0" ); }; const getBalanceRawByKey = (tokenKey, network = null, type = "dsa") => { return ( - balances[type]?.[network || networkName.value][ + balances[type]?.[network || activeNetworkId.value][ getTokenByKey(tokenKey)?.address ]?.raw || "0" ); }; const netWorth = (address, type = "dsa") => { - const balance = getBalanceByAddress(address, networkName.value, type); - const price = ensureValue(prices[networkName.value][address]).toFixed(); + const balance = getBalanceByAddress(address, activeNetworkId.value, type); + const price = ensureValue(prices[activeNetworkId.value][address]).toFixed(); return times(balance, price).toFixed(); }; const balanceTotal = computed(() => - tokens[networkName.value].allTokens.reduce( + tokens[activeNetworkId.value].allTokens.reduce( (totalNetWorth, token) => plus(totalNetWorth, netWorth(token.address)).toFixed(), "0" @@ -116,16 +123,16 @@ export function useBalances() { ); const getAssets = (type = "dsa") => { - return tokens[networkName.value].allTokens + return tokens[activeNetworkId.value].allTokens .map(token => ({ ...token, - balance: getBalanceByAddress(token.address, networkName.value, type), + balance: getBalanceByAddress(token.address, activeNetworkId.value, type), netWorth: netWorth(token.address, type) })) .sort(by("-netWorth")); }; - watch(web3, () => { + watch(library, () => { fetchBalances(true); }); return { @@ -206,6 +213,7 @@ async function getBalances( } const { name, symbol, decimals, type, isStableCoin, key } = tokenData; tokensBalObj[tokenAddress] = { + address: tokenAddress, name, symbol, decimals, diff --git a/composables/useDSA.ts b/composables/useDSA.ts index 3bd8cd9..4b8f551 100644 --- a/composables/useDSA.ts +++ b/composables/useDSA.ts @@ -1,10 +1,11 @@ import { computed, readonly, ref, watch } from "@nuxtjs/composition-api"; -import { useWeb3 } from "./useWeb3"; +import { useWeb3 } from "@instadapp/vue-web3"; import DSA from "dsa-connect"; import addresses from "~/constant/addresses"; import abis from "~/constant/abis"; import { AbiItem } from "web3-utils"; import { useNotification } from "./useNotification"; +import { useNetwork } from "./useNetwork"; const dsa = ref(); const accounts = ref([]); @@ -12,18 +13,28 @@ const activeAccount = ref(); const authorities = ref(); export function useDSA() { - const { web3, chainId, networkName, account } = useWeb3(); + const { active, library, chainId, account } = useWeb3(); + const { activeNetworkId } = useNetwork() const { showWarning } = useNotification(); - watch(web3, () => { - if (web3.value) { - dsa.value = new DSA(web3.value, chainId.value); + watch(library, () => { + if (library.value) { + dsa.value = new DSA(library.value, chainId.value); + } + }); + + + watch(active, () => { + console.log("here"); + + if (library.value) { + dsa.value = new DSA(library.value, chainId.value); } }); watch(chainId, () => { - if (web3.value) { - dsa.value = new DSA(web3.value, chainId.value); + if (library.value) { + dsa.value = new DSA(library.value, chainId.value); } }); @@ -82,9 +93,9 @@ export function useDSA() { async function fethAuthorities() { try { - const accountsResolverInstance = new web3.value.eth.Contract( + const accountsResolverInstance = new library.value.eth.Contract( abis.resolver.accounts as AbiItem[], - addresses[networkName.value].resolver.accounts + addresses[activeNetworkId.value].resolver.accounts ); const rawData = await accountsResolverInstance.methods .getAccountAuthorities(activeAccount.value.address) @@ -170,7 +181,7 @@ export function useDSA() { createAccount, creatingAccount, setAccount, - web3, + library, chainId, authorities, createAuthority, diff --git a/composables/useEagerConnect.ts b/composables/useEagerConnect.ts new file mode 100644 index 0000000..a93a600 --- /dev/null +++ b/composables/useEagerConnect.ts @@ -0,0 +1,35 @@ +import { useWeb3 } from "@instadapp/vue-web3"; +import { injected, gnosisSafe } from "../connectors"; +import { onMounted, ref, watch, watchEffect } from "@nuxtjs/composition-api"; +import { useSafeAppConnection } from "./useSafeAppConnection"; + +export function useEagerConnect() { + const { activate, active } = useWeb3(); + const { tried: triedToConnectToSafe } = useSafeAppConnection(gnosisSafe); + const tried = ref(false); + + watchEffect(() => { + if (triedToConnectToSafe.value && !active.value) { + injected.isAuthorized().then((isAuthorized: boolean) => { + if (isAuthorized) { + activate(injected, undefined, true).catch(() => { + tried.value = true; + }); + } else { + tried.value = true; + } + }); + } + }); + + // if the connection worked, wait until we get confirmation of that to flip the flag + watch([tried, active], () => { + if (!tried.value && active.value) { + tried.value = true; + } + }); + + return { + tried + }; +} diff --git a/composables/useEventBus.ts b/composables/useEventBus.ts new file mode 100644 index 0000000..af8ef00 --- /dev/null +++ b/composables/useEventBus.ts @@ -0,0 +1,24 @@ +import { onBeforeUnmount } from "@nuxtjs/composition-api"; +import { TinyEmitter } from "tiny-emitter"; + +const eventEmitter = new TinyEmitter(); + +export default function useEventBus() { + const eventHandlers = []; + + onBeforeUnmount(() => + eventHandlers.forEach(eventHandler => + eventEmitter.off(eventHandler.event, eventHandler.handler) + ) + ); + + return { + onEvent(event, handler) { + eventHandlers.push({ event, handler }); + eventEmitter.on(event, handler); + }, + emitEvent(event, payload) { + eventEmitter.emit(event, payload); + } + }; +} diff --git a/composables/useLink.ts b/composables/useLink.ts index 6c20193..a9d325e 100644 --- a/composables/useLink.ts +++ b/composables/useLink.ts @@ -1,22 +1,25 @@ -import { computed } from '@nuxtjs/composition-api' -import { useWeb3 } from './useWeb3' +import { computed } from "@nuxtjs/composition-api"; +import { useNetwork } from "./useNetwork"; export function useLink() { - const { networkName } = useWeb3() + const { activeNetworkId } = useNetwork(); const addressDetailsLink = computed(() => { - if (networkName.value === 'polygon') { - return 'https://polygonscan.com/address' + if (activeNetworkId.value === "polygon") { + return "https://polygonscan.com/address"; } - return 'https://etherscan.io/address' - }) + return "https://etherscan.io/address"; + }); - return { addressDetailsLink } + return { addressDetailsLink }; } -export const getEtherscanLink = (transactionHash) => `https://etherscan.io/tx/${transactionHash}` -export const getMaticLink = (transactionHash) => `https://polygonscan.com/tx/${transactionHash}` -export const getPolygonLink = (transactionHash) => `https://polygonscan.com/tx/${transactionHash}` -export const getTenderlyLink = (simulationId) => - `https://dashboard.tenderly.co/public/InstaDApp/dsa-simulations/fork-simulation/${simulationId}?hideSidebar=true` +export const getEtherscanLink = transactionHash => + `https://etherscan.io/tx/${transactionHash}`; +export const getMaticLink = transactionHash => + `https://polygonscan.com/tx/${transactionHash}`; +export const getPolygonLink = transactionHash => + `https://polygonscan.com/tx/${transactionHash}`; +export const getTenderlyLink = simulationId => + `https://dashboard.tenderly.co/public/InstaDApp/dsa-simulations/fork-simulation/${simulationId}?hideSidebar=true`; diff --git a/composables/useNetwork.ts b/composables/useNetwork.ts index e99d356..6100bb7 100644 --- a/composables/useNetwork.ts +++ b/composables/useNetwork.ts @@ -5,7 +5,7 @@ import MainnetSVG from "~/assets/icons/mainnet.svg?inline"; import PolygonSVG from "~/assets/icons/polygon.svg?inline"; import { useModal } from "./useModal"; import { useNotification } from "./useNotification"; -import { useWeb3 } from "./useWeb3"; +import { useWeb3 } from "@instadapp/vue-web3"; export enum Network { Mainnet = "mainnet", @@ -24,11 +24,11 @@ export const activeNetwork = computed( export function useNetwork() { const { showWarning } = useNotification(); - const { account, networkName, refreshWeb3 } = useWeb3(); + const { account, chainId } = useWeb3(); const { showNetworksMismatchDialog } = useModal(); const networkMismatch = computed( - () => networkName.value != activeNetworkId.value + () => chainId.value != activeNetwork.value?.chainId ); const checkForNetworkMismatch = () => { @@ -117,7 +117,7 @@ export function useNetwork() { //@ts-ignore activeNetworkId.value = localStorage.getItem("network") || "mainnet"; - refreshWeb3(); + // refreshWeb3() }); return { diff --git a/composables/useSafeAppConnection.ts b/composables/useSafeAppConnection.ts new file mode 100644 index 0000000..14eaa7a --- /dev/null +++ b/composables/useSafeAppConnection.ts @@ -0,0 +1,37 @@ +import { useWeb3 } from "@instadapp/vue-web3"; +import { injected } from "../connectors"; +import { onMounted, ref, watch } from "@nuxtjs/composition-api"; +import { SafeAppConnector } from "@gnosis.pm/safe-apps-web3-react"; +import { Network, useNetwork } from "./useNetwork"; + +export function useSafeAppConnection(connector?: SafeAppConnector) { + const { activate, active } = useWeb3(); + const { activeNetworkId} = useNetwork(); + + const tried = ref(false); + + onMounted(() => { + connector?.isSafeApp().then(async (loadedInSafe: boolean) => { + if (loadedInSafe) { + await activate(connector, undefined, true).catch(() => { + tried.value = true; + }); + + activeNetworkId.value = (await connector.getChainId() === 1) ? Network.Mainnet : Network.Polygon; + } else { + tried.value = true; + } + }); + }); + + // if the connection worked, wait until we get confirmation of that to flip the flag + watch([tried, active], () => { + if (!tried.value && active.value) { + tried.value = true; + } + }); + + return { + tried + }; +} \ No newline at end of file diff --git a/composables/useSidebar.ts b/composables/useSidebar.ts index 4e53041..d5ec48e 100644 --- a/composables/useSidebar.ts +++ b/composables/useSidebar.ts @@ -8,7 +8,7 @@ import { } from "@nuxtjs/composition-api"; import { useDSA } from "./useDSA"; -import { useWeb3 } from "./useWeb3"; +import { useWeb3 } from "@instadapp/vue-web3"; import SidebarAaveV2Supply from "~/components/sidebar/context/aaveV2/SidebarAaveV2Supply.vue"; import SidebarAaveV2Withdraw from '~/components/sidebar/context/aaveV2/SidebarAaveV2Withdraw.vue' import SidebarAaveV2Borrow from '~/components/sidebar/context/aaveV2/SidebarAaveV2Borrow.vue' @@ -41,11 +41,16 @@ import SidebarReflexerWithdraw from '~/components/sidebar/context/reflexer/Sideb import SidebarReflexerBorrow from '~/components/sidebar/context/reflexer/SidebarReflexerBorrow.vue' import SidebarReflexerPayback from '~/components/sidebar/context/reflexer/SidebarReflexerPayback.vue' +import SidebarStrategySelection from '~/components/sidebar/context/strategy/SidebarStrategySelection.vue' +import SidebarStrategy from '~/components/sidebar/context/strategy/SidebarStrategy.vue' const sidebars = { "#overview" : {component: SidebarOverview, back : false, close : true }, "#deposit-overview": {component: SidebarDepositOverview, back: { hash: 'overview' } }, '#withdraw-token': { component: SidebarWithdraw, back: { hash: 'overview' } }, + '#strategies': { component: SidebarStrategySelection }, + '#strategy': { component: SidebarStrategy }, + "/aave-v2": { component: null }, "/aave-v2#supply": { component: SidebarAaveV2Supply }, "/aave-v2#borrow": { component: SidebarAaveV2Borrow }, diff --git a/composables/useStrategy.ts b/composables/useStrategy.ts new file mode 100644 index 0000000..3e8c48e --- /dev/null +++ b/composables/useStrategy.ts @@ -0,0 +1,159 @@ +import { + nextTick, + onMounted, + ref, + watch, + watchEffect +} from "@nuxtjs/composition-api"; +import tokens from "~/constant/tokens"; +import { + buildStrategy, + DefineStrategy, + StrategyProtocol +} from "~/core/strategies"; +import { position as aaveV2Position } from "./protocols/useAaveV2Position"; +import { position as compoundPosition } from "./protocols/useCompoundPosition"; +import { vault as makerPosition } from "./protocols/useMakerdaoPosition"; +import { + trove as liquityPosition, + troveTypes, + troveOverallDetails +} from "./protocols/useLiquityPosition"; +import { useBalances } from "./useBalances"; +import { useDSA } from "./useDSA"; +import useEventBus from "./useEventBus"; +import { useNotification } from "./useNotification"; +import { useSidebar } from "./useSidebar"; +import { useToken } from "./useToken"; +import { useWeb3 } from "@instadapp/vue-web3"; +import { useBigNumber } from "./useBigNumber"; +import tokenIdMapping from "~/constant/tokenIdMapping"; +import { useFormatting } from "./useFormatting"; +import { useNetwork } from "./useNetwork"; + +export function useStrategy(defineStrategy: DefineStrategy) { + const { library, account } = useWeb3(); + const { activeNetworkId } = useNetwork() + const { dsa } = useDSA(); + const { prices, balances, fetchBalances } = useBalances(); + const { close } = useSidebar(); + const { valInt, getTokenByKey } = useToken(); + const { emitEvent } = useEventBus(); + const { toBN } = useBigNumber(); + const formatting = useFormatting(); + + const { + showPendingTransaction, + showConfirmedTransaction + } = useNotification(); + + const strategy = buildStrategy(defineStrategy); + const components = ref(strategy.components); + const error = ref(""); + const pending = ref(false); + + // strategy.onUpdated(async () => { + // await nextTick(); + // }); + + const submit = async () => { + error.value = ""; + pending.value = true; + try { + const tx = await strategy.submit({ + onReceipt: async () => { + showConfirmedTransaction(tx); + await fetchBalances(true); + + emitEvent(`protocol::${strategy.schema.protocol}::refresh`, {}); + }, + from: account.value + }); + showPendingTransaction(tx); + close(); + } catch (e) { + error.value = e.message; + } + pending.value = false; + }; + + watch( + () => [ + aaveV2Position, + makerPosition, + compoundPosition, + liquityPosition, + troveTypes, + troveOverallDetails + ], + () => { + let position = null; + let positionExtra = {}; + + if (strategy.schema.protocol == StrategyProtocol.AAVE_V2) { + position = aaveV2Position.value; + } else if (strategy.schema.protocol == StrategyProtocol.MAKERDAO) { + position = makerPosition.value; + } else if (strategy.schema.protocol == StrategyProtocol.COMPOUND) { + position = compoundPosition.value; + } else if (strategy.schema.protocol == StrategyProtocol.LIQUITY) { + position = liquityPosition.value; + + positionExtra["troveTypes"] = troveTypes.value; + positionExtra["troveOverallDetails"] = troveOverallDetails.value; + } + + strategy.setProps({ + convertTokenAmountToWei: valInt, + getTokenByKey, + toBN, + position, + positionExtra, + tokenIdMapping, + formatting + }); + }, + { immediate: true } + ); + + watch(library, () => strategy.setWeb3(library.value), { immediate: true }); + watch(dsa, () => strategy.setDSA(dsa.value), { immediate: true }); + watch( + prices, + () => strategy.setProps({ prices: prices[activeNetworkId.value] }), + { immediate: true } + ); + watch( + balances, + () => { + strategy.setProps({ + dsaBalances: balances.dsa[activeNetworkId.value], + userBalances: balances.user[activeNetworkId.value] + }); + }, + { immediate: true } + ); + watch( + activeNetworkId, + () => + strategy.setProps({ + tokens: tokens[activeNetworkId.value].allTokens, + tokenKeys: tokens[activeNetworkId.value].tokenKeys + }), + { immediate: true } + ); + + // testing + onMounted(() => { + //@ts-ignore + window.strategy = strategy; + }); + + return { + strategy, + components, + submit, + error, + pending + }; +} diff --git a/composables/useTenderly.ts b/composables/useTenderly.ts index 753615f..ddf4ce1 100644 --- a/composables/useTenderly.ts +++ b/composables/useTenderly.ts @@ -1,14 +1,14 @@ import { useContext, ref, onMounted, computed } from "@nuxtjs/composition-api"; import axios from "axios"; import { activeNetwork, useNetwork } from "./useNetwork"; -import { useWeb3 } from "./useWeb3"; +import { useWeb3 } from "@instadapp/vue-web3"; import Web3 from "web3"; import { useDSA } from "./useDSA"; const forkId = ref(null); export function useTenderly() { const { $config } = useContext(); - const { setWeb3, refreshWeb3 } = useWeb3(); + const { activate, deactivate, connector, library } = useWeb3(); const { accounts, refreshAccounts } = useDSA(); const canSimulate = computed( () => $config.TENDERLY_FORK_PATH && $config.TENDERLY_KEY @@ -21,7 +21,7 @@ export function useTenderly() { } setTimeout(() => { - setForkId(window.localStorage.getItem("forkId")); + setForkId(window.localStorage.getItem("forkId"), true); }, 1000); }); @@ -51,39 +51,47 @@ export function useTenderly() { loading.value = false; }; - const stopSimulation = async () => { + const stopSimulation = async (silent = false) => { loading.value = true; + try { - await axios({ - method: "delete", - url: `https://api.tenderly.co/api/v1/account/${$config.TENDERLY_FORK_PATH}/fork/${forkId.value}`, - headers: { - "X-Access-key": $config.TENDERLY_KEY, - "Content-Type": "application/json" - } - }); + if (forkId.value) { + await axios({ + method: "delete", + url: `https://api.tenderly.co/api/v1/account/${$config.TENDERLY_FORK_PATH}/fork/${forkId.value}`, + headers: { + "X-Access-key": $config.TENDERLY_KEY, + "Content-Type": "application/json" + } + }); + } } catch (error) {} forkId.value = null; window.localStorage.removeItem("forkId"); - await refreshWeb3(); + + if (!silent && connector.value) { + deactivate(); + activate(connector.value); + } + loading.value = false; }; - const setForkId = fork => { + const setForkId = async (fork, silent = false) => { if (!fork) { - stopSimulation(); + stopSimulation(silent); return; } forkId.value = fork; - setWeb3( - new Web3( - new Web3.providers.HttpProvider( - `https://rpc.tenderly.co/fork/${forkId.value}` - ) + + library.value = new Web3( + new Web3.providers.HttpProvider( + `https://rpc.tenderly.co/fork/${forkId.value}` ) ); + window.localStorage.setItem("forkId", forkId.value); }; @@ -106,6 +114,6 @@ export function useTenderly() { canSimulate, startSimulation, stopSimulation, - loading, + loading }; } diff --git a/composables/useToken.ts b/composables/useToken.ts index c53aef6..486c57f 100644 --- a/composables/useToken.ts +++ b/composables/useToken.ts @@ -2,18 +2,18 @@ import { computed } from "@nuxtjs/composition-api"; import atokensV2 from "~/constant/atokensV2"; import tokens from "~/constant/tokens"; import { useBigNumber } from "./useBigNumber"; -import { useWeb3 } from "./useWeb3"; +import { useNetwork } from "./useNetwork"; export function useToken() { - const { networkName } = useWeb3(); + const { activeNetworkId } = useNetwork(); const { toBN, times, minus, div, pow } = useBigNumber(); const getTokenByKey = key => - tokens[networkName.value].allTokens.find( + tokens[activeNetworkId.value].allTokens.find( token => String(token.key).toLowerCase() === String(key).toLowerCase() ); - const allATokensV2 = computed(() => atokensV2[networkName.value].allTokens); + const allATokensV2 = computed(() => atokensV2[activeNetworkId.value].allTokens); function valInt(val, decimals) { const num = toBN(val); diff --git a/composables/useWeb3.ts b/composables/useWeb3.ts deleted file mode 100644 index 9f6f1f4..0000000 --- a/composables/useWeb3.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { computed, onMounted, ref, watch } from "@nuxtjs/composition-api"; -import Web3 from "web3"; -import { SafeAppWeb3Modal } from "@gnosis.pm/safe-apps-web3modal"; -import { Network } from "./useNetwork"; - -let web3Modal: SafeAppWeb3Modal; -let web3Provider: any; - -let providerOptions = {}; - -const chains = [ - { - name: "mainnet" as Network, - chainId: 1, - displayName: "Mainnet" - }, - { - name: "polygon" as Network, - chainId: 137, - node: "https://rpc-mainnet.matic.network", - displayName: "Polygon" - } -]; - -const active = ref(false); -const chainId = ref<1 | 137>(); -const networkName = computed( - () => chains.find(c => c.chainId === chainId.value)?.name || Network.Mainnet -); -const account = ref(); -const web3 = ref(); - -export function setProviders(providers: any) { - providerOptions = providers; -} - -export function useWeb3() { - onMounted(async () => { - if (web3Modal) { - return; - } - - web3Modal = new SafeAppWeb3Modal({ - cacheProvider: true, - providerOptions - }); - - //@ts-ignore - window.web3Modal = web3Modal; - - if (web3Modal.cachedProvider) { - await activate(); - } - - if (await web3Modal.isSafeApp()) { - await activate(); - } - }); - - const activate = async () => { - web3Provider = await web3Modal.requestProvider(); - active.value = true; - if (web3Provider.selectedAddress) { - account.value = web3Provider.selectedAddress; - } else if (web3Provider.accounts && web3Provider.accounts.length) { - account.value = web3Provider.accounts[0]; - } - let newWeb3 = new Web3(web3Provider); - //@ts-ignore - chainId.value = await newWeb3.eth.getChainId(); - web3.value = newWeb3; - - setProvider(web3Provider); - }; - - const deactivate = async () => { - if ( - web3.value && - web3.value.currentProvider && - typeof web3.value.currentProvider === "object" - ) { - //@ts-ignore - if (typeof web3.value.currentProvider.disconnect === "function") { - //@ts-ignore - web3.value.currentProvider.disconnect(); - } - } - web3Modal.clearCachedProvider(); - web3Provider = undefined; - active.value = false; - web3.value = undefined; - account.value = undefined; - chainId.value = undefined; - }; - - const setProvider = provider => { - if (web3Modal.cachedProvider === "walletconnect") { - provider.on("accountsChanged", () => { - location.reload(); - }); - - // Subscribe to networkId change - provider.on("networkChanged", () => { - location.reload(); - }); - - // Subscribe to session connection/open - provider.on("open", () => { - location.reload(); - }); - - // Subscribe to session disconnection/close - provider.on("close", () => { - location.reload(); - }); - } - - // Subscribe to chainId change - provider.on("chainChanged", refreshWeb3); - provider.on("accountsChanged", refreshWeb3); - }; - - const refreshWeb3 = async () => { - if (!web3Provider) { - return; - } - let newWeb3 = new Web3(web3Provider); - //@ts-ignore - chainId.value = await newWeb3.eth.getChainId(); - web3.value = newWeb3; - }; - - const setWeb3 = (newWeb3: Web3) => { - web3.value = newWeb3; - }; - - watch(web3, () => { - window.web3 = web3.value; - }); - - return { - account, - chainId, - web3, - active, - activate, - deactivate, - networkName, - refreshWeb3, - setWeb3 - }; -} diff --git a/composables/useWeb3Modal.ts b/composables/useWeb3Modal.ts new file mode 100644 index 0000000..c261374 --- /dev/null +++ b/composables/useWeb3Modal.ts @@ -0,0 +1,10 @@ +import { useModal } from "./useModal"; +import Web3Modal from "~/components/modal/web3/Web3Modal.vue"; + +export const useWeb3Modal = () => { + const { showComponent } = useModal(); + + return { + open: () => showComponent(Web3Modal) + }; +}; diff --git a/connectors/index.ts b/connectors/index.ts new file mode 100644 index 0000000..c496959 --- /dev/null +++ b/connectors/index.ts @@ -0,0 +1,46 @@ +import { setWeb3LibraryCallback } from "@instadapp/vue-web3"; +import { InjectedConnector } from "@web3-react/injected-connector"; +import { WalletConnectConnector } from "@web3-react/walletconnect-connector"; +import { PortisConnector } from "@web3-react/portis-connector"; +import { WalletLinkConnector } from "@web3-react/walletlink-connector"; + +import INSTADAPP_LOGO_URL from "~/assets/logo/instadapp-logo-icon.svg?inline"; + +import Web3 from "web3"; +import { SafeAppConnector } from "@gnosis.pm/safe-apps-web3-react/dist/connector"; + +setWeb3LibraryCallback(provider => new Web3(provider)); + +export const injected = new InjectedConnector({ + supportedChainIds: [1, 137] +}); + +export const walletconnect = new WalletConnectConnector({ + rpc: { + 1: `https://mainnet.infura.io/v3/${process.env.INFURA_ID}`, + 137: "https://rpc-mainnet.maticvigil.com" + }, + supportedChainIds: [1, 137] +}); + +// mainnet only +export const portis = new PortisConnector({ + dAppId: process.env.PORTIS_ID as string, + networks: [1] +}); + +export const walletlink = new WalletLinkConnector({ + url: `https://mainnet.infura.io/v3/${process.env.INFURA_ID}`, + appName: "Instadapp", + appLogoUrl: INSTADAPP_LOGO_URL +}); + +let gnosisSafe = null; + +if (process.client) { + gnosisSafe = new SafeAppConnector({ + supportedChainIds: [1, 137] + }); +} + +export { gnosisSafe }; diff --git a/constant/wallet.ts b/constant/wallet.ts new file mode 100644 index 0000000..6fd7a88 --- /dev/null +++ b/constant/wallet.ts @@ -0,0 +1,38 @@ +import { AbstractConnector } from '@web3-react/abstract-connector' +import { injected, walletconnect, portis, walletlink } from '~/connectors' + +import METAMASK_ICON_URL from '~/assets/icons/metamask.svg?inline' +import WALLETCONNECT_ICON_URL from '~/assets/icons/wallet-connect-icon.svg?inline' +import PORTIS_ICON_URL from '~/assets/icons/portis.svg?inline' +import COINBASE_ICON_URL from '~/assets/icons/coinbase.svg?inline' + +interface WalletInfo { + connector?: AbstractConnector; + name: string; + iconURL: string; +} + + +export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = { + METAMASK: { + connector: injected, + name: 'MetaMask', + iconURL: METAMASK_ICON_URL, + }, + WALLET_CONNECT: { + connector: walletconnect, + name: 'WalletConnect', + iconURL: WALLETCONNECT_ICON_URL, + }, + Portis: { + connector: portis, + name: 'Portis', + iconURL: PORTIS_ICON_URL, + }, + WALLET_LINK: { + connector: walletlink, + name: 'Coinbase Wallet', + iconURL: COINBASE_ICON_URL, + }, + } + \ No newline at end of file diff --git a/core/strategies/helpers/index.ts b/core/strategies/helpers/index.ts new file mode 100644 index 0000000..1c8bdc5 --- /dev/null +++ b/core/strategies/helpers/index.ts @@ -0,0 +1,151 @@ +import DSA, { Spell } from "dsa-connect"; +import Web3 from "web3"; +import slugify from "slugify"; +import { Strategy } from "./strategy"; +import BigNumber from "bignumber.js"; +import tokenIdMapping from "~/constant/tokenIdMapping"; +import { useFormatting } from "~/composables/useFormatting"; +export interface IStrategyContext { + dsa: DSA; + web3: Web3; + components: IStrategyComponent[]; + + // TODO: add types in useStrategy.ts + dsaBalances?: { [address: string]: IStrategyToken }; + userBalances?: { [address: string]: IStrategyToken }; + tokens?: { [address: string]: IStrategyToken }; + convertTokenAmountToWei?: (value: any, decimals: any) => string; + getTokenByKey?: (key: string) => IStrategyToken; + position?: any; + positionExtra?: { [key: string]: any }; + variables?: { [key: string]: any }; + toBN?: (value: any) => BigNumber; + tokenIdMapping?: typeof tokenIdMapping; + formatting?: ReturnType; +} + +export interface IStrategyToken { + address: string; + key: string; + symbol: string; + balance: string; + decimals: string; + + // supply: string; + // borrow: string; +} + +export enum StrategyComponentType { + // INPUT = "input", + INPUT_NUMERIC = "input-numeric", + INPUT_AMOUNT = "input-amount", + INPUT_WITH_TOKEN = "input-with-token", + + HEADING = "heading", + VALUE = "value", + STATUS = "status" +} + +export type StrategyComponentParameterMap = { + // [StrategyInputType.INPUT]: {}; + + [StrategyComponentType.INPUT_NUMERIC]: {}; + + [StrategyComponentType.INPUT_AMOUNT]: { + tokenKey: string; + }; + + [StrategyComponentType.INPUT_WITH_TOKEN]: { + token?: IStrategyToken; + }; + + [StrategyComponentType.HEADING]: {}; + [StrategyComponentType.VALUE]: {}; + [StrategyComponentType.STATUS]: { + liquidation?: any; + status?: any; + }; +}; + +export interface IStrategyComponent< + ComponentType extends StrategyComponentType +> { + type: ComponentType; + name: string; + + variables?: { [key: string]: any }; + + placeholder?: ( + context: IStrategyContext & { + component: IStrategyComponent & + StrategyComponentParameterMap[ComponentType]; + } + ) => string; + validate?: ( + context: IStrategyContext & { + component: IStrategyComponent & + StrategyComponentParameterMap[ComponentType]; + } + ) => string | void; + + defaults?: (context: Omit) => object; + update?: ( + context: IStrategyContext & { + component: IStrategyComponent & + StrategyComponentParameterMap[ComponentType]; + } + ) => void; + + value?: any; + + [key: string]: any; +} + +export enum StrategyProtocol { + AAVE_V2 = "aaveV2", + COMPOUND = "compound", + MAKERDAO = "makerdao", + LIQUITY = "liquity" +} +export interface IStrategy { + protocol: StrategyProtocol; + id?: string; + name: string; + description: string; + details?: string; + author?: string; + + components: IStrategyComponent[]; + + variables?: object; + + spells: (context: IStrategyContext) => Promise | Spell[]; + validate?: ( + context: IStrategyContext + ) => Promise | void | string; + + submitText?: string; +} + +export function defineStrategyComponent< + ComponentType extends StrategyComponentType +>( + component: IStrategyComponent & + StrategyComponentParameterMap[ComponentType] +) { + return component as IStrategyComponent & + StrategyComponentParameterMap[ComponentType]; +} + +export function defineStrategy(strategy: IStrategy) { + return { + ...strategy, + id: strategy.id ? strategy.id : slugify(strategy.name).toLowerCase() + }; +} + +export function buildStrategy(schema: DefineStrategy) { + return new Strategy(schema); +} + +export type DefineStrategy = ReturnType; diff --git a/core/strategies/helpers/strategy.ts b/core/strategies/helpers/strategy.ts new file mode 100644 index 0000000..8ba043d --- /dev/null +++ b/core/strategies/helpers/strategy.ts @@ -0,0 +1,197 @@ +import DSA from "dsa-connect"; +import Web3 from "web3"; +import { DefineStrategy, IStrategyContext } from "."; + +export class Strategy { + schema: DefineStrategy; + components = []; + context = { + web3: null as Web3, + dsa: null as DSA + }; + + listeners = []; + + props: object = { + prices: {}, + dsaTokens: {}, + userTokens: {} + }; + + constructor(schema: DefineStrategy) { + this.schema = schema; + + this.components = this.generateComponents(this.schema.components); + } + + getBaseContext(): Omit { + return { + ...this.context, + ...this.props, + variables: this.schema.variables || {} + }; + } + + getContext(): IStrategyContext { + return { + ...this.getBaseContext(), + components: this.components + }; + } + + setProps(props: object) { + Object.assign(this.props, props); + + const components = this.components; + + for (const component of components) { + if (typeof component.defaults !== "function") { + continue; + } + + if (component.defaulted) { + continue; + } + + Object.assign(component, component.defaults(this.getBaseContext())); + + component.defaulted = true; + } + + this.notifyListeners("SET_PROPS"); + } + + generateComponents(components) { + return components.map((component, idx) => { + const computedComponent = { + ...component, + value: component.value || "", + error: component.error || "", + placeholder: () => { + return component.placeholder + ? component.placeholder({ + ...this.getContext(), + component: this.components[idx] + }) + : null; + }, + onInput: (val: any) => { + this.components[idx].error = ""; + this.components[idx].value = val; + + if (val) { + this.components[idx].error = this.components[idx].validate({ + ...this.getContext(), + component: this.components[idx] + }); + } + + this.notifyListeners("onInput"); + }, + onCustomInput: (values: object) => { + this.components[idx] = Object.assign(this.components[idx], values); + + this.components[idx].error = this.components[idx].validate({ + ...this.getContext(), + component: this.components[idx] + }); + this.notifyListeners("onCustomInput"); + } + }; + + let defaults = {}; + + if (component.defaults) { + defaults = component.defaults(this.getBaseContext()); + } + + return { + ...computedComponent, + ...defaults + }; + }); + } + + async spells() { + return await this.schema.spells(this.getContext()); + } + + async submit(options) { + await this.validate(); + + const allSpells = await this.spells(); + + const spells = this.context.dsa.Spell(); + + for (const spell of allSpells) { + spells.add(spell); + } + + return await this.context.dsa.cast({ + spells, + onReceipt: options?.onReceipt, + from: options?.from + }); + } + + async validate() { + const components = this.components; + + for (const component of components) { + if (typeof component.validate !== "function") { + continue; + } + + const result = await component.validate({ + ...this.getContext(), + component + }); + + if (typeof result === "string") { + throw new Error(result || "Error has occurred"); + } + } + + if (this.schema.validate) { + const result = await this.schema.validate(this.getContext()); + + if (typeof result === "string") { + throw new Error(result || "Error has occurred"); + } + } + } + + setWeb3(web3: Web3) { + this.context.web3 = web3; + + this.notifyListeners("WEB3"); + } + + setDSA(dsa: DSA) { + this.context.dsa = dsa; + + this.notifyListeners("DSA"); + } + + async notifyListeners( from = "") { + + if(from && process.env.NODE_ENV === "development") { + console.log(`${from} updated`); + } + + for (const listener of this.listeners) { + await listener(this); + } + + this.components.forEach(component => + component.update?.({ + ...this.getContext(), + component + }) + ); + } + + onUpdated(cb) { + this.listeners.push(cb); + } +} diff --git a/core/strategies/index.ts b/core/strategies/index.ts new file mode 100644 index 0000000..793bcd8 --- /dev/null +++ b/core/strategies/index.ts @@ -0,0 +1,11 @@ +import AaveV2 from "./protocols/aave-v2"; +import Compound from "./protocols/compound"; +import Liquity from "./protocols/liquity"; + +export const protocolStrategies = { + aaveV2: AaveV2, + compound: Compound, + liquity: Liquity +}; + +export * from "./helpers"; diff --git a/core/strategies/protocols/aave-v2/deposit-and-borrow.ts b/core/strategies/protocols/aave-v2/deposit-and-borrow.ts new file mode 100644 index 0000000..c53db4d --- /dev/null +++ b/core/strategies/protocols/aave-v2/deposit-and-borrow.ts @@ -0,0 +1,266 @@ +import BigNumber from "bignumber.js"; +import { + defineStrategy, + defineStrategyComponent, + StrategyComponentType, + StrategyProtocol +} from "../../helpers"; + +export default defineStrategy({ + protocol: StrategyProtocol.AAVE_V2, + name: "Deposit & Borrow", + description: "Deposit collateral & borrow asset in a single txn.", + + details: `

This strategy executes:

+
    +
  • Deposit collateral
  • +
  • Borrow Debt
  • +
`, + + submitText: "Deposit & Borrow", + + author: "Instadapp Team", + + variables: { + collateralTokenKey: "eth", + debtTokenKey: "dai", + debtRateMode: 2 + }, + + components: [ + defineStrategyComponent({ + type: StrategyComponentType.INPUT_WITH_TOKEN, + name: "Collateral", + placeholder: ({ component: input }) => + input.token ? `${input.token.symbol} to Deposit` : "", + validate: ({ component: input, dsaBalances, toBN }) => { + if (!input.token) { + return "Collateral token is required"; + } + + if (!input.value) { + return "Collateral amount is required"; + } + + const collateralBalance = toBN( + dsaBalances[input.token.address]?.balance + ); + + if (toBN(collateralBalance).lt(input.value)) { + const collateralBalanceFormatted = collateralBalance.toFixed(2); + return `Your amount exceeds your maximum limit of ${collateralBalanceFormatted} ${input.token.symbol}`; + } + }, + defaults: ({ getTokenByKey, variables }) => ({ + token: getTokenByKey?.(variables.collateralTokenKey) + }) + }), + + defineStrategyComponent({ + type: StrategyComponentType.INPUT_WITH_TOKEN, + name: "Debt", + placeholder: ({ component: input }) => + input.token ? `${input.token.symbol} to Borrow` : "", + validate: ({ component: input }) => { + if (!input.token) { + return "Debt token is required"; + } + + if (!input.value) { + return "Debt amount is required"; + } + }, + defaults: ({ getTokenByKey, variables }) => ({ + token: getTokenByKey?.(variables.debtTokenKey) + }) + }), + defineStrategyComponent({ + type: StrategyComponentType.HEADING, + name: "Projected Debt Position" + }), + defineStrategyComponent({ + type: StrategyComponentType.STATUS, + name: "Status", + update: ({ position, component, components, toBN }) => { + if ( + toBN(components[0].value).isZero() && + toBN(components[1].value).isZero() + ) { + return; + } + + if (!position) { + return; + } + + const newPositionData = changedPositionData(position, components); + const stats = calculateStats(newPositionData); + + component.liquidation = BigNumber.max( + toBN(stats.totalMaxBorrowLimitInEth).div(stats.totalSupplyInEth), + "0" + ).toFixed(); + component.status = BigNumber.max( + toBN(stats.totalBorrowInEth).div(stats.totalSupplyInEth), + "0" + ).toFixed(); + } + }), + defineStrategyComponent({ + type: StrategyComponentType.VALUE, + name: "LIQUIDATION PRICE (IN ETH)", + value: "-", + update: ({ position, component, components, toBN, formatting }) => { + if (!position) { + return; + } + + const newPositionData = changedPositionData(position, components); + const initialStats = calculateStats(position.data); + const newStats = calculateStats(newPositionData); + + const stats = + toBN(components[0].value).isZero() && + toBN(components[1].value).isZero() + ? initialStats + : newStats; + + let liquidationPrice = "0"; + if (!toBN(stats.ethSupplied).isZero()) { + liquidationPrice = BigNumber.max( + toBN(stats.totalBorrowInEth) + .div(stats.totalMaxLiquidationLimitInEth) + .times(position.ethPriceInUsd), + "0" + ).toFixed(); + } + + component.value = `${formatting.formatUsdMax( + liquidationPrice, + position.ethPriceInUsd + )} / ${formatting.formatUsd(position.ethPriceInUsd)}`; + } + }) + ], + + validate: async ({ position, components: inputs, toBN }) => { + if (toBN(inputs[0].value).isZero() && toBN(inputs[1].value).isZero()) { + return; + } + + const newPositionData = changedPositionData(position, inputs); + const stats = calculateStats(newPositionData); + + let liquidation = "0"; + if (!toBN(stats.totalSupplyInEth).isZero()) { + liquidation = BigNumber.max( + toBN(stats.totalMaxBorrowLimitInEth).div(stats.totalSupplyInEth), + "0" + ).toFixed(); + } + + const status = BigNumber.max( + toBN(stats.totalBorrowInEth).div(stats.totalSupplyInEth), + "0" + ); + + if (status.gt(toBN(liquidation).minus("0.0001"))) { + return "Position will liquidate."; + } + }, + + spells: async ({ + components: inputs, + convertTokenAmountToWei, + variables + }) => { + return [ + { + connector: "aave_v2", + method: "deposit", + args: [ + inputs[0].token.address, + convertTokenAmountToWei(inputs[0].value, inputs[0].token.decimals), + 0, + 0 + ] + }, + { + connector: "aave_v2", + method: "borrow", + args: [ + inputs[1].token.address, + convertTokenAmountToWei(inputs[1].value, inputs[1].token.decimals), + variables.debtRateMode, + 0, + 0 + ] + } + ]; + } +}); + +const changedPositionData = (position, inputs) => { + return position.data.map(position => { + const changedPosition = { ...position }; + if (inputs[1].token.key === position.key) { + changedPosition.borrow = BigNumber.max( + new BigNumber(position.borrow).plus(inputs[1].value || "0"), + "0" + ).toFixed(); + } + + if (inputs[0].token.key === position.key) { + changedPosition.supply = BigNumber.max( + new BigNumber(position.supply).plus(inputs[0].value || "0"), + "0" + ).toFixed(); + } + + return changedPosition; + }); +}; + +const calculateStats = positionData => { + return positionData.reduce( + ( + stats, + { key, supply, borrow, borrowStable, priceInEth, factor, liquidation } + ) => { + if (key === "eth") { + stats.ethSupplied = supply; + } + + const borrowTotal = new BigNumber(borrow).plus(borrowStable); + + stats.totalSupplyInEth = new BigNumber(supply) + .times(priceInEth) + .plus(stats.totalSupplyInEth) + .toFixed(); + stats.totalBorrowInEth = new BigNumber(borrowTotal) + .times(priceInEth) + .plus(stats.totalBorrowInEth) + .toFixed(); + + stats.totalMaxBorrowLimitInEth = new BigNumber(priceInEth) + .times(factor) + .times(supply) + .plus(stats.totalMaxBorrowLimitInEth) + .toFixed(); + + stats.totalMaxLiquidationLimitInEth = new BigNumber(priceInEth) + .times(liquidation) + .times(supply) + .plus(stats.totalMaxLiquidationLimitInEth) + .toFixed(); + + return stats; + }, + { + totalSupplyInEth: "0", + totalBorrowInEth: "0", + totalMaxBorrowLimitInEth: "0", + totalMaxLiquidationLimitInEth: "0" + } + ); +}; diff --git a/core/strategies/protocols/aave-v2/index.ts b/core/strategies/protocols/aave-v2/index.ts new file mode 100644 index 0000000..7a63aaa --- /dev/null +++ b/core/strategies/protocols/aave-v2/index.ts @@ -0,0 +1,8 @@ +import depositAndBorrow from "./deposit-and-borrow" +import paybackAndWithdraw from "./payback-and-withdraw" + +export default [ + depositAndBorrow, + paybackAndWithdraw, +] + \ No newline at end of file diff --git a/core/strategies/protocols/aave-v2/payback-and-withdraw.ts b/core/strategies/protocols/aave-v2/payback-and-withdraw.ts new file mode 100644 index 0000000..fff0bfd --- /dev/null +++ b/core/strategies/protocols/aave-v2/payback-and-withdraw.ts @@ -0,0 +1,262 @@ +import BigNumber from "bignumber.js"; +import tokens from "~/constant/tokens"; +import { + defineStrategy, + defineStrategyComponent, + StrategyComponentType, + StrategyProtocol +} from "../../helpers"; + +export default defineStrategy({ + protocol: StrategyProtocol.AAVE_V2, + name: "Payback & Withdraw", + description: "Payback debt & withdraw collateral in a single txn.", + author: "Instadapp Team", + + submitText: "Payback & Withdraw", + + details: `

This strategy executes:

+
    +
  • Payback debt
  • +
  • Withdraw collateral
  • +
`, + + components: [ + defineStrategyComponent({ + type: StrategyComponentType.INPUT_WITH_TOKEN, + name: "Debt", + placeholder: ({ component: input }) => + input.token ? `${input.token.symbol} to Payback` : "", + validate: ({ component: input, toBN, dsaBalances }) => { + if (!input.token) { + return "Debt token is required"; + } + + const balance = toBN(dsaBalances[input.token.address]?.balance); + + if (toBN(balance).lt(input.value)) { + return "You don't have enough balance to payback."; + } + }, + defaults: ({ getTokenByKey }) => ({ + token: getTokenByKey?.("dai") + }) + }), + defineStrategyComponent({ + type: StrategyComponentType.INPUT_WITH_TOKEN, + name: "Collateral", + placeholder: ({ component: input }) => + input.token ? `${input.token.symbol} to Withdraw` : "", + validate: ({ component: input, position, toBN }) => { + if (!input.token) { + return "Collateral token is required"; + } + + if (!input.value) { + return "Collateral amount is required"; + } + + if (position) { + const collateralPosition = position.data.find( + item => item.key === input.token.key + ); + if (collateralPosition) { + const collateralBalance = toBN(collateralPosition.supply); + if (collateralBalance.lt(input.value)) { + const collateralBalanceFormatted = collateralBalance.toFixed(2); + return `Your amount exceeds your maximum limit of ${collateralBalanceFormatted} ${input.token.symbol}`; + } + } + } + }, + defaults: ({ getTokenByKey }) => ({ + token: getTokenByKey?.("eth") + }) + }), + defineStrategyComponent({ + type: StrategyComponentType.HEADING, + name: "Projected Debt Position" + }), + defineStrategyComponent({ + type: StrategyComponentType.STATUS, + name: "Status", + update: ({ position, component, components, toBN }) => { + if ( + toBN(components[0].value).isZero() && + toBN(components[1].value).isZero() + ) { + return; + } + + if (!position) { + return; + } + + const newPositionData = changedPositionData(position, components); + const stats = calculateStats(newPositionData); + + component.liquidation = BigNumber.max( + toBN(stats.totalMaxLiquidationLimitInEth).div(stats.totalSupplyInEth), + "0" + ).toFixed(); + component.status = BigNumber.max( + toBN(stats.totalBorrowInEth).div(stats.totalSupplyInEth), + "0" + ).toFixed(); + } + }), + defineStrategyComponent({ + type: StrategyComponentType.VALUE, + name: "LIQUIDATION PRICE (IN ETH)", + value: "-", + update: ({ position, component, components, toBN, formatting }) => { + if (!position) { + return; + } + + const newPositionData = changedPositionData(position, components); + const initialStats = calculateStats(position.data); + const newStats = calculateStats(newPositionData); + + const stats = + toBN(components[0].value).isZero() && + toBN(components[1].value).isZero() + ? initialStats + : newStats; + + let liquidationPrice = "0"; + if (!toBN(stats.ethSupplied).isZero()) { + liquidationPrice = BigNumber.max( + toBN(stats.totalBorrowInEth) + .div(stats.totalMaxLiquidationLimitInEth) + .times(position.ethPriceInUsd), + "0" + ).toFixed(); + } + + component.value = `${formatting.formatUsdMax( + liquidationPrice, + position.ethPriceInUsd + )} / ${formatting.formatUsd(position.ethPriceInUsd)}`; + } + }) + ], + + validate: async ({ position, components: inputs, toBN }) => { + if (toBN(inputs[0].value).isZero() && toBN(inputs[1].value).isZero()) { + return; + } + + const newPositionData = changedPositionData(position, inputs); + const stats = calculateStats(newPositionData); + + let maxLiquidation = "0"; + + if (!toBN(stats.totalSupplyInEth).isZero()) { + maxLiquidation = BigNumber.max( + toBN(stats.totalMaxLiquidationLimitInEth).div(stats.totalSupplyInEth), + "0" + ).toFixed(); + } + + const status = BigNumber.max( + toBN(stats.totalBorrowInEth).div(stats.totalSupplyInEth), + "0" + ); + + if (status.gt(toBN(maxLiquidation).minus("0.0001"))) { + return "Position will liquidate."; + } + }, + + spells: async ({ components: inputs, convertTokenAmountToWei }) => { + return [ + { + connector: "aave_v2", + method: "payback", + args: [ + inputs[0].token.address, + convertTokenAmountToWei(inputs[0].value, inputs[0].token.decimals), + 2, + 0, + 0 + ] + }, + { + connector: "aave_v2", + method: "withdraw", + args: [ + inputs[1].token.address, + convertTokenAmountToWei(inputs[1].value, inputs[1].token.decimals), + 0, + 0 + ] + } + ]; + } +}); + +const changedPositionData = (position, inputs) => { + return position.data.map(position => { + const changedPosition = { ...position }; + if (inputs[0].token.key === position.key) { + changedPosition.borrow = BigNumber.max( + new BigNumber(position.borrow).minus(inputs[0].value), + "0" + ).toFixed(); + } + + if (inputs[1].token.key === position.key) { + changedPosition.supply = BigNumber.max( + new BigNumber(position.supply).minus(inputs[1].value), + "0" + ).toFixed(); + } + + return changedPosition; + }); +}; + +const calculateStats = positionData => { + return positionData.reduce( + ( + stats, + { key, supply, borrow, borrowStable, priceInEth, factor, liquidation } + ) => { + if (key === "eth") { + stats.ethSupplied = supply; + } + + const borrowTotal = new BigNumber(borrow).plus(borrowStable); + + stats.totalSupplyInEth = new BigNumber(supply) + .times(priceInEth) + .plus(stats.totalSupplyInEth) + .toFixed(); + stats.totalBorrowInEth = new BigNumber(borrowTotal) + .times(priceInEth) + .plus(stats.totalBorrowInEth) + .toFixed(); + + stats.totalMaxBorrowLimitInEth = new BigNumber(priceInEth) + .times(factor) + .times(supply) + .plus(stats.totalMaxBorrowLimitInEth) + .toFixed(); + + stats.totalMaxLiquidationLimitInEth = new BigNumber(priceInEth) + .times(liquidation) + .times(supply) + .plus(stats.totalMaxLiquidationLimitInEth) + .toFixed(); + + return stats; + }, + { + totalSupplyInEth: "0", + totalBorrowInEth: "0", + totalMaxBorrowLimitInEth: "0", + totalMaxLiquidationLimitInEth: "0" + } + ); +}; diff --git a/core/strategies/protocols/compound/deposit-and-borrow.ts b/core/strategies/protocols/compound/deposit-and-borrow.ts new file mode 100644 index 0000000..12d9a89 --- /dev/null +++ b/core/strategies/protocols/compound/deposit-and-borrow.ts @@ -0,0 +1,317 @@ +import BigNumber from "bignumber.js"; +import { + defineStrategy, + defineStrategyComponent, + StrategyComponentType, + StrategyProtocol +} from "../../helpers"; + +export default defineStrategy({ + protocol: StrategyProtocol.COMPOUND, + name: "Deposit & Borrow", + description: "Deposit collateral & borrow asset in a single txn.", + + details: `

This strategy executes:

+
    +
  • Deposit collateral
  • +
  • Borrow Debt
  • +
`, + + submitText: "Deposit & Borrow", + + author: "Instadapp Team", + + variables: { + collateralTokenKey: "eth", + debtTokenKey: "dai" + }, + + components: [ + defineStrategyComponent({ + type: StrategyComponentType.INPUT_WITH_TOKEN, + name: "Collateral", + placeholder: ({ component: input }) => + input.token ? `${input.token.symbol} to Deposit` : "", + validate: ({ component: input, dsaBalances, toBN }) => { + if (!input.token) { + return "Collateral token is required"; + } + + if (!input.value) { + return "Collateral amount is required"; + } + + const collateralBalance = toBN( + dsaBalances[input.token.address]?.balance + ); + + if (toBN(collateralBalance).lt(input.value)) { + const collateralBalanceFormatted = collateralBalance.toFixed(2); + return `Your amount exceeds your maximum limit of ${collateralBalanceFormatted} ${input.token.symbol}`; + } + }, + defaults: ({ getTokenByKey, variables }) => ({ + token: getTokenByKey?.(variables.collateralTokenKey) + }) + }), + + defineStrategyComponent({ + type: StrategyComponentType.INPUT_WITH_TOKEN, + name: "Debt", + placeholder: ({ component: input }) => + input.token ? `${input.token.symbol} to Borrow` : "", + validate: ({ component: input }) => { + if (!input.token) { + return "Debt token is required"; + } + + if (!input.value) { + return "Debt amount is required"; + } + }, + defaults: ({ getTokenByKey, variables }) => ({ + token: getTokenByKey?.(variables.debtTokenKey) + }) + }), + defineStrategyComponent({ + type: StrategyComponentType.HEADING, + name: "Projected Debt Position" + }), + defineStrategyComponent({ + type: StrategyComponentType.STATUS, + name: "Status", + update: ({ position, component, components, toBN, tokenIdMapping }) => { + if ( + toBN(components[0].value).isZero() && + toBN(components[1].value).isZero() + ) { + return; + } + + if (!position) { + return; + } + + const newPositionData = changedPositionData(position, components, tokenIdMapping.tokenToId); + const stats = calculateStats(newPositionData); + + component.liquidation = BigNumber.max( + toBN(stats.totalMaxBorrowLimitInEth).div(stats.totalSupplyInEth), + "0" + ).toFixed(); + component.status = BigNumber.max( + toBN(stats.totalBorrowInEth).div(stats.totalSupplyInEth), + "0" + ).toFixed(); + } + }), + defineStrategyComponent({ + type: StrategyComponentType.VALUE, + name: "LIQUIDATION PRICE (IN ETH)", + value: "-", + update: ({ + position, + component, + components, + toBN, + formatting, + tokenIdMapping + }) => { + if (!position) { + return; + } + + const newPositionData = changedPositionData( + position, + components, + tokenIdMapping.tokenToId + ); + const initialStats = calculateStats(position.data); + const newStats = calculateStats(newPositionData); + + const stats = + toBN(components[0].value).isZero() && + toBN(components[1].value).isZero() + ? initialStats + : newStats; + + let liquidationPrice = "0"; + if (!toBN(stats.ethSupplied).isZero()) { + liquidationPrice = BigNumber.max( + toBN(stats.totalBorrowInEth) + .div(stats.totalMaxBorrowLimitInEth) + .times(position.ethPriceInUsd), + "0" + ).toFixed(); + } + + component.value = `${formatting.formatUsdMax( + liquidationPrice, + position.ethPriceInUsd + )} / ${formatting.formatUsd(position.ethPriceInUsd)}`; + } + }) + ], + + validate: async ({ position, components: inputs, toBN, tokenIdMapping }) => { + if (toBN(inputs[0].value).isZero() && toBN(inputs[1].value).isZero()) { + return; + } + const { tokenToId } = tokenIdMapping; + + const newPositionData = position.data.map(position => { + const changedPosition = { ...position }; + if (tokenToId.compound[inputs[1].token.key] === position.cTokenId) { + changedPosition.borrow = BigNumber.max( + toBN(position.borrow).plus(inputs[1].value), + "0" + ).toFixed(); + } + + if (tokenToId.compound[inputs[0].token.key] === position.cTokenId) { + changedPosition.supply = BigNumber.max( + toBN(position.supply).plus(inputs[0].value), + "0" + ).toFixed(); + } + + return changedPosition; + }); + + const stats = newPositionData.reduce( + (stats, { key, supply, borrow, priceInEth, factor }) => { + if (key === "eth") { + stats.ethSupplied = supply; + } + + stats.totalSupplyInEth = toBN(supply) + .times(priceInEth) + .plus(stats.totalSupplyInEth) + .toFixed(); + stats.totalBorrowInEth = toBN(borrow) + .times(priceInEth) + .plus(stats.totalBorrowInEth) + .toFixed(); + + stats.totalMaxBorrowLimitInEth = toBN(priceInEth) + .times(factor) + .times(supply) + .plus(stats.totalMaxBorrowLimitInEth) + .toFixed(); + + return stats; + }, + { + totalSupplyInEth: "0", + totalBorrowInEth: "0", + totalMaxBorrowLimitInEth: "0", + ethSupplied: "0" + } + ); + + let liquidation = "0"; + if (!toBN(stats.totalSupplyInEth).isZero()) { + liquidation = BigNumber.max( + toBN(stats.totalMaxBorrowLimitInEth).div(stats.totalSupplyInEth), + "0" + ).toFixed(); + } + + const status = BigNumber.max( + toBN(stats.totalBorrowInEth).div(stats.totalSupplyInEth), + "0" + ); + + if (status.gt(toBN(liquidation).minus("0.0001"))) { + return "Position will liquidate."; + } + }, + + spells: async ({ + components: inputs, + convertTokenAmountToWei, + tokenIdMapping + }) => { + const { tokenToId } = tokenIdMapping; + + const collateralTokenId = tokenToId.compound[inputs[0].token.key]; + const debtTokenId = tokenToId.compound[inputs[1].token.key]; + + return [ + { + connector: "compound", + method: "deposit", + args: [ + collateralTokenId, + convertTokenAmountToWei(inputs[0].value, inputs[0].token.decimals), + 0, + 0 + ] + }, + { + connector: "compound", + method: "borrow", + args: [ + debtTokenId, + convertTokenAmountToWei(inputs[1].value, inputs[1].token.decimals), + 0, + 0 + ] + } + ]; + } +}); + +const changedPositionData = (position, inputs, tokenToId) => { + return position.data.map(position => { + const changedPosition = { ...position }; + if (tokenToId.compound[inputs[1].token.key] === position.cTokenId) { + changedPosition.borrow = BigNumber.max( + new BigNumber(position.borrow).plus(inputs[1].value), + "0" + ).toFixed(); + } + + if (tokenToId.compound[inputs[0].token.key] === position.cTokenId) { + changedPosition.supply = BigNumber.max( + new BigNumber(position.supply).plus(inputs[0].value), + "0" + ).toFixed(); + } + + return changedPosition; + }); +}; + +const calculateStats = positionData => { + return positionData.reduce( + (stats, { key, supply, borrow, priceInEth, factor }) => { + if (key === "eth") { + stats.ethSupplied = supply; + } + + stats.totalSupplyInEth = new BigNumber(supply) + .times(priceInEth) + .plus(stats.totalSupplyInEth) + .toFixed(); + stats.totalBorrowInEth = new BigNumber(borrow) + .times(priceInEth) + .plus(stats.totalBorrowInEth) + .toFixed(); + + stats.totalMaxBorrowLimitInEth = new BigNumber(priceInEth) + .times(factor) + .times(supply) + .plus(stats.totalMaxBorrowLimitInEth) + .toFixed(); + + return stats; + }, + { + totalSupplyInEth: "0", + totalBorrowInEth: "0", + totalMaxBorrowLimitInEth: "0", + ethSupplied: "0" + } + ); +}; diff --git a/core/strategies/protocols/compound/index.ts b/core/strategies/protocols/compound/index.ts new file mode 100644 index 0000000..7a63aaa --- /dev/null +++ b/core/strategies/protocols/compound/index.ts @@ -0,0 +1,8 @@ +import depositAndBorrow from "./deposit-and-borrow" +import paybackAndWithdraw from "./payback-and-withdraw" + +export default [ + depositAndBorrow, + paybackAndWithdraw, +] + \ No newline at end of file diff --git a/core/strategies/protocols/compound/payback-and-withdraw.ts b/core/strategies/protocols/compound/payback-and-withdraw.ts new file mode 100644 index 0000000..13a4d64 --- /dev/null +++ b/core/strategies/protocols/compound/payback-and-withdraw.ts @@ -0,0 +1,307 @@ +import BigNumber from "bignumber.js"; +import { + defineStrategy, + defineStrategyComponent, + StrategyComponentType, + StrategyProtocol +} from "../../helpers"; + +export default defineStrategy({ + protocol: StrategyProtocol.COMPOUND, + name: "Payback & Withdraw", + description: "Payback debt & withdraw collateral in a single txn.", + author: "Instadapp Team", + + submitText: "Payback & Withdraw", + + details: `

This strategy executes:

+
    +
  • Payback debt
  • +
  • Withdraw collateral
  • +
`, + + components: [ + defineStrategyComponent({ + type: StrategyComponentType.INPUT_WITH_TOKEN, + name: "Debt", + placeholder: ({ component: input }) => + input.token ? `${input.token.symbol} to Payback` : "", + validate: ({ component: input, toBN, dsaBalances }) => { + if (!input.token) { + return "Debt token is required"; + } + + const balance = toBN(dsaBalances[input.token.address]?.balance); + + if (toBN(balance).lt(input.value)) { + return "You don't have enough balance to payback."; + } + }, + defaults: ({ getTokenByKey }) => ({ + token: getTokenByKey?.("dai") + }) + }), + defineStrategyComponent({ + type: StrategyComponentType.INPUT_WITH_TOKEN, + name: "Collateral", + placeholder: ({ component: input }) => + input.token ? `${input.token.symbol} to Withdraw` : "", + validate: ({ component: input, position, toBN, tokenIdMapping }) => { + if (!input.token) { + return "Collateral token is required"; + } + + if (!input.value) { + return "Collateral amount is required"; + } + + const { tokenToId } = tokenIdMapping; + + if (position) { + const collateralBalance = toBN( + position.data.find( + pos => pos.cTokenId === tokenToId.compound[input.token.key] + )?.supply || "0" + ); + + if (collateralBalance.lt(input.value)) { + const collateralBalanceFormatted = collateralBalance.toFixed( + 2, + BigNumber.ROUND_FLOOR + ); + return `Your amount exceeds your maximum limit of ${collateralBalanceFormatted} ${input.token.symbol}`; + } + } + }, + defaults: ({ getTokenByKey }) => ({ + token: getTokenByKey?.("eth") + }) + }), + defineStrategyComponent({ + type: StrategyComponentType.HEADING, + name: "Projected Debt Position" + }), + defineStrategyComponent({ + type: StrategyComponentType.STATUS, + name: "Status", + update: ({ position, component, components, toBN, tokenIdMapping }) => { + if ( + toBN(components[0].value).isZero() && + toBN(components[1].value).isZero() + ) { + return; + } + + if (!position) { + return; + } + + const newPositionData = changedPositionData(position, components, tokenIdMapping.tokenToId); + const stats = calculateStats(newPositionData); + + component.liquidation = BigNumber.max( + toBN(stats.totalMaxLiquidationLimitInEth).div(stats.totalSupplyInEth), + "0" + ).toFixed(); + component.status = BigNumber.max( + toBN(stats.totalBorrowInEth).div(stats.totalSupplyInEth), + "0" + ).toFixed(); + } + }), + defineStrategyComponent({ + type: StrategyComponentType.VALUE, + name: "LIQUIDATION PRICE (IN ETH)", + value: "-", + update: ({ position, component, components, toBN, formatting, tokenIdMapping }) => { + if (!position) { + return; + } + + const newPositionData = changedPositionData(position, components, tokenIdMapping.tokenToId); + const initialStats = calculateStats(position.data); + const newStats = calculateStats(newPositionData); + + const stats = + toBN(components[0].value).isZero() && + toBN(components[1].value).isZero() + ? initialStats + : newStats; + + let liquidationPrice = "0"; + if (!toBN(stats.ethSupplied).isZero()) { + liquidationPrice = BigNumber.max( + toBN(stats.totalBorrowInEth) + .div(stats.totalMaxBorrowLimitInEth) + .times(position.ethPriceInUsd), + "0" + ).toFixed(); + } + + component.value = `${formatting.formatUsdMax( + liquidationPrice, + position.ethPriceInUsd + )} / ${formatting.formatUsd(position.ethPriceInUsd)}`; + } + }) + ], + + validate: async ({ position, components: inputs, toBN, tokenIdMapping }) => { + if (toBN(inputs[0].value).isZero() && toBN(inputs[1].value).isZero()) { + return; + } + const { tokenToId } = tokenIdMapping; + + const newPositionData = position.data.map(position => { + const changedPosition = { ...position }; + if (tokenToId.compound[inputs[0].token.key] === position.cTokenId) { + changedPosition.borrow = BigNumber.max( + toBN(position.borrow).minus(inputs[0].value), + "0" + ).toFixed(); + } + + if (tokenToId.compound[inputs[1].token.key] === position.cTokenId) { + changedPosition.supply = BigNumber.max( + toBN(position.supply).minus(inputs[1].value), + "0" + ).toFixed(); + } + + return changedPosition; + }); + + const stats = newPositionData.reduce( + (stats, { key, supply, borrow, priceInEth, factor }) => { + if (key === "eth") { + stats.ethSupplied = supply; + } + + stats.totalSupplyInEth = toBN(supply) + .times(priceInEth) + .plus(stats.totalSupplyInEth) + .toFixed(); + stats.totalBorrowInEth = toBN(borrow) + .times(priceInEth) + .plus(stats.totalBorrowInEth) + .toFixed(); + + stats.totalMaxBorrowLimitInEth = toBN(priceInEth) + .times(factor) + .times(supply) + .plus(stats.totalMaxBorrowLimitInEth) + .toFixed(); + + return stats; + }, + { + totalSupplyInEth: "0", + totalBorrowInEth: "0", + totalMaxBorrowLimitInEth: "0", + ethSupplied: '0', + } + ); + + let liquidation = "0"; + + if (!toBN(stats.totalSupplyInEth).isZero()) { + liquidation = BigNumber.max( + toBN(stats.totalMaxBorrowLimitInEth).div(stats.totalSupplyInEth), + "0" + ).toFixed(); + } + + const status = BigNumber.max( + toBN(stats.totalBorrowInEth).div(stats.totalSupplyInEth), + "0" + ); + + if (status.gt(toBN(liquidation).minus("0.0001"))) { + return "Position will liquidate."; + } + }, + + spells: async ({ components: inputs, convertTokenAmountToWei, tokenIdMapping }) => { + const { tokenToId } = tokenIdMapping; + + const debtTokenId = tokenToId.compound[inputs[0].token.key]; + const collateralTokenId = tokenToId.compound[inputs[1].token.key]; + + return [ + { + connector: "compound", + method: "payback", + args: [ + debtTokenId, + convertTokenAmountToWei(inputs[0].value, inputs[0].token.decimals), + 0, + 0 + ] + }, + { + connector: "compound", + method: "withdraw", + args: [ + collateralTokenId, + convertTokenAmountToWei(inputs[1].value, inputs[1].token.decimals), + 0, + 0 + ] + } + ]; + } +}); + +const changedPositionData = (position, inputs, tokenToId) => { + return position.data.map(position => { + const changedPosition = { ...position }; + if (tokenToId.compound[inputs[0].token.key] === position.cTokenId) { + changedPosition.borrow = BigNumber.max( + new BigNumber(position.borrow).minus(inputs[0].value), + "0" + ).toFixed(); + } + + if (tokenToId.compound[inputs[1].token.key] === position.cTokenId) { + changedPosition.supply = BigNumber.max( + new BigNumber(position.supply).minus(inputs[1].value), + "0" + ).toFixed(); + } + + return changedPosition; + }); +}; + +const calculateStats = positionData => { + return positionData.reduce( + (stats, { key, supply, borrow, priceInEth, factor }) => { + if (key === "eth") { + stats.ethSupplied = supply; + } + + stats.totalSupplyInEth = new BigNumber(supply) + .times(priceInEth) + .plus(stats.totalSupplyInEth) + .toFixed(); + stats.totalBorrowInEth = new BigNumber(borrow) + .times(priceInEth) + .plus(stats.totalBorrowInEth) + .toFixed(); + + stats.totalMaxBorrowLimitInEth = new BigNumber(priceInEth) + .times(factor) + .times(supply) + .plus(stats.totalMaxBorrowLimitInEth) + .toFixed(); + + return stats; + }, + { + totalSupplyInEth: "0", + totalBorrowInEth: "0", + totalMaxBorrowLimitInEth: "0", + ethSupplied: "0" + } + ); +}; diff --git a/core/strategies/protocols/liquity/close-trove.ts b/core/strategies/protocols/liquity/close-trove.ts new file mode 100644 index 0000000..616d15b --- /dev/null +++ b/core/strategies/protocols/liquity/close-trove.ts @@ -0,0 +1,104 @@ +import { + defineStrategy, + StrategyProtocol, + StrategyComponentType, + defineStrategyComponent +} from "../../helpers"; + +export default defineStrategy({ + protocol: StrategyProtocol.LIQUITY, + name: "Close Trove", + description: + "Close trove: Payback debt, withdraw Collateral & Liquidation Reserve.", + author: "Instadapp Team", + + submitText: "Close Trove", + + details: `

This strategy executes:

+
    +
  • Close Trove
  • +
`, + + components: [ + defineStrategyComponent({ + type: StrategyComponentType.HEADING, + name: "Payback" + }), + defineStrategyComponent({ + type: StrategyComponentType.VALUE, + name: "Net Debt", + update: ({ position, positionExtra, component, formatting, toBN }) => { + const troveOverallDetails = positionExtra["troveOverallDetails"]; + + const netDebt = toBN(position.debt).minus( + troveOverallDetails.liquidationReserve + ); + + component.value = `${formatting.formatDecimal(netDebt, 2)} LUSD`; + } + }), + defineStrategyComponent({ + type: StrategyComponentType.HEADING, + name: "Withdraw" + }), + defineStrategyComponent({ + type: StrategyComponentType.VALUE, + name: "Collateral", + update: ({ position, component, formatting }) => { + component.value = `${formatting.formatDecimal(position.collateral, 2)} ETH`; + } + }), + defineStrategyComponent({ + type: StrategyComponentType.VALUE, + name: "Liquidation Reserve", + update: ({ positionExtra, component, formatting }) => { + const troveOverallDetails = positionExtra["troveOverallDetails"]; + component.value = `${formatting.formatDecimal( + troveOverallDetails.liquidationReserve, + 2 + )} LUSD`; + } + }) + ], + + validate: async ({ + position, + positionExtra, + toBN, + getTokenByKey, + dsaBalances + }) => { + const troveOpened = + !toBN(position.collateral).isZero() && !toBN(position.debt).isZero(); + + if (!troveOpened) { + return "You should open new trove first"; + } + + const troveOverallDetails = positionExtra["troveOverallDetails"]; + + const netDebt = toBN(position.debt).minus( + troveOverallDetails.liquidationReserve + ); + + const debtToken = getTokenByKey("lusd"); + const debtTokenBalance = dsaBalances[debtToken.address].balance; + + if (toBN(position.debt).gt(debtTokenBalance)) { + const lackOfBalance = netDebt.minus(debtTokenBalance).toPrecision(6, 0); + return `You need ${lackOfBalance} ${debtToken.symbol} more to close your Trove.`; + } + }, + + spells: async () => { + const setId = 0; + + return [ + { + connector: "LIQUITY-A", + method: "close", + args: [setId] + } + ]; + } +}); diff --git a/core/strategies/protocols/liquity/deposit-and-borrow.ts b/core/strategies/protocols/liquity/deposit-and-borrow.ts new file mode 100644 index 0000000..addab1a --- /dev/null +++ b/core/strategies/protocols/liquity/deposit-and-borrow.ts @@ -0,0 +1,284 @@ +import BigNumber from "bignumber.js"; +import abis from "~/constant/abis"; +import addresses from "~/constant/addresses"; +import { + defineStrategy, + defineStrategyComponent, + StrategyComponentType, + StrategyProtocol +} from "../../helpers"; + +export default defineStrategy({ + protocol: StrategyProtocol.LIQUITY, + name: "Deposit & Borrow", + description: "Deposit collateral & borrow asset in a single txn.", + + details: `

This strategy executes:

+
    +
  • Deposit ETH as collateral
  • +
  • Borrow LUSD as Debt
  • +
`, + + submitText: "Deposit & Borrow", + + author: "Instadapp Team", + + variables: { + collateralTokenKey: "eth", + debtTokenKey: "lusd" + }, + + components: [ + defineStrategyComponent({ + type: StrategyComponentType.INPUT_WITH_TOKEN, + name: "Collateral", + placeholder: ({ component: input }) => + input.token ? `${input.token.symbol} to Deposit` : "", + validate: ({ component: input, dsaBalances, toBN }) => { + if (!input.token) { + return "Collateral token is required"; + } + + if (!input.value) { + return "Collateral amount is required"; + } + + const collateralBalance = toBN( + dsaBalances[input.token.address]?.balance + ); + + if (toBN(collateralBalance).lt(input.value)) { + const collateralBalanceFormatted = collateralBalance.toFixed(2); + return `Your amount exceeds your maximum limit of ${collateralBalanceFormatted} ${input.token.symbol}`; + } + }, + defaults: ({ getTokenByKey, variables }) => ({ + token: getTokenByKey?.(variables.collateralTokenKey) + }) + }), + + defineStrategyComponent({ + type: StrategyComponentType.INPUT_WITH_TOKEN, + name: "Debt", + placeholder: ({ component: input }) => + input.token ? `${input.token.symbol} to Borrow` : "", + validate: ({ component: input, toBN, position, positionExtra }) => { + if (!input.token) { + return "Debt token is required"; + } + + if (!input.value) { + return "Debt amount is required"; + } + + const troveOverallDetails = positionExtra["troveOverallDetails"]; + + const borrowFeeAmount = toBN(input.value) + .times(troveOverallDetails.borrowFee) + .toFixed(); + + const debtInputAmountWithFee = toBN(input.value) + .plus(borrowFeeAmount) + .toFixed(); + + const changedDebt = toBN(position.debt).plus(debtInputAmountWithFee); + + const totalDebt = toBN(changedDebt).plus( + troveOverallDetails.liquidationReserve + ); + + if (totalDebt.isZero()) + return `Minimum total debt requirement is ${troveOverallDetails.minDebt} LUSD`; + + if (totalDebt.lt(troveOverallDetails.minDebt) && totalDebt.gt("0")) { + return `Minimum total debt requirement is ${troveOverallDetails.minDebt} LUSD`; + } + }, + defaults: ({ getTokenByKey, variables }) => ({ + token: getTokenByKey?.(variables.debtTokenKey) + }) + }), + defineStrategyComponent({ + type: StrategyComponentType.HEADING, + name: "Projected Debt Position" + }), + defineStrategyComponent({ + type: StrategyComponentType.STATUS, + name: "Status", + update: ({ position, positionExtra, component, components, toBN }) => { + if ( + toBN(components[0].value).isZero() && + toBN(components[1].value).isZero() + ) { + return; + } + + if (!position && !positionExtra) { + return; + } + + const troveOverallDetails = positionExtra["troveOverallDetails"]; + + component.liquidation = troveOverallDetails.liquidation; + component.status = + toBN(components[0].value).isZero() && + !toBN(components[1].value).isZero() + ? "1.1" + : toBN(components[1].value) + .div(toBN(components[0].value).times(position.price)) + .toFixed(); + } + }), + defineStrategyComponent({ + type: StrategyComponentType.VALUE, + name: "LIQUIDATION PRICE (IN ETH)", + value: "-", + update: ({ + position, + component, + components, + toBN, + formatting, + positionExtra + }) => { + if (!position && !positionExtra) { + return; + } + + const troveOverallDetails = positionExtra["troveOverallDetails"]; + + let liquidationPrice = + toBN(components[0].value).isZero() && + !toBN(components[1].value).isZero() + ? toBN(position.price) + .times("1.1") + .toFixed() + : BigNumber.max( + toBN(components[1].value) + .div(components[0].value) + .div(troveOverallDetails.liquidation), + "0" + ).toFixed(); + + component.value = `${formatting.formatUsdMax( + isNaN(parseInt(liquidationPrice)) ? "0" : liquidationPrice, + position.price + )} / ${formatting.formatUsd(position.price)}`; + } + }) + ], + + validate: async ({ position, positionExtra, components: inputs, toBN }) => { + if (toBN(inputs[0].value).isZero() && toBN(inputs[1].value).isZero()) { + return; + } + const troveOpened = + !toBN(position.collateral).isZero() && !toBN(position.debt).isZero(); + + if (!troveOpened) { + return "You should open new trove first"; + } + + // const troveOverallDetails = positionExtra["troveOverallDetails"]; + + // const status = + // toBN(inputs[0].value).isZero() && !toBN(inputs[1].value).isZero() + // ? toBN("1.1") + // : toBN(inputs[0].value) + // .times(position.price) + // .div(inputs[1].value); + + // console.log(status.toFixed(), troveOverallDetails.liquidation); + + // if (status.gt(toBN(troveOverallDetails.liquidation).minus("0.0001"))) { + // return "Position will liquidate."; + // } + }, + + spells: async ({ + components: inputs, + position, + positionExtra, + getTokenByKey, + convertTokenAmountToWei, + web3, + toBN + }) => { + const troveOverallDetails = positionExtra["troveOverallDetails"]; + const collateralToken = getTokenByKey("eth"); + const collateralInWei = convertTokenAmountToWei( + position.collateral, + collateralToken.decimals + ); + + const depositAmountInWei = convertTokenAmountToWei( + inputs[0].value, + inputs[0].token.decimals + ); + const totalDepositAmountInWei = toBN(depositAmountInWei) + .plus(collateralInWei) + .toFixed(); + + const borrowFeeAmount = toBN(inputs[1].value) + .times(troveOverallDetails.borrowFee) + .toFixed(); + const debtInputAmountWithFee = toBN(inputs[1].value) + .plus(borrowFeeAmount) + .toFixed(); + const changedDebt = toBN(position.debt) + .plus(debtInputAmountWithFee) + .toFixed(); + const borrowAmountInWei = convertTokenAmountToWei( + inputs[1].value, + inputs[1].value.decimals + ); + const totalBorrowAmountInWei = convertTokenAmountToWei( + changedDebt, + inputs[1].value.decimals + ); + + const withdrawAmountInWei = "0"; + const paybackAmountInWei = "0"; + + const liquityInstance = new web3.eth.Contract( + abis.resolver.liquity as any, + addresses.mainnet.resolver.liquity + ); + + const { + upperHint, + lowerHint + } = await liquityInstance.methods + .getTrovePositionHints( + totalDepositAmountInWei.toString(), + totalBorrowAmountInWei.toString(), + 0, + 0 + ) + .call(); + + const getIds = [0, 0, 0, 0]; + const setIds = [0, 0, 0, 0]; + + return [ + { + connector: "LIQUITY-A", + method: "adjust", + args: [ + toBN(troveOverallDetails.borrowFee) + .times("100") + .times("1e18") + .toFixed(), + depositAmountInWei, + withdrawAmountInWei, + borrowAmountInWei, + paybackAmountInWei, + upperHint, + lowerHint, + getIds, + setIds + ] + } + ]; + } +}); diff --git a/core/strategies/protocols/liquity/index.ts b/core/strategies/protocols/liquity/index.ts new file mode 100644 index 0000000..ca32db7 --- /dev/null +++ b/core/strategies/protocols/liquity/index.ts @@ -0,0 +1,10 @@ +import depositAndBorrow from "./deposit-and-borrow" +import paybackAndWithdraw from "./payback-and-withdraw" +import closeTrove from "./close-trove" + +export default [ + depositAndBorrow, + paybackAndWithdraw, + closeTrove, +] + \ No newline at end of file diff --git a/core/strategies/protocols/liquity/payback-and-withdraw.ts b/core/strategies/protocols/liquity/payback-and-withdraw.ts new file mode 100644 index 0000000..6141c53 --- /dev/null +++ b/core/strategies/protocols/liquity/payback-and-withdraw.ts @@ -0,0 +1,275 @@ +import BigNumber from "bignumber.js"; +import abis from "~/constant/abis"; +import addresses from "~/constant/addresses"; +import { + defineStrategy, + defineStrategyComponent, + StrategyComponentType, + StrategyProtocol +} from "../../helpers"; + +export default defineStrategy({ + protocol: StrategyProtocol.LIQUITY, + name: "Payback & Withdraw", + description: "Payback debt & withdraw collateral in a single txn.", + author: "Instadapp Team", + + submitText: "Payback & Withdraw", + + details: `

This strategy executes:

+
    +
  • Payback debt
  • +
  • Withdraw collateral
  • +
`, + + components: [ + defineStrategyComponent({ + type: StrategyComponentType.INPUT_WITH_TOKEN, + name: "Debt", + placeholder: ({ component: input }) => + input.token ? `${input.token.symbol} to Payback` : "", + validate: ({ component: input, toBN, position, positionExtra }) => { + if (!input.token) { + return "Debt token is required"; + } + + if (!input.value) { + return "Debt amount is required"; + } + + const troveOverallDetails = positionExtra["troveOverallDetails"]; + + const borrowFeeAmount = toBN(input.value) + .times(troveOverallDetails.borrowFee) + .toFixed(); + + const debtInputAmountWithFee = toBN(input.value) + .plus(borrowFeeAmount) + .toFixed(); + + const changedDebt = toBN(position.debt).plus(debtInputAmountWithFee); + + const totalDebt = toBN(changedDebt).plus( + troveOverallDetails.liquidationReserve + ); + + if (totalDebt.isZero()) + return `Minimum total debt requirement is ${troveOverallDetails.minDebt} LUSD`; + + if (totalDebt.lt(troveOverallDetails.minDebt) && totalDebt.gt("0")) { + return `Minimum total debt requirement is ${troveOverallDetails.minDebt} LUSD`; + } + }, + defaults: ({ getTokenByKey }) => ({ + token: getTokenByKey?.("lusd") + }) + }), + defineStrategyComponent({ + type: StrategyComponentType.INPUT_WITH_TOKEN, + name: "Collateral", + placeholder: ({ component: input }) => + input.token ? `${input.token.symbol} to Withdraw` : "", + validate: ({ component: input, dsaBalances, toBN }) => { + if (!input.token) { + return "Collateral token is required"; + } + + if (!input.value) { + return "Collateral amount is required"; + } + + const collateralBalance = toBN( + dsaBalances[input.token.address]?.balance + ); + + if (toBN(collateralBalance).lt(input.value)) { + const collateralBalanceFormatted = collateralBalance.toFixed(2); + return `Your amount exceeds your maximum limit of ${collateralBalanceFormatted} ${input.token.symbol}`; + } + }, + defaults: ({ getTokenByKey }) => ({ + token: getTokenByKey?.("eth") + }) + }), + defineStrategyComponent({ + type: StrategyComponentType.HEADING, + name: "Projected Debt Position" + }), + defineStrategyComponent({ + type: StrategyComponentType.STATUS, + name: "Status", + update: ({ position, positionExtra, component, components, toBN }) => { + if (!position && !positionExtra) { + return; + } + const troveOverallDetails = positionExtra["troveOverallDetails"]; + component.liquidation = troveOverallDetails.liquidation; + + if ( + toBN(components[1].value).isZero() || + !components[1].value || + toBN(components[0].value).isZero() || + !components[0].value + ) { + component.status = position.ratio; + } else { + const changedDebt = BigNumber.max(toBN(position.debt).minus(components[0].value), '0') + const changedCollateral = toBN(position.collateral).minus(components[1].value); + + component.status = changedDebt + .div(toBN(changedCollateral).times(position.price)) + .toFixed(); + } + } + }), + defineStrategyComponent({ + type: StrategyComponentType.VALUE, + name: "LIQUIDATION PRICE (IN ETH)", + value: "-", + update: ({ + position, + component, + components, + toBN, + formatting, + positionExtra + }) => { + if (!position && !positionExtra) { + return; + } + + const troveOverallDetails = positionExtra["troveOverallDetails"]; + + let liquidationPrice = "0"; + if ( + toBN(components[1].value).isZero() || + !components[1].value || + toBN(components[0].value).isZero() || + !components[0].value + ) { + liquidationPrice = BigNumber.max( + toBN(position.debt) + .div(position.collateral) + .div(troveOverallDetails.liquidation), + "0" + ).toFixed(); + } else { + + const changedDebt = BigNumber.max(toBN(position.debt).minus(components[0].value), '0') + const changedCollateral = toBN(position.collateral).minus(components[1].value); + + liquidationPrice = BigNumber.max( + toBN(changedDebt) + .div(changedCollateral) + .div(troveOverallDetails.liquidation), + "0" + ).toFixed(); + } + + component.value = `${formatting.formatUsdMax( + isNaN(parseInt(liquidationPrice)) ? "0" : liquidationPrice, + position.price + )} / ${formatting.formatUsd(position.price)}`; + } + }) + ], + + validate: async ({ position, components: inputs, toBN }) => { + if (toBN(inputs[0].value).isZero() && toBN(inputs[1].value).isZero()) { + return; + } + const troveOpened = + !toBN(position.collateral).isZero() && !toBN(position.debt).isZero(); + + if (!troveOpened) { + return "You should open new trove first"; + } + }, + + spells: async ({ + components: inputs, + position, + positionExtra, + getTokenByKey, + convertTokenAmountToWei, + web3, + toBN + }) => { + const troveOverallDetails = positionExtra["troveOverallDetails"]; + const collateralToken = getTokenByKey("eth"); + const collateralInWei = convertTokenAmountToWei( + position.collateral, + collateralToken.decimals + ); + + const withdrawAmountInWei = convertTokenAmountToWei( + inputs[0].value, + inputs[0].token.decimals + ); + const totalDepositAmountInWei = toBN(withdrawAmountInWei) + .plus(collateralInWei) + .toFixed(); + + const borrowFeeAmount = toBN(inputs[1].value) + .times(troveOverallDetails.borrowFee) + .toFixed(); + const debtInputAmountWithFee = toBN(inputs[1].value) + .plus(borrowFeeAmount) + .toFixed(); + const changedDebt = toBN(position.debt) + .plus(debtInputAmountWithFee) + .toFixed(); + const paybackAmountInWei = convertTokenAmountToWei( + inputs[1].value, + inputs[1].value.decimals + ); + const totalBorrowAmountInWei = convertTokenAmountToWei( + changedDebt, + inputs[1].value.decimals + ); + + const depositAmountInWei = "0"; + const borrowAmountInWei = "0"; + + const liquityInstance = new web3.eth.Contract( + abis.resolver.liquity as any, + addresses.mainnet.resolver.liquity + ); + + const { + upperHint, + lowerHint + } = await liquityInstance.methods + .getTrovePositionHints( + totalDepositAmountInWei.toString(), + totalBorrowAmountInWei.toString(), + 0, + 0 + ) + .call(); + + const getIds = [0, 0, 0, 0]; + const setIds = [0, 0, 0, 0]; + + return [ + { + connector: "LIQUITY-A", + method: "adjust", + args: [ + toBN(troveOverallDetails.borrowFee) + .times("100") + .times("1e18") + .toFixed(), + depositAmountInWei, + withdrawAmountInWei, + borrowAmountInWei, + paybackAmountInWei, + upperHint, + lowerHint, + getIds, + setIds + ] + } + ]; + } +}); diff --git a/layouts/default.vue b/layouts/default.vue index ad29987..d60dd84 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -5,8 +5,13 @@
-
- +
+ + +
@@ -43,7 +48,10 @@ -
+
-
-
+
+
- +
+ +
+

Aave v2

-

Aave v2

+ + + Strategies + + + + +
@@ -166,12 +191,14 @@ import { useStatus } from "~/composables/useStatus"; import { useBigNumber } from "~/composables/useBigNumber"; import CardAave from "~/components/protocols/CardAave.vue"; import AaveIcon from "~/assets/icons/aave.svg?inline"; +import ButtonCTAOutlined from "~/components/common/input/ButtonCTAOutlined.vue"; export default defineComponent({ components: { BackIcon, CardAave, - AaveIcon + AaveIcon, + ButtonCTAOutlined, }, setup() { const { diff --git a/pages/mainnet/aave-v2.vue b/pages/mainnet/aave-v2.vue deleted file mode 100644 index 46501dc..0000000 --- a/pages/mainnet/aave-v2.vue +++ /dev/null @@ -1,216 +0,0 @@ - - - diff --git a/pages/mainnet/compound.vue b/pages/mainnet/compound.vue index d4e8f2c..a8d6372 100644 --- a/pages/mainnet/compound.vue +++ b/pages/mainnet/compound.vue @@ -10,18 +10,43 @@
-
-
+
+
- +
+ +
+

Compound

-

Compound

+ + + Strategies + + + + +
@@ -163,13 +188,15 @@ import { useSearchFilter } from "~/composables/useSearchFilter"; import { useStatus } from "~/composables/useStatus"; import { useBigNumber } from "~/composables/useBigNumber"; import CardCompound from "~/components/protocols/CardCompound.vue"; -import CompoundIcon from '~/assets/icons/compound.svg?inline' +import CompoundIcon from "~/assets/icons/compound.svg?inline"; +import ButtonCTAOutlined from "~/components/common/input/ButtonCTAOutlined.vue"; export default defineComponent({ components: { BackIcon, CardCompound, CompoundIcon, + ButtonCTAOutlined, }, setup() { const { diff --git a/pages/mainnet/liquity.vue b/pages/mainnet/liquity.vue index c6b0714..b945dc6 100644 --- a/pages/mainnet/liquity.vue +++ b/pages/mainnet/liquity.vue @@ -10,18 +10,43 @@
-
-
+
+
- +
+ +
+

Liquity

-

Liquity

+ + + Strategies + + + + +
@@ -150,6 +175,7 @@ import { useFormatting } from "~/composables/useFormatting"; import { useStatus } from "~/composables/useStatus"; import { useBigNumber } from "~/composables/useBigNumber"; import CardLiquityTrove from "~/components/protocols/liquity/CardLiquityTrove.vue"; +import ButtonCTAOutlined from "~/components/common/input/ButtonCTAOutlined.vue"; export default defineComponent({ components: { @@ -159,7 +185,8 @@ export default defineComponent({ SVGAdd, SVGBalance, SVGPercent, - CardLiquityTrove + CardLiquityTrove, + ButtonCTAOutlined, }, setup() { const router = useRouter(); diff --git a/plugins/web3modal.js b/plugins/web3modal.js index 5db2d50..18f9f0b 100644 --- a/plugins/web3modal.js +++ b/plugins/web3modal.js @@ -1,5 +1,5 @@ import WalletConnectProvider from "@walletconnect/web3-provider"; -import { setProviders } from "~/composables/useWeb3" +import { setProviders } from "@instadapp/vue-web3" import WalletLink from 'walletlink' import Portis from '@portis/web3' import SVGcoinbase from '~/assets/coinbase.svg' diff --git a/tailwind.config.js b/tailwind.config.js index 240fc3e..f6a40cf 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -120,5 +120,6 @@ module.exports = { }, plugins: [ require('@tailwindcss/forms'), + require('@tailwindcss/typography'), ], } diff --git a/yarn.lock b/yarn.lock index 93d0124..ba64d91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1047,7 +1047,7 @@ "@ethersproject/properties" "^5.4.0" "@ethersproject/strings" "^5.4.0" -"@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.4.0": +"@ethersproject/keccak256@^5.0.0-beta.130", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A== @@ -1149,6 +1149,15 @@ resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-sdk/-/safe-apps-sdk-4.2.0.tgz#77069de1b4f3db724d1ded1fab39e1feacc7bc05" integrity sha512-GpaxIbi658+KLtJpTGq6qdpVkbW7OQUKh8i0uhZ04SiAoIAtR9QNbP7V04OvvuqhKjhvCnvh37mJH2RZ2zZHDA== +"@gnosis.pm/safe-apps-web3-react@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-web3-react/-/safe-apps-web3-react-0.6.2.tgz#6d3a08d666b314190c96a704302c3f2139d1db25" + integrity sha512-3+epb5hifBTv/7x4YMNzGZI9A8jh2OHPIoOYZ4L5qZuZqNPbjFMqAk35UgvBP0+3PoF3p0/xduj1enrkGa5c+A== + dependencies: + "@gnosis.pm/safe-apps-provider" "0.7.1" + "@gnosis.pm/safe-apps-sdk" "4.2.0" + "@web3-react/abstract-connector" "6.0.7" + "@gnosis.pm/safe-apps-web3modal@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-web3modal/-/safe-apps-web3modal-2.0.0.tgz#4da6ab5d62191d5454d3d8eecbfbb6daf38aa92b" @@ -1156,6 +1165,18 @@ dependencies: "@gnosis.pm/safe-apps-provider" "0.7.1" +"@instadapp/vue-web3@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@instadapp/vue-web3/-/vue-web3-0.3.0.tgz#1dd367e4ac29a56e9b0d8af714c3ff5447e2d4f8" + integrity sha512-qcYoCJ/YiWC8OpJWmo2IXQwcJNGCz9OG4x8GVBSQxOPYvLq0CLpchFXs3QfwzIzo5GN+QOmfJq4eGHES498vww== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-invariant "^1.1.0" + vue-demi "^0.11.3" + "@json-rpc-tools/types@^1.6.1": version "1.7.6" resolved "https://registry.yarnpkg.com/@json-rpc-tools/types/-/types-1.7.6.tgz#5abd5fde01364a130c46093b501715bcce5bdc0e" @@ -1592,17 +1613,17 @@ consola "^2.15.3" defu "^5.0.0" -"@nuxtjs/composition-api@^0.24.7": - version "0.24.7" - resolved "https://registry.yarnpkg.com/@nuxtjs/composition-api/-/composition-api-0.24.7.tgz#76ec3660a03cd7bdb8b85fd31e8dc6a2b7194e8f" - integrity sha512-q633RvsCi3veuGzTSkP/+a55Fn9EZS1APV2GJrdjajnBKKOMNPIXlAC8xAWGcsHE73/Cgf9DfGURQhcFvERRJA== +"@nuxtjs/composition-api@^0.27.0": + version "0.27.0" + resolved "https://registry.yarnpkg.com/@nuxtjs/composition-api/-/composition-api-0.27.0.tgz#cbe4df6a7306e4a34770fbad5b1ad79717f8fdb7" + integrity sha512-YtQ1KX+ls13zbukII8/vhKskoI1FrngDxegGVW31576qlaiEQUQGpOATF0cGrZ1W7Wgmz3rsAz1CNdSd5FFXOA== dependencies: - "@vue/composition-api" "1.0.0-rc.14" + "@vue/composition-api" "^1.1.1" defu "^5.0.0" estree-walker "^2.0.2" fs-extra "^9.1.0" magic-string "^0.25.7" - ufo "^0.7.7" + ufo "^0.7.9" upath "^2.0.1" "@nuxtjs/google-fonts@^1.3.0": @@ -1686,6 +1707,44 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.15.tgz#6a9d143f7f4f49db2d782f9e1c8839a29b43ae23" integrity sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA== +"@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.54": + 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" + "@portis/web3@^4.0.5": version "4.0.5" resolved "https://registry.yarnpkg.com/@portis/web3/-/web3-4.0.5.tgz#7931ac129c2ba7e75a8c451434fc5765bed1a5fe" @@ -1727,6 +1786,16 @@ dependencies: mini-svg-data-uri "^1.2.3" +"@tailwindcss/typography@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.4.1.tgz#51ddbceea6a0ee9902c649dbe58871c81a831212" + integrity sha512-ovPPLUhs7zAIJfr0y1dbGlyCuPhpuv/jpBoFgqAc658DWGGrOBWBMpAWLw2KlzbNeVk4YBJMzue1ekvIbdw6XA== + dependencies: + lodash.castarray "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + lodash.uniq "^4.5.0" + "@types/anymatch@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-3.0.0.tgz#c95ff14401dbb2869913afac3935af4ad0d37f1a" @@ -2213,10 +2282,10 @@ optionalDependencies: prettier "^1.18.2" -"@vue/composition-api@1.0.0-rc.14": - version "1.0.0-rc.14" - resolved "https://registry.yarnpkg.com/@vue/composition-api/-/composition-api-1.0.0-rc.14.tgz#4803fbccf3f3c770416e69095010c7bc0c4aa1c3" - integrity sha512-WKbOiy1zk8loM7ma88fOH0yacOEfMIQb0IZJEq561A+4C8GvLSqVSLT5K1iBVkzzJ07Pha8ntbeWSUQlBhRDKg== +"@vue/composition-api@^1.1.1": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@vue/composition-api/-/composition-api-1.1.4.tgz#b4cd566e575350b86c22fa02632e4a356ac2e26e" + integrity sha512-f618a79X0VepQUoZofaAYzaherBuzfIIYah4gQPcwmXgN3oeuGdhO7DY2s3Rjcw7r9yTEh5sQIowbNWy6INGjg== dependencies: tslib "^2.3.0" @@ -2251,6 +2320,17 @@ window-getters "1.0.0" window-metadata "1.0.0" +"@walletconnect/browser-utils@^1.6.5": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.6.5.tgz#01180682e90b95384e820191a1c6ad4a78729439" + integrity sha512-HLTysmlCkc2HN2OS6ewMG0v8E9oY2h9zNaDHe0BLN3ZxnsoMCVzkJxy7ryaXCemVdapmr6HgHFexGJoMbWaC4w== + dependencies: + "@walletconnect/safe-json" "1.0.0" + "@walletconnect/types" "^1.6.5" + "@walletconnect/window-getters" "1.0.0" + "@walletconnect/window-metadata" "1.0.0" + detect-browser "5.2.0" + "@walletconnect/client@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.4.1.tgz#c9c50df5afde23a35e23d96fe6d207c102e53850" @@ -2261,6 +2341,16 @@ "@walletconnect/types" "^1.4.1" "@walletconnect/utils" "^1.4.1" +"@walletconnect/client@^1.6.5": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.6.5.tgz#6616ae926abc7c87c48a2d3693f2eb697858e685" + integrity sha512-dRq1D3NEGwM2I3CpiwFsWy1rrdMKCMSfDUu3rCCXUE4zInx+pyq7IEFjYiSjtOEZzjRlUTqYwhjnYIezQZgh4w== + dependencies: + "@walletconnect/core" "^1.6.5" + "@walletconnect/iso-crypto" "^1.6.5" + "@walletconnect/types" "^1.6.5" + "@walletconnect/utils" "^1.6.5" + "@walletconnect/core@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.4.1.tgz#68310ee7c9737a7a0a7f1308abbfc1c31212b9a6" @@ -2270,6 +2360,39 @@ "@walletconnect/types" "^1.4.1" "@walletconnect/utils" "^1.4.1" +"@walletconnect/core@^1.6.5": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.6.5.tgz#acb687fc7c2d71ce2adad6a921ec1b343c4b4dd7" + integrity sha512-mmMTP8nZunjSCAy0ckafvt/JcdzcuSZPaAybqgKwx2rC9cc/3XWrdNsfiKMt8AFoQF87jGHem3905eFZYTqLXw== + dependencies: + "@walletconnect/socket-transport" "^1.6.5" + "@walletconnect/types" "^1.6.5" + "@walletconnect/utils" "^1.6.5" + +"@walletconnect/crypto@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.1.tgz#d4c1b1cd5dd1be88fe9a82dfc54cadbbb3f9d325" + integrity sha512-IgUReNrycIFxkGgq8YT9HsosCkhutakWD9Q411PR0aJfxpEa/VKJeaLRtoz6DvJpztWStwhIHnAbBoOVR72a6g== + dependencies: + "@walletconnect/encoding" "^1.0.0" + "@walletconnect/environment" "^1.0.0" + "@walletconnect/randombytes" "^1.0.1" + aes-js "^3.1.2" + hash.js "^1.1.7" + +"@walletconnect/encoding@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.0.tgz#e24190cb5e803526f9dfd7191fb0e4dc53c6d864" + integrity sha512-4nkJFnS0QF5JdieG/3VPD1/iEWkLSZ14EBInLZ00RWxmC6EMZrzAeHNAWIgm+xP3NK0lqz+7lEsmWGtcl5gYnQ== + dependencies: + is-typedarray "1.0.0" + 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/http-connection@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.4.1.tgz#a36d3645eea2606c876e3824b7d46549bf237833" @@ -2280,6 +2403,16 @@ eventemitter3 "4.0.7" xhr2-cookies "1.1.0" +"@walletconnect/http-connection@^1.6.5": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.6.5.tgz#18529b7556bc09d7c794f4adc76ef0742cd500aa" + integrity sha512-5kr6wZ3DnqaBiwkeA9iKdawvIb3bIJNf8WA8X89YHE5KOzbkAsymjniZWs8asdl9Y9+8ZHJMPXtylyrkpT8wXA== + dependencies: + "@walletconnect/types" "^1.6.5" + "@walletconnect/utils" "^1.6.5" + eventemitter3 "4.0.7" + xhr2-cookies "1.1.0" + "@walletconnect/iso-crypto@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.4.1.tgz#0d9793c679d6c5443c49cce83f5d8dd476a65df2" @@ -2289,6 +2422,30 @@ "@walletconnect/types" "^1.4.1" "@walletconnect/utils" "^1.4.1" +"@walletconnect/iso-crypto@^1.6.5": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.6.5.tgz#1c6471506283817e7e797c5e2e733f6c3d88f8dc" + integrity sha512-145VRX1+gudhHrnT2s81lLW/BEu3QgFMMRCrkxx9Tsl5JiLGcGbWkMxAl8zjGTMqnHeuQngyjvY1mO+3z27a7A== + dependencies: + "@walletconnect/crypto" "^1.0.1" + "@walletconnect/types" "^1.6.5" + "@walletconnect/utils" "^1.6.5" + +"@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" + 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" + integrity sha512-qUHbKUK6sHeHn67qtHZoLoYk5hS6x1arTPjKDRkY93/6Fx+ZmNIpdm1owX3l6aYueyegJ7mz43FpvYHUqJ8xcw== + dependencies: + "@walletconnect/environment" "^1.0.0" + "@walletconnect/jsonrpc-types" "^1.0.0" + "@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" @@ -2305,6 +2462,32 @@ preact "10.4.1" qrcode "1.4.4" +"@walletconnect/qrcode-modal@^1.6.5": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.6.5.tgz#58974ca8f826bd500121e85694dd342b3535cf2c" + integrity sha512-XII/Pm7zS5pRxrakURuhbWO+SfwgOuLuvOBk/hr1ATK/y7R5p19P62mCSUrvSxHXca27IX1tZJRe9D161R0WgQ== + dependencies: + "@walletconnect/browser-utils" "^1.6.5" + "@walletconnect/mobile-registry" "^1.4.0" + "@walletconnect/types" "^1.6.5" + copy-to-clipboard "^3.3.1" + preact "10.4.1" + qrcode "1.4.4" + +"@walletconnect/randombytes@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.1.tgz#87f0f02d9206704ce1c9e23f07d3b28898c48385" + integrity sha512-YJTyq69i0PtxVg7osEpKfvjTaWuAsR49QEcqGKZRKVQWMbGXBZ65fovemK/SRgtiFRv0V8PwsrlKSheqzfPNcg== + dependencies: + "@walletconnect/encoding" "^1.0.0" + "@walletconnect/environment" "^1.0.0" + randombytes "^2.1.0" + +"@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/socket-transport@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.4.1.tgz#d9b7ebb9a2843cc44cf96c880c62be78d4a1625f" @@ -2314,11 +2497,25 @@ "@walletconnect/utils" "^1.4.1" ws "7.3.0" +"@walletconnect/socket-transport@^1.6.5": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.6.5.tgz#f190f2d994021287fdeaf071114a5415096b2535" + integrity sha512-FRlgBr3EIxD3du5l/tuK6jdiva85YeRG+iZmo/RPnlVw4opy74WXb5JdCK9jXLcBEoDiY9Hz4j69aqnht6gIDQ== + dependencies: + "@walletconnect/types" "^1.6.5" + "@walletconnect/utils" "^1.6.5" + ws "7.5.3" + "@walletconnect/types@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.4.1.tgz#48297238b86f846b8c694504ca45f0059a2cca88" integrity sha512-lzS9NbXjVb5N+W/UnCZAflxjLtYepUi4ev1IeFozSvr/cWxAhEe/sjixe7WEIpYklW27kfBhKccMH/KjUoRC7w== +"@walletconnect/types@^1.6.5": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.6.5.tgz#31ad1415fc6e1e89e25a10ad5fed6958f56cefa8" + integrity sha512-S9DsODI35PbIDuOSkIiF8SzTstqCqX/4+kV7n18vyukEFPlpSSHwZMwJUfzo9yJ0pqsqLNZta+jvb88gJRuAaA== + "@walletconnect/utils@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.4.1.tgz#86108470c211a02609274a6c7bbd516c5182a22e" @@ -2332,6 +2529,19 @@ js-sha3 "0.8.0" query-string "6.13.5" +"@walletconnect/utils@^1.6.5": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.6.5.tgz#6edd749cb52a363feda117121dc865d7cc6169f7" + integrity sha512-QB5rn/1s0PKVitAQ2/mgWbay2XfN21y3ob+5g6IhxtJRW31bbMoZw5YfO6s4ixLaZZez5LNQXstvQAclRzB7jQ== + dependencies: + "@walletconnect/browser-utils" "^1.6.5" + "@walletconnect/encoding" "^1.0.0" + "@walletconnect/jsonrpc-utils" "^1.0.0" + "@walletconnect/types" "^1.6.5" + bn.js "4.11.8" + js-sha3 "0.8.0" + query-string "6.13.5" + "@walletconnect/web3-provider@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.4.1.tgz#34f6319ab2473ab9ff0fcf1e8bc280c697fa01ff" @@ -2344,6 +2554,91 @@ "@walletconnect/utils" "^1.4.1" web3-provider-engine "16.0.1" +"@walletconnect/web3-provider@^1.5.0": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.6.5.tgz#7c4ac2f89ddda1a4069d500ed29cc4396e7fdade" + integrity sha512-SeC7+1saHxvFn2wjt/3F0sTkDemHDNDbMkdZ3jtA7vjEw91Q0CmaYIuZk2UxyVM+tC1jL1l4yci/sgaFeAcXpQ== + dependencies: + "@walletconnect/client" "^1.6.5" + "@walletconnect/http-connection" "^1.6.5" + "@walletconnect/qrcode-modal" "^1.6.5" + "@walletconnect/types" "^1.6.5" + "@walletconnect/utils" "^1.6.5" + web3-provider-engine "16.0.1" + +"@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-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== + dependencies: + "@walletconnect/window-getters" "^1.0.0" + +"@web3-react/abstract-connector@6.0.7", "@web3-react/abstract-connector@^6.0.7": + version "6.0.7" + resolved "https://registry.yarnpkg.com/@web3-react/abstract-connector/-/abstract-connector-6.0.7.tgz#401b3c045f1e0fab04256311be49d5144e9badc6" + integrity sha512-RhQasA4Ox8CxUC0OENc1AJJm8UTybu/oOCM61Zjg6y0iF7Z0sqv1Ai1VdhC33hrQpA8qSBgoXN9PaP8jKmtdqg== + dependencies: + "@web3-react/types" "^6.0.7" + +"@web3-react/core@^6.1.9": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@web3-react/core/-/core-6.1.9.tgz#5f5daa0545a8ea07770a699580ced552583afc97" + integrity sha512-P877DslsbAkWIlMANpWiK7pCvNwlz0kJC0EGckuVh0wlA23J4UnFxq6xyOaxkxaDCu14rA/tAO0NbwjcXTQgSA== + dependencies: + "@ethersproject/keccak256" "^5.0.0-beta.130" + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-invariant "^1.0.6" + tiny-warning "^1.0.3" + +"@web3-react/injected-connector@^6.0.7": + version "6.0.7" + resolved "https://registry.yarnpkg.com/@web3-react/injected-connector/-/injected-connector-6.0.7.tgz#1e0be23f51fa07fe6547fe986768a46b74c3a426" + integrity sha512-Y7aJSz6pg+MWKtvdyuqyy6LWuH+4Tqtph1LWfiyVms9II9ar/9B/de4R8wh4wjg91wmHkU+D75yP09E/Soh2RA== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-warning "^1.0.3" + +"@web3-react/portis-connector@^6.1.9": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@web3-react/portis-connector/-/portis-connector-6.1.9.tgz#33216ce320d2c6d6e75d0c42c6e977b7a157ad4a" + integrity sha512-dYP1b6a1Y91t9xEu1NrlGvLwuAqYEuVfAerZtVkVf3JZ3O5TiQyVt7O7KWPPg4WsqQ8JEqOrZcE/2bmozP47mA== + dependencies: + "@portis/web3" "^2.0.0-beta.54" + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-invariant "^1.0.6" + +"@web3-react/types@^6.0.7": + version "6.0.7" + resolved "https://registry.yarnpkg.com/@web3-react/types/-/types-6.0.7.tgz#34a6204224467eedc6123abaf55fbb6baeb2809f" + integrity sha512-ofGmfDhxmNT1/P/MgVa8IKSkCStFiyvXe+U5tyZurKdrtTDFU+wJ/LxClPDtFerWpczNFPUSrKcuhfPX1sI6+A== + +"@web3-react/walletconnect-connector@^6.2.4": + version "6.2.4" + resolved "https://registry.yarnpkg.com/@web3-react/walletconnect-connector/-/walletconnect-connector-6.2.4.tgz#0a128699fc93ddac885935f4aeca32925f6285f0" + integrity sha512-IEVjCXrlcfVa6ggUBEyKtLRaLQuZGtT2lGuzOFtdbJJkN84u1++pzzeDrcsVhKAoS5wq33zyJT9baEbG1Aed8g== + dependencies: + "@walletconnect/web3-provider" "^1.5.0" + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-invariant "^1.0.6" + +"@web3-react/walletlink-connector@^6.2.3": + version "6.2.3" + resolved "https://registry.yarnpkg.com/@web3-react/walletlink-connector/-/walletlink-connector-6.2.3.tgz#d6c2c3a1b8b7e05147845ee61fa19de13db82e19" + integrity sha512-vJsXyC2NWpVrlnfgwsssDuFo3P/xCoKOjvkEjbQyQEig2aucPijwuxc58BG/YzDx4FyeeyzpnkDMLfcXFuI1pg== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + walletlink "^2.1.6" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -2867,6 +3162,167 @@ axios@^0.21.1: dependencies: follow-redirects "^1.10.0" +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" + 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.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + 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-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + 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.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + 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.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + 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.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + 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.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + 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.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + 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.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + 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.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + 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.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + 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.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + 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.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + 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.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + 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.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-loader@^8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" @@ -2877,6 +3333,20 @@ babel-loader@^8.2.2: make-dir "^3.1.0" 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 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" + 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" @@ -2918,11 +3388,355 @@ babel-plugin-polyfill-regenerator@^0.2.2: 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.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + 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" + 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" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= +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" + 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" + 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.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + 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" + 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" + 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.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + 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.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + 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.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + 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" + 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.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + 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" + 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.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + 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" + 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.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + 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.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + 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.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + 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.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + 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.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + 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.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + 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.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + 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" + 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.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + 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" + 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" + 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.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + 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-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" + 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" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +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" + 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-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + 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: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + 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.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + 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.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + 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.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + 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.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" + 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.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" @@ -3031,7 +3845,7 @@ bn.js@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.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.8.0: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -3184,6 +3998,14 @@ browserslist@*, browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, escalade "^3.1.1" node-releases "^1.1.71" +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -3252,7 +4074,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.0.5, buffer@^5.1.0, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.0.5, buffer@^5.1.0, buffer@^5.2.1, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3392,7 +4214,7 @@ cacheable-request@^7.0.1: normalize-url "^6.0.1" responselike "^2.0.0" -call-bind@^1.0.0, call-bind@^1.0.2: +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" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -3475,6 +4297,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, can resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz#45b941bbd833cb0fa53861ff2bae746b3c6ca5d4" integrity sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA== +caniuse-lite@^1.0.30000844: + version "1.0.30001252" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz#cb16e4e3dafe948fc4a9bb3307aea054b912019a" + integrity sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -3834,7 +4661,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0: +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" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3897,7 +4724,7 @@ content-type@^1.0.4, content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.7.0: +convert-source-map@^1.5.1, 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== @@ -3949,6 +4776,13 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 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" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + core-js-compat@^3.12.1, core-js-compat@^3.14.0, core-js-compat@^3.15.0: version "3.15.2" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.2.tgz#47272fbb479880de14b4e6081f71f3492f5bd3cb" @@ -3957,7 +4791,7 @@ core-js-compat@^3.12.1, core-js-compat@^3.14.0, core-js-compat@^3.15.0: browserslist "^4.16.6" semver "7.0.0" -core-js@^2.6.5: +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== @@ -4071,6 +4905,14 @@ cross-fetch@^2.1.0: node-fetch "2.1.2" whatwg-fetch "2.0.4" +cross-fetch@^2.1.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.5.tgz#afaf5729f3b6c78d89c9296115c9f142541a5705" + integrity sha512-xqYAhQb4NhCJSRym03dwxpP1bYXpK3y7UN83Bo2WFi3x1Zmzn0SL/6xGoPr+gpt4WmNrgCCX3HPysvOwFOW36w== + dependencies: + node-fetch "2.6.1" + whatwg-fetch "2.0.4" + cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -4367,7 +5209,7 @@ de-indent@^1.0.2: resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4424,6 +5266,18 @@ deep-equal@~1.0.1: resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= +deep-equal@~1.1.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" + deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" @@ -4475,7 +5329,7 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@^1.0.0: +defined@^1.0.0, defined@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= @@ -4548,6 +5402,13 @@ detect-browser@5.2.0, detect-browser@^5.1.0: resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA== +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" @@ -4686,6 +5547,13 @@ dotenv@^9.0.2: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== +dotignore@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" + 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" @@ -4695,10 +5563,10 @@ drbg.js@^1.0.1: create-hash "^1.1.2" create-hmac "^1.1.4" -dsa-connect@^0.4.4-beta.2: - version "0.4.4-beta.2" - resolved "https://registry.yarnpkg.com/dsa-connect/-/dsa-connect-0.4.4-beta.2.tgz#d26739c4d67176e7f29b08cb84ee4f510e0bb830" - integrity sha512-ZRk4OAHD0GFJW74fggNfwXCho4AdWKJdXCyGtuCxwTY7Pm1ycisa/469vD6UjcB8j2CrNDk3AsPgXs5IBmkzDQ== +dsa-connect@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/dsa-connect/-/dsa-connect-0.4.4.tgz#c47ded36b23d089c85f61bff3a781b5d577d4fe7" + integrity sha512-QSR8uiDXRwbInh2muGJfJPEK5KkMRX1Rc5wrcOL3Ov1bKkpZxQ0iSAoO3R/5OD5MV23n6vKiIa9ZX/BVId/exg== duplexer3@^0.1.4: version "0.1.4" @@ -4733,6 +5601,11 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.3.47: + version "1.3.827" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.827.tgz#c725e8db8c5be18b472a919e5f57904512df0fc1" + integrity sha512-ye+4uQOY/jbjRutMcE/EmOcNwUeo1qo9aKL2tPyb09cU3lmxNeyDF4RWiemmkknW+p29h7dyDqy02higTxc9/A== + electron-to-chromium@^1.3.723: version "1.3.779" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz#de55492a756deec63424f89fbe62aec9776f0e6d" @@ -4779,6 +5652,13 @@ encodeurl@^1.0.2, encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + 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" @@ -4938,7 +5818,7 @@ etag@^1.8.1, etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eth-block-tracker@4.4.3, eth-block-tracker@^4.4.2: +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" integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== @@ -4958,7 +5838,7 @@ eth-ens-namehash@2.0.8: idna-uts46-hx "^2.3.1" js-sha3 "^0.5.7" -eth-json-rpc-filters@4.2.2, eth-json-rpc-filters@^4.2.1: +eth-json-rpc-filters@4.2.2, eth-json-rpc-filters@^4.0.2, 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" integrity sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw== @@ -4970,6 +5850,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@^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" + 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@^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" @@ -4980,6 +5870,45 @@ 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.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f" + 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@^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" + 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.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz#4fe16928b34231a2537856f08a5ebbc3d0c31175" @@ -5018,7 +5947,7 @@ eth-lib@^0.1.26: ws "^3.0.0" xhr-request-promise "^0.1.2" -eth-query@^2.1.0, eth-query@^2.1.2: +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" integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= @@ -5047,6 +5976,18 @@ 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.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.3.tgz#6938308b38226e0b3085435474900b03036abcbe" + 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.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" @@ -5055,6 +5996,22 @@ 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.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" + 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-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" @@ -5093,6 +6050,14 @@ ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" +ethereumjs-abi@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" + 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+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" @@ -5109,7 +6074,7 @@ ethereumjs-account@^2.0.3: rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-block@^1.2.2: +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" integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== @@ -5136,7 +6101,7 @@ ethereumjs-common@^1.1.0, ethereumjs-common@^1.5.0: 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: +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" integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== @@ -5165,7 +6130,18 @@ ethereumjs-util@5.2.0: safe-buffer "^5.1.1" secp256k1 "^3.0.1" -ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5: +ethereumjs-util@^4.3.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0" + 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: version "5.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== @@ -5203,7 +6179,7 @@ ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0: ethjs-util "0.1.6" rlp "^2.2.4" -ethereumjs-vm@^2.3.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" integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== @@ -5448,6 +6424,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fetch-ponyfill@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" + 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" @@ -5571,6 +6554,13 @@ follow-redirects@^1.0.0, follow-redirects@^1.10.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== +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== + 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" @@ -5847,7 +6837,7 @@ glob-parent@^6.0.0: dependencies: is-glob "^4.0.1" -glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.1.7: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -5872,6 +6862,11 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + globby@^11.0.3: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" @@ -6042,6 +7037,13 @@ has-to-string-tag-x@^1.2.0: dependencies: has-symbol-support-x "^1.4.1" +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-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -6073,7 +7075,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.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" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -6133,6 +7135,14 @@ hoist-non-react-statics@^3.0.0: 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" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + hsl-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" @@ -6324,6 +7334,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: 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" + 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" @@ -6435,7 +7452,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, 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" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6474,6 +7491,13 @@ inquirer@^7.3.3: strip-ansi "^6.0.0" through "^2.3.6" +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -6556,6 +7580,11 @@ 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: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + is-callable@^1.1.4, is-callable@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" @@ -6644,6 +7673,11 @@ 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 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" + 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" @@ -6737,6 +7771,14 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-regex@^1.0.4, is-regex@~1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-regex@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" @@ -6762,7 +7804,7 @@ is-ssh@^1.3.0: dependencies: protocols "^1.1.0" -is-stream@^1.0.0: +is-stream@^1.0.0, is-stream@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -6896,6 +7938,11 @@ js-sha3@0.8.0, js-sha3@^0.8.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 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" + 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" @@ -6909,6 +7956,11 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -6947,6 +7999,18 @@ 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.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" + 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.3.0: version "5.4.0" resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" @@ -6955,6 +8019,13 @@ 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.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" + 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" @@ -6982,6 +8053,11 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -7297,11 +8373,21 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.castarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + integrity sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU= + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + lodash.kebabcase@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" @@ -7312,6 +8398,11 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" 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" + 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" @@ -7342,12 +8433,12 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5: +lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -7665,7 +8756,7 @@ minimatch@^3.0.4, minimatch@~3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, 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" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -7935,11 +9026,19 @@ node-fetch@2.1.2: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U= -node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@2.6.1, node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@~1.7.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-gyp-build@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" @@ -8105,7 +9204,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4, 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" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -8124,11 +9223,19 @@ object-hash@^2.2.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== -object-inspect@^1.10.3, object-inspect@^1.9.0: +object-inspect@^1.10.3, object-inspect@^1.9.0, object-inspect@~1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== +object-is@^1.0.1: + 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-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" @@ -8245,7 +9352,12 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-tmpdir@~1.0.2: +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -8465,7 +9577,7 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@1.0.1, path-is-absolute@^1.0.0: +path-is-absolute@1.0.1, 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" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -9408,6 +10520,11 @@ printj@~1.1.0: resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + 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" @@ -9791,16 +10908,30 @@ regenerate-unicode-properties@^8.2.0: dependencies: regenerate "^1.4.0" -regenerate@^1.4.0: +regenerate@^1.2.1, regenerate@^1.4.0: version "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.4, regenerator-runtime@^0.13.7: version "0.13.7" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== +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.14.2: version "0.14.5" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" @@ -9816,6 +10947,23 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp.prototype.flags@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + regexpu-core@^4.7.1: version "4.7.1" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" @@ -9828,11 +10976,23 @@ regexpu-core@^4.7.1: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.2.0" +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + regjsgen@^0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" 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" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + regjsparser@^0.6.4: version "0.6.9" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" @@ -9871,6 +11031,13 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + replace-in-file@^6.1.0: version "6.2.0" resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-6.2.0.tgz#9c0e381b0e02f27f83d5ba500bb4046f63d18566" @@ -9954,7 +11121,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.2.0, resolve@^1.20.0: +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.2.0, resolve@^1.20.0, resolve@~1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -9984,6 +11151,13 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + 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" @@ -10103,7 +11277,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"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", 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" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -10216,7 +11390,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^5.6.0: +semver@^5.3.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== @@ -10425,11 +11599,21 @@ sirv@^1.0.7: mime "^2.3.1" totalist "^1.0.0" +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slugify@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.0.tgz#6bdf8ed01dabfdc46425b67e3320b698832ff893" + integrity sha512-FkMq+MQc5hzYgM86nLuHI98Acwi3p4wX+a5BO9Hhw4JdK4L7WueIiZ4tXEobImPqBz2sVcV0+Mu3GRB30IGang== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -10495,6 +11679,13 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.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" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + source-map-support@~0.5.12, source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" @@ -10513,7 +11704,7 @@ source-map@0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= -source-map@^0.5.0, source-map@^0.5.6: +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" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -10682,6 +11873,15 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.trim@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd" + integrity sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + 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" @@ -10921,6 +12121,27 @@ tapable@^1.0.0, tapable@^1.0.0-beta.5, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" 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" + 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@^4.0.2: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" @@ -11010,7 +12231,7 @@ thread-loader@^3.0.4: neo-async "^2.6.2" schema-utils "^3.0.0" -through2@^2.0.0: +through2@^2.0.0, through2@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -11018,7 +12239,7 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6: +through@^2.3.6, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -11045,11 +12266,21 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tiny-emitter@^2.0.0: +tiny-emitter@^2.0.0, tiny-emitter@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== +tiny-invariant@^1.0.6, tiny-invariant@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -11069,6 +12300,11 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" 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" + 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" @@ -11111,6 +12347,11 @@ to-regex@^3.0.1, to-regex@^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 sha1-bkWxJj8gF/oKzH2J14sVuL932jI= + toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" @@ -11129,6 +12370,11 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + ts-loader@^8.0.17: version "8.3.0" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.3.0.tgz#83360496d6f8004fab35825279132c93412edf33" @@ -11172,11 +12418,21 @@ tunnel-agent@^0.6.0: 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" + 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" 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" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -11227,11 +12483,16 @@ ua-parser-js@^0.7.28: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== -ufo@^0.7.4, ufo@^0.7.5, ufo@^0.7.7: +ufo@^0.7.4, ufo@^0.7.5: version "0.7.7" resolved "https://registry.yarnpkg.com/ufo/-/ufo-0.7.7.tgz#0062f9e5e790819b0fb23ca24d7c63a4011c036a" integrity sha512-N25aY3HBkJBnahm+2l4JRBBrX5I+JPakF/tDHYDTjd3wUR7iFLdyiPhj8mBwBz21v728BKwM9L9tgBfCntgdlw== +ufo@^0.7.9: + version "0.7.9" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-0.7.9.tgz#0268e3734b413c9ed6f3510201f42372821b875c" + integrity sha512-6t9LrLk3FhqTS+GW3IqlITtfRB5JAVr5MMNjpBECfK827W+Vh5Ilw/LhTcHWrt6b3hkeBvcbjx4Ti7QVFzmcww== + uglify-js@^3.5.1: version "3.13.10" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.10.tgz#a6bd0d28d38f592c3adb6b180ea6e07e1e540a8d" @@ -11569,6 +12830,11 @@ vue-demi@*: resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.11.2.tgz#faa06da53887c493a695b997f4fcb4784a667990" integrity sha512-J+X8Au6BhQdcej6LY4O986634hZLu55L0ewU2j8my7WIKlu8cK0dqmdUxqVHHMd/cMrKKZ9SywB/id6aLhwCtA== +vue-demi@^0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.11.3.tgz#dd7495b92b495ecfa35675bf024b1358a7add150" + integrity sha512-DpM0TTMpclRZDV6AIacgg837zrim/C9Zn+2ztXBs9hsESJN9vC83ztjTe4KC4HgJuVle8YUjPp7HTwWtwOHfmg== + vue-hot-reload-api@^2.3.0: version "2.3.4" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" @@ -12217,6 +13483,11 @@ ws@7.3.0: resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== +ws@7.5.3, ws@^7.3.1: + version "7.5.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== + ws@^3.0.0: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" @@ -12233,11 +13504,6 @@ ws@^5.1.1: dependencies: async-limiter "~1.0.0" -ws@^7.3.1: - version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" - integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== - 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"